Cubic splinesΒΆ
For illustration, here is a spline interpolant using just a few nodes.
using FundamentalsNumericalComputation
f = x -> exp(sin(7*x))
plot(f,0,1,label="function")
t = [0, 0.075, 0.25, 0.55, 0.7, 1] # nodes
y = f.(t) # values at nodes
scatter!(t,y,label="nodes")
S = FNC.spinterp(t,y)
plot!(S,0,1,label="spline")
Now we look at the convergence rate as the number of nodes increases.
x = (0:10000)/1e4 # sample the difference at many points
n = @. round(Int,2^(3:0.5:8)) # numbers of nodes
err = zeros(0)
for n in n
t = (0:n)/n
S = FNC.spinterp(t,f.(t))
dif = @. f(x)-S(x)
push!(err,norm(dif,Inf))
end
pretty_table((n=n,error=err),backend=:html)
n | error |
---|---|
Int64 | Float64 |
8 | 0.030563368320724926 |
11 | 0.020756199827707045 |
16 | 0.005907614897266766 |
23 | 0.0013458709271774172 |
32 | 0.00036704942417364883 |
45 | 9.177847457819688e-5 |
64 | 2.1530596014285308e-5 |
91 | 5.042916653597018e-6 |
128 | 1.240124746004767e-6 |
181 | 3.0042607446212344e-7 |
256 | 7.319440786801579e-8 |
Since we expect convergence that is \(O(h^4)=O(n^{-4})\), we use a log-log graph of error and expect a straight line of slope \(-4\).
order4 = @. (n/n[1])^(-4)
plot(n,[err order4],m=[:o :none],l=[:solid :dash],label=["error" "4th order"],
xaxis=(:log10,"n"), yaxis=(:log10,"\$\\| f-S \\|_\\infty\$"),
title="Convergence of spline interpolation")