In [13]:
# generating data

type point
    x::Float64
    y::Float64
end

data = Vector(5)
x = [-20.0 -10.0 0.0 10.0 20.0]
for i = 1:5
    data[i] = point(x[i], tan(x[i]))
end
In [11]:
# Lagrange interpolation

function Lagrange(v, d)
    Q = 0
    for j=1:length(d)
        Q = Q + d[j].y*L(v,d,j)
    end
    return Q
end

function L(v, d, j)
    l = 1
    for i=1:length(d)
        if i != j
           l = l * ((v-d[i].x)/(d[j].x-d[i].x)) 
        end
    end
    return l
end
Out[11]:
L (generic function with 1 method)
In [15]:
# Newton interpolation
function Newton(v, d)
    Q = d[1].y
    for j=2:length(d)
        Q = Q + divdiff(d[1:j])*(v-d[j-1].x)
    end
    return Q
end

function divdiff(d)
    if length(d) == 1
        return d[1].y
    else
        return (divdiff(d[2:end])-divdiff(d[1:end-1]))/(d[end].x-d[1].x)
    end
end
Out[15]:
divdiff (generic function with 1 method)
In [22]:
# testing

lagIsBetter = 0
newIsBetter = 0
equal       = 0

for x=-10.0:0.5:10.0
    tanx = tan(x)
    lagx = Lagrange(x, data)
    newx = Newton(x, data)
    if abs(tanx-lagx) < abs(tanx-newx)
        lagIsBetter += 1
    elseif abs(tanx-lagx) > abs(tanx-newx)
        newIsBetter += 1
    elseif abs(abs(tanx-lagx) - abs(tanx-newx)) < 1e-10
        equal += 1
    end
end

println("Number of times Lagrange is more accurate ", lagIsBetter)
println("Number of times Newton is more accurate ", newIsBetter)
println("Number of times Lagrange and Newton are equivalent ", equal)
Number of times Lagrange is more accurate 24
Number of times Newton is more accurate 17
Number of times Lagrange and Newton are equivalent 0
In [ ]: