一、插值和样条?
给定若干已知点位,连接、逼近这些点位的方式有很多种,我们既可以给定一个足够阶数的多项式一次性穿过、逼近这些点位,这些方法可以是:牛顿插值法、拉格朗日插值法;也可以按段给出每个区间的表达式,比如说三次样条。
上面展示的就是按段给出的表达式,按段一条条给出的,所以叫做样条。当然你也可以用一个多项式穿过这些点:
红色的线就是用一个多项式连接的方法。用一个多项式拟合所有的点位不都是好的,尤其是均匀分布的插值点两端因为它会产生龙格现象:
从上图可以看出,左右两端的拟合对于原函数完全不匹配。缓解方法有很多种,可以使用切比雪夫或者分段三次样条进行处理。也就是文章的重点,分段三次多项式样条。
二、分段三次样条(自然边界条件)
样条的表达式是通过多个分段函数给出的,约束条件有:
- 满足节点自变量递增关系;
- 相邻多项式之间一二阶导数连续;
- 多项式的次数是3次;
如果每相邻两个点之间的连线是三次多项式,那么对应的整段组合而成的曲线就叫做三次样条函数。假设点数是 n + 1 n+1 n+1,那么段数为: n n n
- 三次多项式有四个未知数,一共有 n n n 个,所以待求的方程组个数为 4 n 4n 4n;
- 一共有 n + 1 n+1 n+1 个点,我已有 ( n + 1 ) (n+1) (n+1) 个方程组,这样一来我就剩下 4 n − ( n + 1 ) = 3 n − 1 4n-(n+1)=3n-1 4n−(n+1)=3n−1;
- 一共有 n − 1 n-1 n−1 个衔接点,衔接点处函数值连续、一阶导连续,二阶导连续,提供 3 ( n − 1 ) 3(n-1) 3(n−1)个方程,剩余 3 n − 1 − 3 ( n − 1 ) = 2 3n-1-3(n-1)=2 3n−1−3(n−1)=2
根据不同的约束可以将三次样条分为三类:
- 端点处二阶导函数值约束,如果都是0,则为自然样条;
- 端点处一阶导数约束;
- 周期约束,略;
给定以下插值点:
x x x | t 0 t_0 t0 | t 1 t_1 t1 | ⋯ \cdots ⋯ | t n t_n tn |
---|---|---|---|---|
y y y | y 0 y_0 y0 | y 1 y_1 y1 | ⋯ \cdots ⋯ | y n y_n yn |
根据这个表格结合三次样条多项式的定义:
S ( x ) = { S 0 ( x ) x ∈ [ t 0 , t 1 ] S 1 ( x ) x ∈ [ t 1 , t 2 ] ⋮ S n − 1 ( x ) x ∈ [ t n − 1 , t n ] S(x)=\left\{ \begin{aligned} &S_0(x)\quad x\in[t_0,t_1]\\ &S_1(x)\quad x\in[t_1,t_2]\\ &\vdots\\ &S_{n-1}(x)\quad x\in[t_{n-1},t_n]\\ \end{aligned} \right. S(x)=⎩
⎨
⎧S0(x)x∈[t0,t1]S1(x)x∈[t1,t2]⋮Sn−1(x)x∈[tn−1,tn]
在此之前我们先来推导区间 [ t i , t i + 1 ] [t_i,t_{i+1}] [ti,ti+1] 上 S i ( x ) S_i(x) Si(x) 的表达式。首先我们定义一组数 z i = S ′ ′ ( t i ) z_i=S''(t_i) zi=S′′(ti),因为 S ′ ′ S'' S′′ 在每个内结点上连续,所以显然,对于 0 ≤ i ≤ n 0\le i\le n 0≤i≤n 存在 z i z_i zi 满足:
lim x → t i + S ′ ′ ( x ) = lim x → t i − S ′ ′ ( x ) \lim_{x\rightarrow t_i^+}S''(x)=\lim_{x\rightarrow t_i^-}S''(x) x→ti+limS′′(x)=x→ti−limS′′(x)
因为 S i S_i Si 是在 [ t i , t i + 1 ] [t_i,t_{i+1}] [ti,ti+1] 上的三次多项式,因此是满足 S i ′ ′ ( t i ) = z i S''_i(t_i)=z_i Si′′(ti)=zi、 S i ′ ′ ( t i + 1 ) = z i + 1 S''_i(t_{i+1})=z_{i+1} Si′′(ti+1)=zi+1 的线性函数,根据根据拉格朗日插值法有:
S i ′ ′ ( x ) = z i h i ( t i + 1 − x ) + z i + 1 h i ( x − t i ) S''_i(x)=\frac{z_i}{h_i}(t_{i+1}-x)+\frac{z_{i+1}}{h_i}(x-t_i) Si′′(x)=hizi(ti+1−x)+hizi+1(x−ti)
其中 h i = t i + 1 − t i h_i=t_{i+1}-t_i hi=ti+1−