Spline(三次样条插值)

关于三次样条插值,计算方法比较复杂,但是静下心来仔细研究也是可以理解的。

本文借鉴文章来源:http://www.cnki.com.cn/Article/CJFDTotal-BGZD200611035.htm

定义:

     简单来说就是给定了一些在区间[a,b]的数据点{x1,x2,x3.....xn},对应函数值{y1,y2,y3.....yn},函数在[xj,xj+1]  (j=1,2,...n-1此处根据你的编译器所定,matlab数组下标从1开始的)上有表达式S(x),且满足下面条件:

1. S(x)是一个三次多项式,在这里设为

2. S(xj)=yj                    (2-1)

3. S(xj-0)=S(xj+0)  (j=2,3....,n-1)这就是保证了在非端点处的其它点连续               (2-2)

4. S'(xj-0)=S'(xj+0) (j=2,3....,n-1)一阶导数连续                              (3-1)

5. S''(xj-0)=S''(xj+0) (j=2,3....,n-1)二阶导数连续                              (3-2)

【注】3 4 5的区间从2开始到n-1是因为两个端点不需要判断是否连续,端点处没连续这一说。

       有一个说法“n个未知数需要n个方程才能确定唯一解”,具体对不对,可以参考线性代数的知识。我们的最终目标是求出每个区间的式(1)或者函数值。 共有n-1个区间,每个区间四个参数aj,bj,cj,dj,那么就总共需要4(n-1)个求未知数。在(2-1)中给出了n个方程,(2-2)(3-1)(3-2)总共给出了3(n-2)个方程,所以依据唯一解方法可知还需要4(n-1)-3(n-2)-n=2个方程。

       对于剩下的两个方程,三次样条插值给出了两个边界约束方程,刚好凑齐两个,并且有三种,可以依照自己的兴趣选择一种便于实现的。

1. 给定了端点处的一阶导数值:S'(x1)=y1'    S'(xn)=yn'

2.给定了端点处的二阶导数值:S''(x1)=y1''    S''(xn)=yn''。自然边界条件:y1''=yn''=0

3.给定了一个周期性条件:如果f(x)是以b-a为周期的函数,在端点处便满足:S'(x1+0)=S'(xn-0),S''(x1+0)=S''(xn-0)

下面的推导是以边界方程1为例的:

推导过程:

(一) 利用二阶导得到一些式子:

S(x)为每个区间的三次多项式,那么S''(x)就是一次多项式。假设S''(xj)=Mj,S''(xj+1)=Mj+1的值已知,那么:
其中hj=xj+1-xj,然后利用S''(x)求S(x):

(二)依据S(x)得到一些式子

按照上面的证明可以得到:
其中:hj=xj+1-xj
依据S(xj)=yj和S(xj+1)=yj+1得到:
——————更新日志2020-6-13————————
感谢评论区老哥@meng_zhi_xiang ,公式(5)的A下标不是j+1,应该是j
解得(求解过程就不写了,简单的二元方程组)
                                     (6-1)
          (6-2)
将Aj和Bj带入S(x)中可以得到S(x)的最终式子:
原文此处应该是有错误,Aj和Bj都没有xj的式子,但是原文的结果中包含。
这里就得到了S(x)的雏形了,xj、xj+1、hj都是已知的,但是Mj和Mj+1是假设已知的,下面就是求它们了。

(三)利用一阶导数得到一些式子

依据式(7)求出一阶导:
然后为了使在xj处连续平滑,那么在xj处的一阶导必须相等。即要满足S'(xj-0)=s'(xj+0)
等式坐标表示S(x)在[xj-1,xj]的xj的一阶导值,右边表示[xj,xj+1]的xj一阶导值
其中利用S(x)的表达式可以得到等式左右两边的值:
由上得到两个式子:
由两式相等整理可得:
令:
则μjMj-1+2Mj+(1-μj)Mj+1=dj(j=2,3,...,n-1)

(四)带入边界条件

此处选择边界条件1,即
计算:
结果写为2M1+M2=β1
结果写为Mn-1+2Mn=βn

(五)结果

结合(三)、(四)可以看出所有的n个式子已经齐全:
包括(三)结尾算得μjMj-1+2Mj+(1-μj)Mj+1=dj(j=2,3,...,n-1)的n-2个式子加上(四)得到的两个式子,刚好n个式子.
用矩阵表示出这n个式子即为:
方程中
   
并且hj=xj+1-xj
这样便解出了矩阵M,然后带入S(x)的式子即上面算得:
这样便求得了每一个区间上的S(x)了。
matlab代码:
SplineThree.m
<pre name="code" class="plain">function f = SplineThree(x,y,dy1,dyn,x0)
%x,y为输入的已知点
%x0为待求插值点的横坐标
%dy1,dyn为约束条件,是端点处的一阶导数值
n=length(x);
for j=1:n-1h(j)=x(j+1)-x(j);
end%得到式子右边的结果矩阵
d(1,1)=6*((y(2)-y(1))/h(1)-dy1)/h(1);   %等式(11)的结果矩阵的上端点值
d(n,1)=6*(dyn-(y(n)-y(n-1))/h(n-1))/h(n-1); %等式(11)的结果矩阵的下端点值
for i=2:n-1u(i)=h(i-1)/(h(i-1)+h(i));d(i,1)=6*((y(i+1)-y(i))/h(i)-(y(i)-y(i-1))/h(i-1))/(h(i-1)+h(i));
end%得到系数矩阵
A(1,1)=2;
A(1,2)=1;
A(n,n-1)=1;
A(n,n)=2;
for i=2:n-1A(i,i-1)=u(i);A(i,i)=2;A(i,i+1)=1-u(i);
end%解方程
M=A\d;format long
syms t;
%得到每个区间的式子
for i=1:n-1a(i)=y(i+1)-M(i+1)*h(i)^2/6-((y(i+1)-y(i))/h(i)-(M(i+1)-M(i))*h(i)/6)*x(i+1);b(i)=((y(i+1)-y(i))/h(i)-(M(i+1)-M(i))*h(i)/6)*t;c(i)=(t-x(i))^3*M(i+1)/(6*h(i));e(i)=(x(i+1)-t)^3*M(i)/(6*h(i));f(i)=a(i)+b(i)+c(i)+e(i);%f(i)=M(i)*(x(i+1)-t)^3/(6*h(i))+M(i+1)*(t-x(i))^3/(6*h(i))+(y(i)-M(i)*h(i)^2/6)*(x(i+1)-t)/h(i)+(y(i+1)-x(i+1)*h(i)^2/6)*(t-x(i))/h(i);% f(i)=((x(j+1)-x)^3)*M(i)/(6*h(i))+((x-x(i))^3)*M(i+1)/(6*h(i))+(y(i)-M(i)*(h(i)^2)/6)*((x(i+1)-x)/h(i))+(y(i+1)-(M(i+1)*(h(i)^2)/6))*((x-x(i))/h(i));
end%化简f=collect(f);f=vpa(f,6);if(nargin==5)nn=length(x0);
for i=1:nnfor j=1:n-1if(x0(i)>=x(j)&x0(i)<=x(j+1))yynum(i)=subs(f(j),'t',x0(i));   %计算插值点的函数值.subs是替换函数,把x0用t替换endend
end   
f=yynum;
elsef=collect(f);          %将插值多项式展开f=vpa(f,6);            %将插值多项式的系数化成6位精度的小数
end
end
 
 
SplineThree.m
<pre name="code" class="plain">% x=[-1.5 0 1 2];
% y=[0.125 -1 1 9];
% dy1=0.75;
% dyn=14;
% x0=1.5;
% answer=SplineThree(x,y,dy1,dyn);
% 
% X=[-1.5 0 1 2];
% Y=[0.125 -1 1 9];
% dY=[0.75 14]
% m=5;
% spline3(X,Y,dY,x0,m)X=0:2*pi;
Y=sin(X);
dY=[1,1];
dy1=1;
dyn=1;
xx=0:0.5:6;
m=5;
% for i=1:length(xx)
% spline3(X,Y,dY,xx,m);
% end
yy=SplineThree(X,Y,dy1,dyn,xx);
plot(xx,yy,'r')

本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李宏毅机器学习课程10~~~卷积神经网络

卷积的意义 数字图像是一个二维的离散信号&#xff0c;对数字图像做卷积操作其实就是利用卷积核&#xff08;卷积模板&#xff09;在图像上滑动&#xff0c;将图像点上的像素灰度值与对应的卷积核上的数值相乘&#xff0c;然后将所有相乘后的值相加作为卷积核中间像素对应的图像…

matlab自带的插值函数interp1的四种插值方法

x0:2*pi; ysin(x); xx0:0.5:2*pi;%interp1对sin函数进行分段线性插值&#xff0c;调用interp1的时候&#xff0c;默认的是分段线性插值 y1interp1(x,y,xx); figure plot(x,y,o,xx,y1,r) title(分段线性插值)%临近插值 y2interp1(x,y,xx,nearest); figure plot(x,y,o,xx,y2,r); …

拉格朗日插值法(Lagrange)

拉格朗日插值法是基于基函数的插值方法&#xff0c;插值多项式可以表示为&#xff1a; 其中称为 i 次基函数 Matlab中拉格朗日插值法函数为:Language 功能&#xff1a;求已知点数据点的拉格朗日多项式 调用格式&#xff1a;fLagrange(x,y) 或者 f ’Lagrange(x,y,x0) 其中&a…

当你在应用机器学习时你应该想什么

如今, 机器学习变得十分诱人, 它已在网页搜索, 商品推荐, 垃圾邮件检测, 语音识别, 图像识别, 自然语言处理等诸多领域发挥重要作用. 和以往我们显式地通过编程告诉计算机如何进行计算不同, 机器学习是一种数据驱动方法(data-driven approach). 然而, 有时候机器学习像是一种”…

利用均差的牛顿插值法(Newton)

函数f的零阶均差定义为 &#xff0c;一阶定义均差为&#xff1a; 一般地&#xff0c;函数f 的k阶均差定义为&#xff1a; 或者上面这个式子求的k1阶均差 利用均差的牛顿插值法多项式为&#xff1a; 简单计算的时候可以观看下面的差商&#xff08;均差&#xff09;表&#xff1a…

深度学习(Deep Learning)读书思考三:正则化

概述 正则化是机器学习中非常重要并且非常有效的减少泛华误差的技术&#xff0c;特别是在深度学习模型中&#xff0c;由于其模型参数非常多非常容易产生过拟合。因此研究者也提出很多有效的技术防止过拟合&#xff0c;比较常用的技术包括&#xff1a; 参数添加约束&#xff0c;…

利用差分的牛顿插值法(Newton)

差分牛顿插值法要求是等距的。 先来看三个概念 差分与均差的关系如下&#xff1a; 牛顿(Newton)插值的基本公式为&#xff1a; 由于差分插值是等距的&#xff0c;所以可以设xx0nh 对于上式 再由差分和均差的关系&#xff0c;可以将上面的黄色部分也就是牛顿插值基本公式转换…

埃尔米特(Hermite)插值

Hermite插值满足在节点上等于给定函数值&#xff0c;而且在节点上的导数值也等于给定的导数值。对于高阶导数的情况&#xff0c;Hermite插值多项式比较复杂&#xff0c;在实际情况中&#xff0c;常常遇到的是函数值与一阶导数给定的情况。在此情况下&#xff0c;n个节点x1,x2,……

keras创建模型

关于Keras模型 Keras有两种类型的模型&#xff0c;序贯模型&#xff08;Sequential&#xff09;和函数式模型&#xff08;Model&#xff09;&#xff0c;函数式模型应用更为广泛&#xff0c;序贯模型是函数式模型的一种特殊情况。 Sequential models&#xff1a;这种方法用于实…

多项式曲线拟合最小二乘法

对给定的试验数据点(xi,yi)(i1,2,……,n),可以构造m次多项式 数据拟合的最简单的做法就是使误差p(xi)-yi的平方和最小 当前任务就是求一个P(x)使得 从几何意义上讲就是寻求给与定点(xi,yi)距离的平方和最小的曲线yp(x)&#xff0c;函数p(x)称为拟合函数或者是最小二乘解&#x…

运动合成——机器学习技术

参考文献&#xff1a;《人体运动合成中的机器学习技术合成综述》 根据机器学习的用途分类&#xff0c;在图形学中使用到的大致如下&#xff1a; 1> 回归和函数逼近。回归是一种插值技术&#xff0c;分析已知数据点来合成新的数据。 2> 降维。从高维数的运动数据…

ICA独立成分分析—FastICA基于负熵最大

1. 概念 官方解释&#xff1a;利用统计原理进行计算的方法&#xff0c;是一种线性变换。 ICA分为基于信息论准则的迭代算法和基于统计学的代数方法两大类&#xff0c;如FastICA算法&#xff0c;Infomax算法&#xff0c;最大似然估计算法等。 这里主要讨论FastICA算法。 先来…

tensorboard的可视化及模型可视化

待整理 How to Check-Point Deep Learning Models in Keras LossWise Tensorboard 中文社区 谷歌发布TensorBoard API&#xff0c;让你自定义机器学习中的可视化 查找tensorflow安装的位置 pip show tensorflow-gpu Name: tensorflow-gpu Version: 1.0.1 Summary: TensorFl…

隐马尔科夫模型——简介

1. 前言 学习了概率有向图模型和概率无向图模型&#xff0c;回头再看了一下隐马尔可夫模型(hidden Markov model&#xff0c;HMM)。 HMM属于树状有向概率图模型&#xff0c;主要用于对时序数据的建模&#xff0c;它的潜在变量是离散的&#xff1b;而另一种状态空间模型&…

训练的神经网络不工作?一文带你跨过这37个坑

近日&#xff0c;Slav Ivanov 在 Medium 上发表了一篇题为《37 Reasons why your Neural Network is not working》的文章&#xff0c;从四个方面&#xff08;数据集、数据归一化&#xff0f;增强、实现、训练&#xff09;&#xff0c;对自己长久以来的神经网络调试经验做了 37…

HMM——前向算法与后向算法

1. 前言 前向算法和后向算法主要还是针对HMM三大问题之一的评估问题的计算&#xff0c;即给定模型参数&#xff0c;计算观察序列的概率。文章不介绍过多公式&#xff0c;主要看两个例子 复习一下HMM的三大要素&#xff08;以海藻&#xff08;可观测&#xff09;和天气&#x…

HMM——维特比算法(Viterbi algorithm)

1. 前言 维特比算法针对HMM第三个问题&#xff0c;即解码或者预测问题&#xff0c;寻找最可能的隐藏状态序列&#xff1a; 对于一个特殊的隐马尔可夫模型(HMM)及一个相应的观察序列&#xff0c;找到生成此序列最可能的隐藏状态序列。 也就是说给定了HMM的模型参数和一个观测…

HMM——前向后向算法

1. 前言 解决HMM的第二个问题&#xff1a;学习问题&#xff0c; 已知观测序列&#xff0c;需要估计模型参数&#xff0c;使得在该模型下观测序列 P(观测序列 | 模型参数)最大&#xff0c;用的是极大似然估计方法估计参数。 根据已知观测序列和对应的状态序列&#xff0c;或者说…

Web安全(吴翰清)

安全工程师的核心竞争力不在于他能拥有多少个 0day&#xff0c;掌握多少种安全技术&#xff0c;而是在于他对安全理解的深度&#xff0c;以及由此引申的看待安全问题的角度和高度。 第一篇 我的安全世界观 脚本小子 “Script Kids”。 黑客精神所代表的 Open、Free、Share。…

机器学习两种方法——监督学习和无监督学习(通俗理解)

前言 机器学习分为&#xff1a;监督学习&#xff0c;无监督学习&#xff0c;半监督学习&#xff08;也可以用hinton所说的强化学习&#xff09;等。 在这里&#xff0c;主要理解一下监督学习和无监督学习。 监督学习&#xff08;supervised learning&#xff09; 从给定的训…