什么是三次样条插值

  插值(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的更多相关文章

  1. 平滑算法:三次样条插值(Cubic Spline Interpolation)

    https://blog.csdn.net/left_la/article/details/6347373 感谢强大的google翻译. 我从中认识到了航位推算dead reckoning,立方体样条 ...

  2. Opencv 三次样条曲线(Cubic Spline)插值

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47707679 1.样条曲线简介 样条曲 ...

  3. java 三次样条插值 画光滑曲线 例子

    java 三次样条插值 画光滑曲线 例子 主要是做数值拟合,根据sin函数采点,取得数据后在java中插值并在swing中画出曲线,下面为截图  不光滑和光滑曲线前后对比:    代码: 执行类: p ...

  4. 使用Cubic Spline通过一组2D点绘制平滑曲线

    原文Draw a smooth curve through a set of 2D points with Cubic Spline I would like to provide you with ...

  5. 三次样条插值matlab实现

    三次样条插值matlab实现 %三次样条差值-matlab通用程序 - zhangxiaolu2015的专栏 - CSDN博客 https://blog.csdn.net/zhangxiaolu201 ...

  6. spline interpolation and draw image by matplotlib

    1 # spline interpolation and draw image by matplotlib from scipy import interpolate import matplotli ...

  7. 井眼轨迹的三次样条插值 (vs + QT + coin3d)

    井眼轨迹数据的测量值是离散的,根据某些测斜公式,我们可以计算出离散的三维的井眼轨迹坐标,但是真实的井眼轨迹是一条平滑的曲线,这就需要我们对测斜数据进行插值,使井眼轨迹变得平滑,我暂时决定使用三次样条进 ...

  8. 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" ...

  9. 数值计算方法实验之按照按三弯矩方程及追赶法的三次样条插值 (MATLAB 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

随机推荐

  1. 使用 bash 脚本把 GCE 的数据备份到 GCS

    目录 一.Google Cloud Storge 介绍 1.1.四种存储类别的比较 1.2.需求 1.3.给虚拟机添加授权认证 二.备份操作 2.1 创建存储分区 2.2 上传对象到存储分区 2.3 ...

  2. Docker二

    Docker生成镜像的两种方式 有时候从Docker镜像仓库中下载的镜像不能满足要求,我们可以基于一个基础镜像构建一个自己的镜像 两种方式: 更新镜像:使用docker commit命令 构建镜像:使 ...

  3. 360安全卫士11.0史上最小版发布,去流氓,最精简,300MB内存轻松运行。完全不拖慢电脑的速度,由王宁诚意发布。

    360安全卫士11.0史上最小版发布,也是史上最快版本.大家可能都不喜欢360,为什么?因为360太流氓,而大家想过如果360去掉了流氓会怎么样?对,那样360就会变成一个性能可以超过知名杀毒软件-s ...

  4. leetcode907 Sum of Subarray Minimums

    思路: 对于每个数字A[i],使用单调栈找到A[i]作为最小值的所有区间数量,相乘并累加结果.时间复杂度O(n). 实现: class Solution { public: int sumSubarr ...

  5. Cron 表达式学习

    1.7个子域的说明 cron 的表达式是字符串,实际上是由七子表达式(从左到右),描述个别细节的时间表.这些子表达式是分开的空白. 顺序(从左到右) 子串 有效数字 有效字符 1 Seconds(秒) ...

  6. innodb事务锁的一些常见数据结构

    lock_sys_t 整个innodb的锁系统管理结构体,定义在lock0lock.h中.在lock0lock.cc中有一个lock_sys_t的全局指针lock_sys, 由lock_sys_cre ...

  7. pycharm2017注册码

    BIG3CLIK6F-eyJsaWNlbnNlSWQiOiJCSUczQ0xJSzZGIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  8. Mac/Windows 跳过sourcetree的注册环节

      前几天在电脑上装了个sourcetree,结果它硬要我注册,烦得很.   于是查了一下怎么跳过注册环节,结果还真有,试了一下,真给力!   特此记录. MAC版本: 打开sourcetree 关闭 ...

  9. odoo12安装指南

    声明:本指南默认已安装好Python3和pycharm及postgresql,odoo12的源码包 一. 1.在pycharm创建一个新的项目 建议创建在虚拟环境中 2.在pycharm的控制台下检验 ...

  10. C# DataTable映射成Entity

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...