数值计算 --- 三次样条函数插值(Cubic spline function interpolation)

2023-11-15

             三次样条函数插值(Cubic spline function interpolation)

Part I   插值

预备知识: 什么是插值?
         已知部分离散的数据,但不知道满足这些数据的函数表达式,插值(和拟合)都是为了找到对应的函数表达式。区别在于,插值函数能够穿过已知点,拟合只求函数图形神似而不求穿过已知点。

所谓插值,就是要根据已知点的数值,去计算未知点的数值。下面我非常简略的列出来一些常见的插值方法。

假设我们有这样如下列表,它给出了某个未知函数的一些已知点(事实上这些已知点来自于对一段正弦函数的采样)

要想知道 x=2.5 时的值,我们需要找到一个插值函数,使得这个函数在未知点上插出来的值更准确,更合理,更加接近真实值

例如:

1,最近邻域插值  --->  f(2.5) = 0.2305

 2,线性插值  --->  f(2.5) = 0.5251

3,多项式插值

3阶: 函数不过所有的数据点,f(2.5) = 0.501

4阶: 函数不过所有的数据点,f(2.5) = 0.5306

5阶:当多项式的阶数达到5阶后,函数过所有的数据点,f(2.5) = 0.5954

6阶:函数过所有的数据点,f(2.5) = 0.5964

如果我们继续增加多项式的阶数呢?数据不够了!

        前面我们求解6阶多项式系数的时候,正好是7个未知数,7个方程,现在我们要求解的7阶多项式有8个未知数呢。

        根据上面的实验,我们看到,从最近邻域插值,到线性插值,再到多项式插值(5阶和6阶),都穿过了所有已知点,且插值精度越来越高,越来越合理。但,多项式插值会有两个问题。

1,随着多项式的阶数越来越高,计算量也越来越大。

2,随着多项式的阶数越来越高,插值精度并不会越来越高,恰恰相反,函数曲线会出现剧烈的振荡,即,龙格现象。

PS:龙格现象(Runge)

        1901年,Carl David Tolmé Runge意外地发现,用差值插值多项式逼近函数f(x)=1/(1+25x^2)时出现了一些反常的现象。如图,灰色的粗线就是Runge函数在[-1,1]上的图象。蓝色虚线是过[-1,1]上的6个等距点所得到的5次多项式,红色虚线是过[-1,1]上的10个等距点所得到的9次多项式。可以看到,当次数变高时,插值多项式反而变得更不准确。

  事实上,当次数n趋于无穷时,该区间上的最大误差值也将趋于无穷大!

插值仿真部分的Matlab code:

%% Author:J27
%% 2022/08/24

x=0:6;
y=[0 0.8415 0.9093 0.1411 -0.7568 -0.9589 -0.2794];
cftool

 弹出cf toolbox以后,需手动选择对应的x data和y data.


Part II     Spline样条函数的出现

什么样的插值函数,既能穿过所有已知点又能避免龙格现象(剧烈的震荡)呢?

答案是,用分段函数插值。就是把所有的已知数据分割成若干段,每段都对应一个插值函数,最终得到一个插值函数序列。

还有,分段函数之间彼此衔接不好怎么办?

答案是,高次样条差值。既每个分段函数都采用高次函数形式来构造(三次样条差值 就是用x的三次方形式构造)这就保证了多个函数之间的衔接光滑。(注:不能用过高阶的函数,否则抖动太剧烈。)

PS:样条一词的由来

      “样条”这个词来自于工业绘图时所使用的一种仪器,他是一个细的,可弯曲的木制或塑料工具,固定于给定的数据点上,从而定义出一条“穿过”每一个给定数据点的光滑曲线。

     样条的英语单词spline来源于可变形的样条工具,那是一种在造船和工程制图时用来画出光滑形状的工具。在中国大陆,早期曾经被称做「齿函数」。后来因为工程学术语中「放样」一词而得名。 

小结:

        三次样条插值就是把已知数据分割成若干段,每段构造一个三次函数,并且保证每段三次函数的衔接处具有0阶连续,一阶导数连续,二阶导数连续的性质(也就是光滑衔接)。


Part III    样条函数的数学基本原理

        已知n+1个数据节点,分成n个区间(也就是下图中的interval),在每个区间构造一个三次函数,共n段三次函数,S_{0}(x) ~ S_{n-1}(x)注意:下图只是一个示例图,并不跟我后文中所给出的方程组严格对应。

假设我们每一段三次函数都用如下的方程来定义: 

那么n个区间对应的三次函数S(x)的数学表达式如下:

        每段三次函数S(x)都有a,b,c,d四个系数(即:未知数),上述n段三次函数,共有4xn个系数(未知数)。要想求解这4n个未知数,共需要4n个方程。这就好比,我要求解y=ax+b中的两个系数(未知数)a,b,我们至少要知道两个点p1(x1,y1)和p2(x2,y2),联立两个方程y1=ax1+b和y2=ax2+b,才能求出系数a,b一样。

        下面,我们根据三次样条函数对每一段三次函数在断点处的约束(期望),生成求解4n个系数a,b,c,d所需的所有方程。

条件1:n段三次函数必须穿过所有已知节点

\large S_{i}(x_{i})=y_{i},i=0,1,2...n

 

       已知n+1个数据节点,要让n段函数三次函数穿过所有的数据点,总共可以生成n+1个方程。其中,前n个方程由i=0~n-1给出,第n+1个方程,由i=n单独给出)

        前n个方程所表达的实际意义是,S0~Sn-1段函数必定会经过自己所在区间的起点,例如,点(x0,y0) for S0(x)。而,最后一个方程所描述的是Sn-1段函数,也就是最后一段函数必定会过自己所在区间的终点(xn,yn)。简而言之就是,前面n-1段函数保证过起点,而最后一段函数,即过起点也过终点。

条件2:在所有节点(除了第一节点和最后一个节点)处0阶连续(保证数据不间断,无跳变),即,前一段方程在节点处的函数值和后一段方程在相同节点处的函数值相等。

其中,i=0,1,2…n-2(共得到n-1个方程,因为n段三次函数之间共有n-1的衔接点)  

 (注:根据条件一可推导出\small S_{i}(x_{i+1})=y_{i+1},也就是前面说的过终点)

Tips:

0阶导数连续的函数举例

0阶导数不连续的函数举例

                                                                     上图中的函数在x=1处是没有定义的

条件3:在所有节点(除了第一节点和最后一个节点)处1阶连续(保证节点处有相同的斜率,原函数曲线上没有剧烈的跳变)

i= 0,1,2…n-2  (共得到n-1个方程,n段三次函数之间共有n-1的衔接点)

Tips:

1.函数在某一点"有极限"等价于左极限=右极限
2.函数在某一点"连续"等价于左极限=右极限=函数值

一阶导数函数不连续的函数举例:

一阶导数函数连续的函数举例: 

换句话说:保证S'(x)的一阶连续意味着曲线y=S(x)没有急转弯,没有特别剧烈的跳变。

条件4:在所有节点(除了第一节点和最后一个节点)处2阶连续(保证节点处有相同的曲率,即,相同的弯曲程度)

i= 0,1,2…n-2 (共n-1个方程,n段三次函数之间共有n-1的衔接点)

或者说:保证S''(x)的连续,意味着每个点的曲率半径有定义(其实我也不懂什么叫曲率半径,哈哈)。

        综上,第一个约束条件得到了n+1个方程,第二,三,四个约束条件分别得到n-1个方程,共4n-2个方程,还差2个方程。(最后缺少的这两个方程,会在后面给出)


Part IV    求解方程组

先分别求出函数S(x)的一阶导数和二阶导数

https://images0.cnblogs.com/blog/477176/201301/26192558-4f365c76cd3444e2a8b6c31814f903f6.png

根据条件1 推导出:

https://images0.cnblogs.com/blog/477176/201301/26192609-31d25583b4064be3a345fb1b569ef3e4.png

根据条件2 ,(即)推导出:

https://images0.cnblogs.com/blog/477176/201301/26192619-6fa7eed9fc254ea78b9f36131f3510e1.png

根据条件3推导出:

https://images0.cnblogs.com/blog/477176/201301/26192634-ebe93c200e4449dfa033971afe584a18.png

根据条件4 推导出:

https://images0.cnblogs.com/blog/477176/201301/26192638-ddede7fe3d5d40248431e88b01b151c5.png

https://images0.cnblogs.com/blog/477176/201301/26192643-483a8f3b90634ca0a99cd9f4eb6a0f81.png 可得:

https://images0.cnblogs.com/blog/477176/201301/26192655-dbf978717b2c43d8a74dfc3aa91b3848.png

后续推导:

https://images0.cnblogs.com/blog/477176/201301/26192702-f3d84f8eaeb34682b0249390116ae1be.png

https://images0.cnblogs.com/blog/477176/201301/26192706-7fa78cdd7d414d0bbb45520f46c7c85a.png


Part V    端点条件(最后增加两个约束条件,使得方程组数目正好是4n)

1,自由边界(Natural)

     Natural样条是柔软又有弹性的木杆经过所有数据点后形成的曲线,让端点的斜率自由的在某一位置保持平衡,使得曲线的摇摆最小。

自由边界的两个附加边界条件:

推导过程:

自由边界生成的线性方程组:

   

2,固定边界/紧压样条(Clamped)

     紧压样条在端点有固定的斜率。紧压样条可想象为,用外力使柔软而有弹性得木杆经过数据点,并在端点处使其具有固定得斜率。这样的样条对于画经过多个点的光滑曲线的绘图员相当有用。

紧压样条的两个附加边界条件:

        简而言之,就是指定第一段函数S_{0}(x)在左起第一个点x_{0}处的斜率为A,最后一段函数S_{n-1}(x)在右端最后一个点x_{n}处的斜率为B。

推导过程: 

紧压样条生成的线性方程组:

                              

3,非节点边界(Not-A-Knot)

      非节点边界要求第一段S0和第二段S1三次函数在第二个数据点X1处三阶导数连续,同时也要求倒数第二段Sn-2和最后一段函数Sn-1在倒数第二个数据点Xn-1处三阶导数连续。(也就是说,整个样条函数中,前两段函数完全相同,最后两段的函数也完全相同。同时,0阶,1阶,2阶,3阶全都连续保证了数据点两端的参数a,b,c,d都相同。)

非节点边界的两个附加边界条件:

https://images0.cnblogs.com/blog/477176/201301/26192824-ca65aad071af49f599502c65e01b2325.png

https://images0.cnblogs.com/blog/477176/201301/26192826-f0c754a39d7d4def8330b9ceb8766468.png

推导过程:  

非节点边界生成的线性方程组:

   

(全文完)

作者 --- 松下J27

参考文献(鸣谢):

1,Thomas' Calculus (12th Edition)  -Addison Wesley

2,托马斯微积分

3,作者:Winters  链接:https://www.zhihu.com/question/31269601/answer/244310086  来源:知乎

4, 三次样条插值(Cubic Spline Interpolation)及代码实现(C语言) - 马语者 - 博客园

5, Runge现象:多项式插值不见得次数越高越准确 | Matrix67: The Aha Moments

之前写的有些问题,现在已经做了修订。2021/03/22

关于插值部分做了一些补充。2021/10/29

对部分方程的具体意义做了说明。2022/05/20晚

修改了文章开头部分的插值部分的插图和说明,并增加了相应的Matlab code。 2022/08/24

又改了改。 2023/02/02

格言摘抄

        不轻易发怒的,胜过勇士;治服己心的,强如取城。签放在怀里,定事由耶和华。 (《圣经》箴言 16章32-33节)

Zacchaeusçåçæå°çµæ

(配图与本文无关)  

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数值计算 --- 三次样条函数插值(Cubic spline function interpolation) 的相关文章

  • 解决Macbook安装Adobe Illustrator cc2021中文激活版打不开问题,ai支持苹果big sur系统安装教程

    备受期待的Adobe Illustrator 2021 for Mac终于来啦 这是全球最著名的矢量图形软件 这次的Illustrator2021版提升了软件的性能 缩短了Illustrator 2021的启动时间并加快了文件打开速度 而且
  • windows下安装spark及hadoop

    windows下安装spark 1 安装jdk 2 安装scala 3 下载spark spark下载地址 3 1安装spark 将下载的文件解压到一个目录 注意目录不能有空格 比如说不能解压到C Program Files 作者解压到了这
  • 组合数学(持续更新)

    文章目录 排列与组合 四个基本计数原理 集合的排列 集合的组合 多重集合的排列 多重集合的组合 鸽巢原理 排列与组合 四个基本计数原理 1 1 1 加法原理 设集合
  • Glog :安装与卸载

    Glog的安装与卸载分为两种情况 一种是使用apt 一种是使用源代码 apt安装与卸载 安装 sudo apt get install libgoogle glog dev 卸载 sudo apt get remove libgoogle
  • 【JSON】谷歌浏览器JSON可视化插件:JSON-Handle

    摘要 JSON handle是一款对JSON格式的内容进行浏览和编辑 以树形图样式展现JSON文档 并可实时编辑 今天我推荐一款chrome Firfox下处理json的插件JSON handle 这个应该是我用过最好最方便的了 插件功能
  • 2023 年最常见的人工智能面试问题

    人工智能面试问题 自从我们意识到人工智能如何对市场产生积极影响以来 几乎每个大型企业都在寻找人工智能专业人士来帮助他们实现愿景 在这个人工智能面试问题博客中 我收集了面试官最常问的问题 人工智能 AI 面试问答 人工智能面试准备 此 Edu
  • 基于hostpath的k8s pod日志持久化

    基于hostpath的k8s pod日志持久化 前置条件 step1 修改服务的yaml文件 step2 推送日志到minio版保存 step3 优化 附加 简单了解 前置条件 考虑到pod的多副本 但同时需要将日志集中收集起来 所以采用h
  • mysql中explain用法和结果的含义

    sql view plain copy explain select from user sql view plain copy explain extended select from user id SELECT识别符 这是SELECT
  • SSAS处理类型

    Type value Applicable objects ProcessFull Cube database dimension measure group mining model mining structure partition
  • cuda-GPU 加速

    global 主机调用 声明设备函数 在设备上 gpu 执行 device 设备上执行并从设备上调用 host 其他主机调用的主机函数 cudaMalloc 设备上分配内存 cudaMemcpy 别存复制到主机或设备上 cudaFree 释
  • PHP+Redis实现延迟任务 实现自动取消订单,自动完成订单

    简单定时任务解决方案 使用redis的keyspace notifications 键失效后通知事件 需要注意此功能是在redis 2 8版本以后推出的 因此你服务器上的reids最少要是2 8版本以上 A 业务场景 1 当一个业务触发以后
  • 什么是OLAP

    问题导读 1 为什么会出现OLAP应用 2 OLAP的度过了哪些发展历史 3 OLAP的基本内容有哪些 4 OLAP常见操作有哪些 OLAP Online AnalyticalProcessing 是一种数据处理技术 专门设计用于支持复杂的
  • 虚拟机Ubuntu系统安装与换源

    虚拟机Ubuntu系统安装与换源 1 ubuntu系统安装 1 1下载ubuntu镜像 https ubuntu com download desktop 1 2打开VMware 创建新的虚拟机 1 3选择自定义安装 1 4一直下一步到此界
  • pandas中DataFrame基本操作

    怎样删除list中空字符 最简单的方法 new list x for x in li if x 这一部分主要学习pandas中基于前面两种数据结构的基本操作 设有DataFrame结果的数据a如下所示 a b c one 4 1 1 two
  • 1658. 合法标识符

    1658 合法标识符 请判断字符串 str 是不是一个合法的标识符 合法的标识符由字母 A Z a z 数字 0 9 和下划线组成 并且首字符不能为数字 样例 样例 1 输入 str LintCode 输出 true 解释 因为 LintC
  • PySpark MLlib 机器学习算法库

    作者 禅与计算机程序设计艺术 1 简介 PySpark MLlib 是 Apache Spark 生态系统中的一个开源机器学习工具包 它提供了高级的API 包括分类 回归 聚类 协同过滤等 可以用来处理大数据集 并进行训练和预测分析 本文将
  • Picture Control的使用

    在对话上放了一个Picture控件 并载入一幅位图 将Picture的大小调得和位图的大小一样 在Windows2000下 但当我在Widnows98下再次运行这个对话框程序时 Picture控件变大了 整个对话框和其中的控件都变大了 但其
  • 如何开具SSCI论文的检索证明?

    在学术界中 无论是学位申请 奖学金申请 还是职称评审 都必须附上SSCI论文的检索报告 那么 如何开具SSCI论文检索证明呢 一种方法是自行前往所在学校或当地查新机构开具 另一种方法则是委托专业人员代为开具 作者需要了解可用于开具论文检索报

随机推荐

  • OpenFeign 基本介绍和原理了解

    了解 OpenFeign OpenFeign 组件的前身是 Netflix Feign 项目 后来 Feign 项目被贡献给了开源组织 才有了今天使用的 Spring Cloud OpenFeign 组件 OpenFeign 提供了一种声明
  • postman面试_使用Postman做接口测试

    Postman是一个接口测试工具 在做接口测试的时候 Postman相当于一个客户端 它可以模拟用户发起的各类HTTP请求 将请求数据发送至服务端 获取对应的响应结果 从而验证响应中的结果数据是否和预期值相匹配 并确保开发人员能够及时处理接
  • 小程序在线更新,发布后提示有新版本

    在小程序onLaunch时候查看是否有新版本 onLaunch function 小程序更新 const updateManager uni getUpdateManager updateManager onCheckForUpdate f
  • 怎么把jfif改成png格式?三招送给你

    怎么把jfif改成png格式 在我们实际办公的过程中 其电脑网页存储的图片格式可能就是jfif格式 很多人对于jfif格式较为陌生 且在一些应用场景无法直接打开jfif格式的图片进行操作 编辑 对我们办公效率造成了一些影响 在此过程中 需要
  • Python、PHP和Java下的反序列化漏洞复现实例

    环境准备 这篇文章旨在用于网络安全学习 请勿进行任何非法行为 否则后果自负 python反序列化 p83 CTF夺旗 Python考点SST 反序列化 字符串 正经人 的博客 CSDN博客 php反序列化 p84 CTF夺旗 PHP弱类型
  • vue注册全局指令

    Vue directive focus 只调用一次 指令第一次绑定到元素时调用 在这里可以进行一次性的初始化设置 bind el binding console log bind el binding el触发的元素 console log
  • BeanFactoryAware

    在使用spring编程时 常常会遇到想根据bean的名称来获取相应的bean对象 这时候 就可以通过实现BeanFactoryAware来满足需求 代码很简单 Service public class BeanFactoryHelper i
  • 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取 支持 100 多种语言 自动文本定位和脚本检测 几行代码即可实现离线使用 附源码 要从图像 照片中提取文本吗 是否刚刚拍了讲义的照片并想将其转换为文本 那么您将需要一个可以通过 OCR 光学字符识别 识别文本
  • uniapp引入图表ucharts方法

    Ucharts官网 https demo ucharts cn HBuilderX插件市场 https ext dcloud net cn 进入HBuilderX插件市场安装ucharts插件 进入ucharts官网找到需要的图表复制代码
  • 设计模式 简单工厂,策略模式,几种基本原则,Unity基础

    学习笔记 感受设计演变过程中蕴含的大智慧 体会乐于怒的程序人生中值得回味的一幕幕 设计模式来自于建筑领域 作为软件工程的一个分支 是在软件工程实践过程中 程序员们总结出的良好的编程方法 第一种模式 简单工厂模式 图片来源 点这里 上面是简单
  • RAM IP core(2)

    例化5种RAM IP core 1 单端口RAM Single port RAM RAM参数设置如上图所示 输入输出位宽都为8位 深度为16 采用一级输出寄存器 读写模式为no change 用COE文件对RAM进行初始化 关于COE文件的
  • BurpSuit在不同浏览器中配置代理

    BurpSuit配置代理 一 BurpSuit代理基础知识 通常情况下 用户通过浏览器浏览网页 通过浏览器 客户端 与服务器进行交互 既相互进行通信 若要想分析客户端和服务器交互的具体信息 就需要一个人当个中介 中间人 可以拦截两个人的信息
  • HTML5基础知识总结

    文章目录 01 HTML5基础 了解HTML5 新语义标签 网页布局结构标签及兼容处理 多媒体标签及属性介绍 新表单元素及属性 智能表单控件 表单属性 HTMl5中的API 获取页面元素及类名操作和自定义属性 文件读取 获取网络状态 获取地
  • sql union 列的字段不一样的时候

    转载于 https www cnblogs com shenzhichipingguo p 8916705 html
  • 69-Sqrt(x)

    题目 Implement int sqrt int x Compute and return the square root of x 分析 这个题里面是有许多陷阱的 首先确定用二分法处理这个问题 然而0 x之间的num的平方有可能会溢出
  • Apifox接口测试教程(一)接口测试的原理与工具

    前言 掌握了http协议 就掌握了接口测试 笔者在网络上看过不少接口测试教程 一上来就开始讲怎么操作工具 而不告诉读者为什么要这么操作 读者可能照猫画虎成功了 也可能操作失败了但不知为何出错 因此 本文作为接口测试的入门第一课首先会给大家了
  • 静态代码分析工具(一)—Scitools Understand

    一 概述 Understand是一个用来进行静态的软件分析 软件度量 软件可视化的工具 二 软件使用 1 安装 安装的是Understand 5 1 安装及另起可用网上很多资源 2 新建工程 创建工程名称 路径 选择语言 注意 在C C 后
  • (cLion、RubyMine、PyCharm、WebStorm、PhpStorm、Appcode、Clion、Idea) 万能破解,获取自己的注冊码...

    听说cLion的ide编写c c 很的棒 今天下载了一个仅仅有30天的使用时间 作为程序猿破解它 下载破解文件 点击下载 password 7biu 解压压缩包 然后打开命令行 cd 到解压文件夹 运行例如以下命令 java jar bui
  • HTTP协议初探

    发现网络协议的知识对后台开发人员来说 还是非常重要的 所以特地去了解了以下 并作学习笔记 方便自己查阅 HTTP协议详解 HTTP就是一个基于应用层的通信规范 双方要进行通信 大家都要遵守一个规范 HTTP协议 HTTP协议从WWW服务器传
  • 数值计算 --- 三次样条函数插值(Cubic spline function interpolation)

    三次样条函数插值 Cubic spline function interpolation Part I 插值 预备知识 什么是插值 已知部分离散的数据 但不知道满足这些数据的函数表达式 插值 和拟合 都是为了找到对应的函数表达式 区别在于