三次样条函数(cubic spline functions)的插值求解(python,数值积分)

第三十七篇 三次样条函数的插值求解

利用三次样条函数进行插值

到目前为止,描述的两种插值方法拉格朗日多项式正向差分会形成高阶的多项式,但一般情况下,选择阶数的值等于小于数据点的数目更合适。除了考虑计算的复杂程度外,高阶多项式还会导致给定数据点之间出现不需要的极大值和极小值。所以另一种类型的插值方法以“分段”的方式从点到点拟合低阶多项式。多项式的阶数可以由我们自己决定。如果多项式被选择为线性,则数据点只是由直线连接,在每个直线相互连接的点上都有“角”。在工程应用中,如果有许多数据点紧密地聚集在一起,那么线性函数的不连续性质可能不是问题。
最常用的分段多项式方法是在相邻点之间拟合三次函数,这种方法能够保持结点处的二阶导数连续性。这种三次多项式通常被称为“样条函数”,因为插值函数可以被视为一个柔性弹性梁(或样条),最初是直的,通过所需的点(xi, yi), i = 0,1,…,产生变形。
一般来说,如果有np点,则需要n个三次样条函数(其中n = np−1),可以写成这样的形式
在这里插入图片描述
4n个未知系数Aji可以由以下4n个条件确定:

  1. 三次方必须在保证相同点的数据一致性,从而得到2n方程
    在这里插入图片描述
  2. 一阶导数必须在所有内点上是连续的,从而得到n - 1方程。
    . 在这里插入图片描述
    3 二阶导数也必须在所有内部点上连续,导致进一步的n - 1方程。
    在这里插入图片描述
  3. 最后两个条件指的是样条的两端,其中二阶导数被设为零,因此
    在这里插入图片描述
    .最终边界条件类比“结构”的形式,表明了“梁”两端的弯矩为零。
    虽然4n个未知数的4n个方程可以求解得到所需的系数,但结合了条件1和3。可以得到的原三次函数的拓展形式为
    在这里插入图片描述
    式中I = 1,2,…,n, xi−1≤x≤xi, Δxi−1 = xi−xi−1,这与之前使用的“正向差法”表示法相同。
    上面方程的微分和条件2关于一阶导数连续性的使用,得到
    在这里插入图片描述
    式中I = 1,2,…,n−1,Δyi−1 = yi−yi−1。
    它等价于n - 1个线性方程组在已知点的二阶导数未知,如下所示
    在这里插入图片描述
    系数矩阵是对称的三对角的。一旦二阶导数f(xi), i = 1,2,…,n−1被计算出来,可以结合边界条件f(x0) = f(xn) = 0,求出方程中的所有三次函数。
    为了得到对应于特定值x的y的估计值,首先必须通过观察x相对于原始数据点xi, i = 0,1,…,n的位置来确定使用哪个三次函数。一旦找到使用哪个函数,f‘’(xi)和f‘’(xi−1)的计算值可以代入方程,计算所需点的函数值。

计算实例

给与下面四个点,使用三次样条函数去计算x=1.3时的y值
在这里插入图片描述
在这个例子中,将有三个三次样条分布在四个坐标上。我们假设在x = 0.0和x = 2.3处的二阶导数为零,因此在x = 1.0和x = 1.5处还有两个二阶导数。
从上面方程可以写成下面的形式
在这里插入图片描述
需要的正向差分项求出在下表中
在这里插入图片描述
替换之后,得到方程为
在这里插入图片描述
很容易解出得到
在这里插入图片描述
这样,全部的二阶导就都知道了,分别为f‘’(0) = 0, f’’(1) = −3.2364, f’’(1.5) = 6.2185 and f’’(2.3) = 0,
因此从上面的式子可以求得三次样条函数,展示在下图中
在这里插入图片描述
在x = 1.3处进行插值,它位于三次样条函数f2(x)的1.0到1.5范围之间,设置i=2,由上面的方程得到
在这里插入图片描述
因此
在这里插入图片描述
得到
在这里插入图片描述

程序如下

其中有一个主程序,和两个子程序,分别为天际线矩阵的乔列斯基分解子程序sparin,和一个逆向迭代求解的子程序spabac。详情可见以天际线存储矩阵的乔列斯基分解

#三次样条函数的插值求解
import B
import numpy as np1
np=5;xi=6.5
diffx=np1.zeros((np-1),dtype=np1.float)
diffy=np1.zeros((np-1),dtype=np1.float)
kdiag=np1.zeros((np-2),dtype=np1.int64)
kv=np1.zeros((2*(np-2)-1))<
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深渊潜航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值