百度百科定义

插值:在离散数据的基础上插补连续函数,使得这条连续曲线经过全部离散点,同时也可以估计出函数在其他点的近似值。

样条插值:一种以 可变样条 来作出一条经过一系列点的光滑曲线的数学方法。插值样条是由一些多项式组成的,每一个多项式都是由相邻的两个数据点决定的,这样,任意的两个相邻的多项式以及它们的导数在连接点处都是连续的。

样条插值法

简单理解,就是每两个点之间确定一个函数,这个函数就是一个样条,函数不同,样条就不同,所以定义中说 可变样条,然后把所有样条分段结合成一个函数,就是最终的插值函数。

https://www.cnblogs.com/yanshw/p/11194058.html

思路1 - 线性样条

两点确定一条直线,我们可以在每两点间画一条直线,就可以把所有点连起来。


显然曲线不够光滑,究其原因是因为连接点处导数不相同。

思路2 - 二次样条

直线不行,用曲线代替,二次函数是最简单的曲线。

假设4个点,x0,x1,x2,x3,有3个区间,需要3个二次样条,每个二次样条为 ax2+bx+cax^2+bx+cax2+bx+c,故总计9个未知数。

  1. x0,x3两个端点都有一个二次函数经过,可确定2个方程

  2. x1,x2两个中间点都有两个二次函数经过,可确定4个方程

  3. 中间点处必须连续,需要保证左右二次函数一阶导相等

2∗a1∗x1+b1=2∗a2∗x1+b22*a1*x1+b1=2*a2*x1+b22∗a1∗x1+b1=2∗a2∗x1+b2

2∗a2∗x2+b2=2∗a3∗x2+b32*a2*x2+b2=2*a3*x2+b32∗a2∗x2+b2=2∗a3∗x2+b3

可确定2个方程,此时有了8个方程。

  1. 这里假设第一方程的二阶导为0,即 a1=0,又是一个方程,共计9个方程。【见补充】

联立即可求解。

可以看到 y 是多段二次函数拼接而成。

二次样条插值连续光滑,看起来效果还行。

只是前两个点之间是条直线,因为假设a1=0,二次函数变成b1x+c1,显然是直线;

而且最后两个点之间过于陡峭 。

思路3 - 三次样条

二次函数最高项系数为0,导致变成直线,那三次函数最高项系数为0,还是曲线,插值效果应该更好。

三次样条思路与二次样条基本相同,

同样假设4个点,x0,x1,x2,x3,有3个区间,需要3个三次样条,每个三次样条为 ax3+bx2+cx+dax^3+bx^2+cx+dax3+bx2+cx+d,故总计12个未知数。

  1. 内部节点处的函数值应该相等,这里一共是4个方程。

  2. 函数的第一个端点和最后一个端点,应该分别在第一个方程和最后一个方程中。这里是2个方程。

  3. 两个函数在节点处的一阶导数应该相等。这里是两个方程。

  4. 两个函数在节点处的二阶导数应该相等,这里是两个方程。     【见补充】

  5. 假设端点处的二阶导数为零,这里是两个方程。          【见补充】

a1=0

b1=0

补充

微分连续性

s 代表三次样条,s’是一阶导,s’'是二阶导

端点条件

上面我们对端点处的样条进行了假设,为什么呢?其实端点可以有多种不同的限制,常见有3种。

1 自由边界 Natural

首尾两端没有受到任何使他们弯曲的力,二次样条就是 s’=0,三次样条就是 s’’=0

2 固定边界 Clamped

首尾两端点的微分值被指定

3 非节点边界 Not-A-Knot

把端点当做中间点处理,三次函数不做假设,即

参考资料:

https://blog.csdn.net/flyingleo1981/article/details/53008931  三次样条插值(Cubic Spline Interpolation)及代码实现(C语言)

https://blog.csdn.net/deramer1/article/details/79034201  三次样条插值法

https://www.cnblogs.com/yanshw/p/11194058.html 代码实现(python语言)

附录

1、二次插值python

# encoding:utf-8
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
"""
二次样条实现
"""
x = [3, 4.5, 7, 9]
y = [2.5, 1, 2.5, 0.5]def calculateEquationParameters(x):#parameter为二维数组,用来存放参数,sizeOfInterval是用来存放区间的个数parameter = []sizeOfInterval=len(x)-1i = 1#首先输入方程两边相邻节点处函数值相等的方程为2n-2个方程while i < len(x)-1:data = init(sizeOfInterval*3)data[(i-1)*3]=x[i]*x[i]data[(i-1)*3+1]=x[i]data[(i-1)*3+2]=1data1 =init(sizeOfInterval*3)data1[i * 3] = x[i] * x[i]data1[i * 3 + 1] = x[i]data1[i * 3 + 2] = 1temp=data[1:]parameter.append(temp)temp=data1[1:]parameter.append(temp)i += 1#输入端点处的函数值。为两个方程,加上前面的2n-2个方程,一共2n个方程data = init(sizeOfInterval*3-1)data[0] = x[0]data[1] = 1parameter.append(data)data = init(sizeOfInterval *3)data[(sizeOfInterval-1)*3+0] = x[-1] * x[-1]data[(sizeOfInterval-1)*3+1] = x[-1]data[(sizeOfInterval-1)*3+2] = 1temp=data[1:]parameter.append(temp)#端点函数值相等为n-1个方程。加上前面的方程为3n-1个方程,最后一个方程为a1=0总共为3n个方程i=1while i < len(x) - 1:data = init(sizeOfInterval * 3)data[(i - 1) * 3] =2*x[i]data[(i - 1) * 3 + 1] =1data[i*3]=-2*x[i]data[i*3+1]=-1temp=data[1:]parameter.append(temp)i += 1return parameter"""
对一个size大小的元组初始化为0
"""
def init(size):j = 0data = []while j < size:data.append(0)j += 1return data"""
功能:计算样条函数的系数。
参数:parametes为方程的系数,y为要插值函数的因变量。
返回值:二次插值函数的系数。
"""def solutionOfEquation(parametes,y):sizeOfInterval = len(x) - 1result = init(sizeOfInterval*3-1)i=1while i<sizeOfInterval:result[(i-1)*2]=y[i]result[(i-1)*2+1]=y[i]i+=1result[(sizeOfInterval-1)*2]=y[0]result[(sizeOfInterval-1)*2+1]=y[-1]a = np.array(calculateEquationParameters(x))b = np.array(result)return np.linalg.solve(a,b)"""
功能:根据所给参数,计算二次函数的函数值:
参数:parameters为二次函数的系数,x为自变量
返回值:为函数的因变量
"""
def calculate(paremeters,x):result=[]for data_x in x:result.append(paremeters[0]*data_x*data_x+paremeters[1]*data_x+paremeters[2])return  result"""
功能:将函数绘制成图像
参数:data_x,data_y为离散的点.new_data_x,new_data_y为由拉格朗日插值函数计算的值。x为函数的预测值。
返回值:空
"""
def  Draw(data_x,data_y,new_data_x,new_data_y):plt.plot(new_data_x, new_data_y, label=u"拟合曲线", color="black")plt.scatter(data_x,data_y, label=u"离散数据",color="red")mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falseplt.title(u"二次样条函数")plt.legend(loc="upper left")plt.show()result=solutionOfEquation(calculateEquationParameters(x),y)
new_data_x1=np.arange(3, 4.5, 0.1)
new_data_y1=calculate([0,result[0],result[1]],new_data_x1)
new_data_x2=np.arange(4.5, 7, 0.1)
new_data_y2=calculate([result[2],result[3],result[4]],new_data_x2)
new_data_x3=np.arange(7, 9.5, 0.1)
new_data_y3=calculate([result[5],result[6],result[7]],new_data_x3)
new_data_x=[]
new_data_y=[]
new_data_x.extend(new_data_x1)
new_data_x.extend(new_data_x2)
new_data_x.extend(new_data_x3)
new_data_y.extend(new_data_y1)
new_data_y.extend(new_data_y2)
new_data_y.extend(new_data_y3)
Draw(x,y,new_data_x,new_data_y)

2、三次插值python

# encoding:utf-8
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
"""
三次样条实现
"""
x = [3, 4.5, 7, 9]
y = [2.5, 1, 2.5, 0.5]def calculateEquationParameters(x):#parameter为二维数组,用来存放参数,sizeOfInterval是用来存放区间的个数parameter = []sizeOfInterval=len(x)-1;i = 1#首先输入方程两边相邻节点处函数值相等的方程为2n-2个方程while i < len(x)-1:data = init(sizeOfInterval*4)data[(i-1)*4] = x[i]*x[i]*x[i]data[(i-1)*4+1] = x[i]*x[i]data[(i-1)*4+2] = x[i]data[(i-1)*4+3] = 1data1 =init(sizeOfInterval*4)data1[i*4] =x[i]*x[i]*x[i]data1[i*4+1] =x[i]*x[i]data1[i*4+2] =x[i]data1[i*4+3] = 1temp = data[2:]parameter.append(temp)temp = data1[2:]parameter.append(temp)i += 1# 输入端点处的函数值。为两个方程, 加上前面的2n - 2个方程,一共2n个方程data = init(sizeOfInterval * 4 - 2)data[0] = x[0]data[1] = 1parameter.append(data)data = init(sizeOfInterval * 4)data[(sizeOfInterval - 1) * 4 ] = x[-1] * x[-1] * x[-1]data[(sizeOfInterval - 1) * 4 + 1] = x[-1] * x[-1]data[(sizeOfInterval - 1) * 4 + 2] = x[-1]data[(sizeOfInterval - 1) * 4 + 3] = 1temp = data[2:]parameter.append(temp)# 端点函数一阶导数值相等为n-1个方程。加上前面的方程为3n-1个方程。i=1while i < sizeOfInterval:data = init(sizeOfInterval * 4)data[(i - 1) * 4] = 3 * x[i] * x[i]data[(i - 1) * 4 + 1] = 2 * x[i]data[(i - 1) * 4 + 2] = 1data[i * 4] = -3 * x[i] * x[i]data[i * 4 + 1] = -2 * x[i]data[i * 4 + 2] = -1temp = data[2:]parameter.append(temp)i += 1# 端点函数二阶导数值相等为n-1个方程。加上前面的方程为4n-2个方程。且端点处的函数值的二阶导数为零,为两个方程。总共为4n个方程。i = 1while i < len(x) - 1:data = init(sizeOfInterval * 4)data[(i - 1) * 4] = 6 * x[i]data[(i - 1) * 4 + 1] = 2data[i * 4] = -6 * x[i]data[i * 4 + 1] = -2temp = data[2:]parameter.append(temp)i += 1return parameter"""
对一个size大小的元组初始化为0
"""
def init(size):j = 0data = []while j < size:data.append(0)j += 1return data"""
功能:计算样条函数的系数。
参数:parametes为方程的系数,y为要插值函数的因变量。
返回值:三次插值函数的系数。
"""
def solutionOfEquation(parametes,y):sizeOfInterval = len(x) - 1result = init(sizeOfInterval*4-2)i=1while i<sizeOfInterval:result[(i-1)*2]=y[i]result[(i-1)*2+1]=y[i]i+=1result[(sizeOfInterval-1)*2]=y[0]result[(sizeOfInterval-1)*2+1]=y[-1]a = np.array(calculateEquationParameters(x))b = np.array(result)for data_x in b:print(data_x)return np.linalg.solve(a,b)"""
功能:根据所给参数,计算三次函数的函数值:
参数:parameters为二次函数的系数,x为自变量
返回值:为函数的因变量
"""
def calculate(paremeters,x):result=[]for data_x in x:result.append(paremeters[0]*data_x*data_x*data_x+paremeters[1]*data_x*data_x+paremeters[2]*data_x+paremeters[3])return  result"""
功能:将函数绘制成图像
参数:data_x,data_y为离散的点.new_data_x,new_data_y为由拉格朗日插值函数计算的值。x为函数的预测值。
返回值:空
"""
def  Draw(data_x,data_y,new_data_x,new_data_y):plt.plot(new_data_x, new_data_y, label=u"拟合曲线", color="black")plt.scatter(data_x,data_y, label=u"离散数据",color="red")mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falseplt.title(u"三次样条函数")plt.legend(loc="upper left")plt.show()result=solutionOfEquation(calculateEquationParameters(x),y)
new_data_x1=np.arange(3, 4.5, 0.1)
new_data_y1=calculate([0,0,result[0],result[1]],new_data_x1)
new_data_x2=np.arange(4.5, 7, 0.1)
new_data_y2=calculate([result[2],result[3],result[4],result[5]],new_data_x2)
new_data_x3=np.arange(7, 9.5, 0.1)
new_data_y3=calculate([result[6],result[7],result[8],result[9]],new_data_x3)
new_data_x=[]
new_data_y=[]
new_data_x.extend(new_data_x1)
new_data_x.extend(new_data_x2)
new_data_x.extend(new_data_x3)
new_data_y.extend(new_data_y1)
new_data_y.extend(new_data_y2)
new_data_y.extend(new_data_y3)
Draw(x,y,new_data_x,new_data_y)

3月25日 插值-样条插值相关推荐

  1. 可租赁、可定制的虚拟人居然还能这么玩?9月25日来百度大脑人像特效专场一探究竟!...

    百度大脑自2016年启动开放以来,已打造成为业内最全面.最领先的AI开放平台,服务规模.调用量都居于业界第一. 百度大脑开放日于2019年开办,覆盖北/上/深等地区,成为众多AI开发者.合作伙伴近距离 ...

  2. 2021新款 iPad,包邮送一个!10月25日截止

    为了回馈长期以来各位老铁对本号的关注支持,更好的去看paper,提高技术水平,直接给你送一个 2021新款苹果iPad !无论是自己用,还是当礼物送人,都比较不错的. 赠送规则 赠送规则 本号的读者众 ...

  3. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(6月25日-7月1日)

    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(6月25日-7月1日) 本周Silverlight学习资源更新 用Silverlight做淘宝应用 往事如锋 基于 Si ...

  4. 【Flutter】Flutter 开发环境搭建 ( 2021年08月25日 补充最新资料 | 最新安装教程 )

    文章目录 前言 一.Android Studio 环境安装 Flutter / Dart 插件 二.Flutter SDK 下载 三.设置 Flutter 环境变量 1.设置 Flutter SDK环 ...

  5. 第四范式陈雨强:万字深析工业界机器学习最新黑科技 By 机器之心2017年7月25日 16:38 近日,全球最顶级大数据会议 Strata Data Conference 在京召开。Strata 大

    第四范式陈雨强:万字深析工业界机器学习最新黑科技 By 机器之心2017年7月25日 16:38 近日,全球最顶级大数据会议 Strata Data Conference 在京召开.Strata 大会 ...

  6. 直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR

    直击CVPR2017:商汤科技打造技术盛宴23篇论文刮起中国风 By 机器之心2017年7月25日 10:14 近日,CVPR2017 在夏威夷如火如荼地进行,作为全球计算机视觉顶级会议,CVPR 堪 ...

  7. 10月25日lol服务器维护,《LOL》lol10月25日停机维护到什么时候 10.25维护结束时间...

    导 读 英雄联盟8.21版本将在今天更新后全面上线!这次版本新增了万圣节皮肤,以下是本次更新说明,一起来了解一下吧. [英雄联盟版本更新说明] [更新版本]8.21 [更新时间]2018年10月25日 ...

  8. 计算机二级和省考撞车了,事考、省考撞车?7月25日笔试,该怎么选?

    原标题:事考.省考撞车?7月25日笔试,该怎么选? 近日网上有消息称,2020年省考笔试时间将定于7月25日,与此同时,2020年全国事业单位分类统考时间也定于7月25日笔试.所以,今年省考和事考这是 ...

  9. Xbox 2021年科隆展发表会将于8月25日凌晨1点开始

    Xbox 2021年科隆展发布会将于北京时间8月25日凌晨1点开始,微软表示这次发布会将持续90分钟,专注于之前已经发布即将登陆Xbox的游戏,即将登陆Xbox Game Pass的游戏以及第三方游戏 ...

  10. 八月25日8点半服务器维修,三国乱世8月25日合区维护公告

    <三国乱世>8月合区维护公告 尊敬的玩家: 为保证游戏质量,增加更多玩家之间交流和互动的机会,实现最激烈的国战和战斗氛围.我们将于2015年8月25日对<三国乱世>部分服务器进 ...

最新文章

  1. 1037 Magic Coupon
  2. echarts迁徙图 vue_vue中高德搭配echarts做数据迁徙流线图
  3. Java GUI编程:swing实现上传tiff文件至hdfs功能
  4. JavaWeb学习之路——SSM框架之Spring(五)
  5. 安卓手机挂载Linux,android 挂载NFS教程
  6. javascript 里Array的一些方法
  7. pythonsuper函数_怎么使用python super函数调用父类
  8. mfc获取子窗口句柄_前端设计-JavaScript中父窗口与子窗口间的通信
  9. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月17日-9月23日)
  10. 设置和使用地图的范围—ArcGIS API for JavaScript
  11. c语言程序的生命周期(编写、预处理、编译、汇编、链接、执行)
  12. app商品详情原数据 API ——淘宝/天猫
  13. TRUNCATE,DORP,DELETE
  14. java五子棋的重要算法讲解_[Java五子棋小游戏-Ai算法精讲以及实现]-02--高级算法初步...
  15. 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍
  16. 深度学习和自然语言处理的应用
  17. foxmail发邮件时总提示接收密码错误是怎么回事
  18. 职业也如学习一样,逆水行舟不进则退
  19. Error: Cannot find module ‘process-nextick-args‘,error:0308010C:digital envelope routines::unsupport
  20. 02 事务伴生源-Propagation

热门文章

  1. 【ArcGIS|空间分析】微博签到数据分析(全国大学生GIS技能大赛试题)
  2. 算法案例之有效字母异位词
  3. ajax获取inputname值,jQuery - 获取ajax POST的表单值
  4. buck变换器设计matlab_电力电子变换器控制设计(1)
  5. 双屏鼠标经常跑到副屏_双屏游戏本什么体验?上手ROG冰刃双屏:效率直接拉满...
  6. linux中安装多个mysql_Linux环境中安装多个MySQL服务笔记
  7. 平板竖屏_朱海舟吐槽iPad办公体验:大量竖屏应用缺乏适配
  8. mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
  9. 诺基亚x6升级android9体验,诺基亚X6手机怎么样?诺基亚X6全面详细评测
  10. 网络运维经验分享01