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