三次样条插值三弯矩matlab_三次样条(cubic spline)插值

当已知某些点而不知道具体方程时候,最经常遇到的场景就是做实验,采集到数据的时候,我们通常有两种做法:拟合或者插值。拟合不要求方程通过所有的已知点,讲究神似,就是整体趋势一致。插值则是形似,每个已知点都必会穿过,但是高阶会出现龙格库塔现象,所以一般采用分段插值。今天我们就来说说这个分段三次样条插值。

顾名思义,分段就是把区间[a,b]分成n个区间

,共有n+1个点,其中两个端点
。三次样条就是说每个小区间的曲线是一个三次方程,三次样条方程满足以下条件:

1,在每个分段小区间

上,
都是一个三次方程

2,满足插值条件,即

3, 曲线光滑,即

连续

则这个三次方程可以构造成如下形式:

这种形式,我们称这个方程为三次样条函数

可以看出每个小区间有四个未知数
,有n个小区间,则有4n个未知数,要解出这些未知数,则我们需要4n个方程来求解。

求解

我们要找出4n个方程来求解4n个未知数

首先,由于所有点必须满足插值条件,

,除了两个端点,所有n-1个内部点的每个点都满足
前后两个分段三次方程,则有2(n-1)个方程,再加上两个端点分别满足第一个和最后一个三次方程,则总共有2n个方程;

其次,n-1个内部点的一阶导数应该是连续的,即在第 i 区间的末点和第 i+1 区间的起点是同一个点,它们的一阶导数应该也相等,即

则有n-1个方程

另外,内部点的二阶导数也要连续,即

,也有n-1个方程

现在总共有4n-2个方程了,还差两个方程就可以解出所有未知数了,这两个方程我们通过边界条件得到。

有三种边界条件:自然边界,固定边界,非节点边界

1,自然边界 ( Natural Spline ):指定端点二阶导数为0,

2, 固定边界 ( Clamped Spline ): 指定端点一阶导数,这里分别定为A和B。即

3, 非扭结边界( Not-A-Knot Spline ): 强制第一个插值点的三阶导数值等于第二个点的三阶导数值,最后第一个点的三阶导数值等于倒数第二个点的三阶导数值. 即

具体推导

equation?tex=%5Cbegin%7Baligned%7D+S_%7Bi%7D%28x%29+%26%3Da_%7Bi%7D%2Bb_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29%2Bc_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29%5E%7B2%7D%2Bd_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29%5E%7B3%7D+%5C%5C+S_%7Bi%7D%5E%7B%5Cprime%7D%28x%29+%26%3Db_%7Bi%7D%2B2+c_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29%2B3+d_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29%5E%7B2%7D+%5C%5C+S_%7Bi%7D%5E%7B%5Cprime+%5Cprime%7D%28x%29+%26%3D2+c_%7Bi%7D%2B6+d_%7Bi%7D%5Cleft%28x-x_%7Bi%7D%5Cright%29+%5Cend%7Baligned%7D

1, 由

可得

2,用

表示步长,由
推出

3,由

推出

equation?tex=%5Cbegin%7Barray%7D%7Bl%7D%7BS_%7Bi%7D%5E%7B%5Cprime%7D%5Cleft%28x_%7Bi%2B1%7D%5Cright%29%3Db_%7Bi%7D%2B2+c_%7Bi%7D%5Cleft%28x_%7Bi%2B1%7D-x_%7Bi%7D%5Cright%29%2B3+d_%7Bi%7D%5Cleft%28x_%7Bi%2B1%7D-x_%7Bi%7D%5Cright%29%5E%7B2%7D%3Db_%7Bi%7D%2B2+c_%7Bi%7D+h%2B3+d_%7Bi%7D+h%5E%7B2%7D%7D+%5C%5C+%7BS_%7Bi%2B1%7D%5E%7B%5Cprime%7D%5Cleft%28x_%7Bi%2B1%7D%5Cright%29%3Db_%7Bi%2B1%7D%2B2+c_%7Bi%7D%5Cleft%28x_%7Bi%2B1%7D-x_%7Bi%2B1%7D%5Cright%29%2B3+d_%7Bi%7D%5Cleft%28x_%7Bi%2B1%7D-x_%7Bi%2B1%7D%5Cright%29%5E%7B2%7D%3Db_%7Bi%2B1%7D%7D%5Cend%7Barray%7D

可得

4,由

推出

改写为

可得

5,现在

都可以表示成二阶导的关系式,将其代入到
可得

6,将

代入
可得

这样我们可以构造一个以m为未知数的线性方程组。

1)在自然边界条件时,

三次样条插值三弯矩matlab_三次样条(cubic spline)插值_第1张图片

三次样条插值三弯矩matlab_三次样条(cubic spline)插值_第2张图片

可以看出,左侧的系数矩阵为严格对角占优矩阵。即:每一行中对角元素的值的模 > 其余元素值的模之和。故线性方程组有唯一解,且雅克比迭代法、高斯-赛德尔迭代法和0<ω≤1的超松弛迭代法均收敛。

2)在夹持边界条件时,

equation?tex=%5Cbegin%7Baligned%7D+S_%7B0%7D%5E%7B%5Cprime%7D%5Cleft%28x_%7B0%7D%5Cright%29%3DA+%26+%5CLongrightarrow+%5Cquad+b_%7B0%7D%3DA+%5C%5C+%26+%5CLongrightarrow+A%3D%5Cfrac%7By_%7B1%7D-y_%7B0%7D%7D%7Bh_%7B0%7D%7D-%5Cfrac%7Bh_%7B0%7D%7D%7B2%7D+m_%7B0%7D-%5Cfrac%7Bh_%7B0%7D%7D%7B6%7D%5Cleft%28m_%7B1%7D-m_%7B0%7D%5Cright%29+%5C%5C+%26+%5CLongrightarrow+2+h_%7B0%7D+m_%7B0%7D%2Bh_%7B0%7D+m_%7B1%7D%3D6%5Cleft%5B%5Cfrac%7By_%7B1%7D-y_%7B0%7D%7D%7Bh_%7B0%7D%7D-A%5Cright%5D+%5Cend%7Baligned%7D

将上述两个公式带入方程组,新的方程组左侧为

三次样条插值三弯矩matlab_三次样条(cubic spline)插值_第3张图片

3)在非扭结边界条件时,

equation?tex=%5Cbegin%7Barray%7D%7Bl%7D%7BS_%7B0%7D%5E%7B%5Cprime+%5Cprime+%5Cprime%7D%5Cleft%28x_%7B0%7D%5Cright%29%3DS_%7B1%7D%5E%7B%5Cprime+%5Cprime+%5Cprime%7D%5Cleft%28x_%7B1%7D%5Cright%29%7D+%5C%5C+%7BS_%7Bn-2%7D%5E%7B%5Cprime+%5Cprime+%5Cprime%7D%5Cleft%28x_%7Bn-2%7D%5Cright%29%3DS_%7Bn-1%7D%5E%7B%5Cprime+%5Cprime+%5Cprime%7D%5Cleft%28x_%7Bn-1%7D%5Cright%29%7D%5Cend%7Barray%7D

由于

,并且

新的方程组系数矩阵可写为:

三次样条插值三弯矩matlab_三次样条(cubic spline)插值_第4张图片

下图可以看出不同的端点边界对样条曲线的影响:

三次样条插值三弯矩matlab_三次样条(cubic spline)插值_第5张图片

算法总结

假定有n+1个数据节点

1,计算步长

2,将数据节点和指定的首位端点条件带入矩阵方程

3,解矩阵方程,求得二次微分值

。该矩阵为三对角矩阵,常见解法为高斯消元法,可以对系数矩阵进行LU分解,分解为单位下三角矩阵和上三角矩阵。即

4,计算样条曲线的系数:

5,在每个子区间

中,创建方程

参考:

https://www.cnblogs.com/flysun027/p/10371726.html

https://www.cnblogs.com/xpvincent/archive/2013/01/26/2878092.html

你可能感兴趣的:(三次样条插值三弯矩matlab)