三次样条插值 cubic spline interpolation
什么是三次样条插值
插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线,
然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量范围内)。
样条(spline)是软尺(elastic ruler)的术语说法,在技术制图中,使用软尺连接两个相邻数据点,
以达到连接曲线光滑的效果。
样条插值是一种分段多项式(piecewise polynomial)插值法。数学上,曲线光滑需要在曲线上处处一阶导连续,
因此,在节点处需要满足一阶导数相等。另外,为了使得曲线的曲率最小,要求曲线二阶导连续【1】,
在节点处需要二阶导相等。
三次及以上多项式可以满足节点处光滑和曲率最小要求,但是次数高的曲线容易震荡,因此,就选用三次多项式即可。
数学表述
假设有n个已知节点:
函数关系记为: 。
在区间 中插值多项式曲线:
注意,这里头曲线为,尾曲线为
。
插值在节点处满足条件:
(1)曲线经过节点:
(2)曲线一阶导连续(光滑):
(3)曲线二阶导连续(曲率最小):
边界条件:对两端节点的约束。
(B1)自然(natural (or free))边界条件
(B2)固定(clamped)边界条件
固定一阶导数:
,
固定二阶导数:
,
(B3)非节点边界(not-a-knot )
要求在第二个节点 和倒数第二个节点
,曲线的三阶导也连续:
三次多样式函数的计算
样条函数采用n-1个三次多项式,每个三次多项式有4个参数,一共是4n-4个参数,
因此需要4n-4个方程。
条件(1)n-1个曲线每个两端经过节点,提供2(n-1)=2n-2个方程;
条件(2)n-1个曲线相邻一阶导连续,提供n-2个方程;
条件(3)n-1个曲线相邻二阶导连续,提供n-2个方程;
以上一共是4n-6个方程,还需要2个方程,这两个方程由边界条件提供,条件(B1), (B2), (B3)
每个均提供2个方程,这样就凑够了4n-4个方程。
计算的例子
n个节点,n-1条曲线。在区间 内,令第i条曲线为:
一二三阶导分别为:
一阶:
二阶:
三阶:
接下来,套用节点条件和边界条件:
先假设相邻节点横纵坐标的差值分别为: ,
。
条件(1):曲线 已经满足第一个式子:
;
第二式 :
(I)
条件(2):
(II)
条件(3):
(III)
边界条件以非节点(Not-A_Knot)条件为例, 得:
(IV) ,
联立方程(I)和(II), 分别消去 和
得:
,
带入方程(III)得:
(V)
这里i的最大值应该取不到n-3,当i=n-3时,上式左边将出现 ,而参数a的范围是从0到n-2,
所以不存在这项,此式一共是n-2个方程。
另外,方程(II)和(III)都不支持 ,需要单独计算
:
由方程(I),(III)分别有:
=>
由边界条件方程(IV)中的 得:
方程(V)取i=0有:
与上式联立消去,得:
(VI)
另由 得:
(VII)
方程(V), (VI), (VII)联立,n-1个方程,n-1个未知数(),参数a得解,然后在算出参数b和c即可。
References:
[1] Wikipedia: spline interpolation
三次样条插值 cubic spline interpolation的更多相关文章
- 平滑算法:三次样条插值(Cubic Spline Interpolation)
https://blog.csdn.net/left_la/article/details/6347373 感谢强大的google翻译. 我从中认识到了航位推算dead reckoning,立方体样条 ...
- Opencv 三次样条曲线(Cubic Spline)插值
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47707679 1.样条曲线简介 样条曲 ...
- java 三次样条插值 画光滑曲线 例子
java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图 不光滑和光滑曲线前后对比: 代码: 执行类: p ...
- 使用Cubic Spline通过一组2D点绘制平滑曲线
原文Draw a smooth curve through a set of 2D points with Cubic Spline I would like to provide you with ...
- 三次样条插值matlab实现
三次样条插值matlab实现 %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu201 ...
- spline interpolation and draw image by matplotlib
1 # spline interpolation and draw image by matplotlib from scipy import interpolate import matplotli ...
- 井眼轨迹的三次样条插值 (vs + QT + coin3d)
井眼轨迹数据的测量值是离散的,根据某些测斜公式,我们可以计算出离散的三维的井眼轨迹坐标,但是真实的井眼轨迹是一条平滑的曲线,这就需要我们对测斜数据进行插值,使井眼轨迹变得平滑,我暂时决定使用三次样条进 ...
- uniapp属性插值报错Interpolation inside attributes has been removed. Use v-bind or the colon shorthand instead.
解决方法: 因为vue 2.x不支持对属性使用插值{{}}的方式赋值,所以要使用v-bind指令(或简写“:”)来指定属性. v-bind指令 v-bind:id="item.id" ...
- 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)
一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...
随机推荐
- [转]德哥的PostgreSQL私房菜 - 史上最屌PG资料合集
链接地址:https://yq.aliyun.com/articles/59251
- 【leetcode】506. Relative Ranks
problem 506. Relative Ranks solution1:使用优先队列: 掌握priority_queue 和 pair的使用: class Solution { public: v ...
- DataFrame执行groupby聚合操作后,如何继续保持DataFrame对象而不变成Series对象
刚接触pandas不久,在处理特征时,碰到一个恶心的问题:用groupby聚合后,之前的dataframe对象变成了series对象,聚合的字段变成了索引index,导致获取这些字段时很麻烦,后面发现 ...
- Unity学习笔记_控制人物移动+摄像机跟随
我想做的移动操作方式类似[流星蝴蝶剑].[龙之谷].[我的世界第三人称]的第三人称操作方式. 操作说明:W键会朝当前镜头方向前进,鼠标控制镜头旋转. 做前需知(先去稍微了解一下比较好): ①unity ...
- 卸载未能成功安装的mysql时的解决方案
在win10系统中,首次未能成功安装mysql,于是试图卸载了mysql相关的应用,结果提示有卸载未完成的应用,无法卸载, 在阅读文档之后发现,可以在任务管理器中的详细信息中找到[dllhost.ex ...
- 《剑指offer》Q13-18 (牛客10.13)
目录 Q13 调整数组顺序使奇数位于偶数前 Q14 链表中倒数第k个结点 Q15 反转链表 Q16 合并两个有序链表 Q17 树的子结构 Q18 二叉树的镜像 Q13 调整数组顺序使奇数位于偶数前 输 ...
- vue项目中兼容ie8以上浏览器的配置
1.首先需要在根目录的index.html文件加入如下代码 <meta http-equiv="X-UA-Compatible" content="IE=edge& ...
- d3学习之路
d3学习历程: 轻量化编译器:HbuiderXHbuiderX使用教程 理解HTMl js CSS 三者关系 学习html js css :1)w3school 2)moo ...
- 3rd.botan
1.HOME 1.官网:https://botan.randombit.net/ Win下 编译步骤:https://botan.randombit.net/handbook/building.htm ...
- 最新 唯品会java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.唯品会等10家互联网公司的校招Offer,因为某些自身原因最终选择了唯品会.6.7月主要是做系统复习.项目复盘.LeetCo ...