一、引入
上一篇提到插值多项式,几次函数就称为几次样条函数如,
二次样条函数为:f(x) = a*x^2 + b*x + c
三次样条函数为:f(x) = a*x^3 + b^x^2 + c*x +d
x=[1,3,5,7,9];
y=[2,4,6,8,10];有5个节点,4个区间
对于二次样条函数,需要求4*3 = 12个参数,根据已知端点(1,5):2个方程;中间曲线方程在节点处的值必须相等(2,3,4):3*2 = 6个方程;中间节点处的一阶导数的值必须相等(2,3,4):3个方程;假设第一个方程的二阶导数为0,即a1=0,1个方程;一共 2+6+3+1=12个方程。
对于三次样条函数4*4=16个参数,也就是找出16个方程就解决了问题,除与上面相同外,中间的二阶导相等,3个方程,假设第一个方程的二阶导数为0,即a1=0,b1=0,2个方程,一共16个方程。
二、原理
简而言之,就是依然对每一个小区间进行插值(每一个区间都是一个三次多项式),但是我们不需要依赖于导数的已知;由于我们要做的就是使得端点出满足某种条件的光滑(一般来说,三次样条插值就是要满足二阶导数连续),根据这个要求,我们就可以在未知导数的情况下推导出样条函数。具体方法看下面
样条函数确定:
N个区间上,每个区间求三次样条插值函数,显然一共需要4n个条件
依然按照第一部分的方法,对中间点区间段,端点,这里分为对中间的节点部分显示条件,隐式条件
1. 显式条件:
则n个区间各有2个条件,共2n个。
2. 隐式条件:
三次样条插值,一次导数连续且二次导数连续,即满足:
这样,n个区间可以找出n-1对导数相等条件。至此,可以找出2n+2(n-1) = 4n-2个条件。
3. 边界条件:
一般来说,在整个插值区间[a,b]上,会对边界[a,b]端点有状态的要求。这就是边界条件,有了这两个边界条件,就得到了需要的4n个条件。
边界条件一般有三种:
1) 一阶条件
即,给出端点处的一阶导数值。
2) 二阶条件
即,给出端点处的二阶导数值。
3) 循环(周期)条件
即,f(x)是一个周期函数时,端点a,b处的一阶导数值、二阶导数值分别相等。
具体解法:
设分段样条函数s(x)在0到n个节点处的二阶导数值,为:
积分,得:每一区间上的样条函数 :
对于引入的两个常数c1,c2,使用两个边界条件,自然可以求解得到:
对所有区间,整理后得到关于Mj-1,Mj,Mj+1的方程:
其中:
这称作“三弯矩方程”。
最终,由着n-1个方程,再加两个边界条件(这里我使用一阶条件),直接带入,联立n+1个方程,得到:
至此,样条插值变为求解此矩阵形式的方程组。
可以看到,系数矩阵严格对角占优,矩阵可逆,方程组存在唯一解,从而可以解出M0…Mn。而此方程组的解法并不困难,计算非常快捷
三、三次样条插值总结
根据上述求解系数方程总结为矩阵形式
算法总结
参考:
三次样条插值: https://blog.csdn.net/flyingleo1981/article/details/53008931/