# 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
# 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
# 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
# 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)