分段三次样条

一、插值和样条?

给定若干已知点位,连接、逼近这些点位的方式有很多种,我们既可以给定一个足够阶数的多项式一次性穿过、逼近这些点位,这些方法可以是:牛顿插值法、拉格朗日插值法;也可以按段给出每个区间的表达式,比如说三次样条。
请添加图片描述
上面展示的就是按段给出的表达式,按段一条条给出的,所以叫做样条。当然你也可以用一个多项式穿过这些点:

请添加图片描述

红色的线就是用一个多项式连接的方法。用一个多项式拟合所有的点位不都是好的,尤其是均匀分布的插值点两端因为它会产生龙格现象:

请添加图片描述

从上图可以看出,左右两端的拟合对于原函数完全不匹配。缓解方法有很多种,可以使用切比雪夫或者分段三次样条进行处理。也就是文章的重点,分段三次多项式样条。

二、分段三次样条(自然边界条件)

样条的表达式是通过多个分段函数给出的,约束条件有:

  • 满足节点自变量递增关系;
  • 相邻多项式之间一二阶导数连续;
  • 多项式的次数是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)=3n1
  • 一共有 n − 1 n-1 n1 个衔接点,衔接点处函数值连续、一阶导连续,二阶导连续,提供 3 ( n − 1 ) 3(n-1) 3(n1)个方程,剩余 3 n − 1 − 3 ( n − 1 ) = 2 3n-1-3(n-1)=2 3n13(n1)=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]Sn1(x)x[tn1,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 0in 存在 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) xti+limS′′(x)=xtilimS′′(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+1x)+hizi+1(xti)

其中 h i = t i + 1 − t i h_i=t_{i+1}-t_i hi=ti+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值