三次样条插值---matlab实现
- 格式:doc
- 大小:54.00 KB
- 文档页数:2
题目背景:对y=1/(1+x^2)在[-1,1]区间以Xn=-1+0.1*(n-1),n=1 (21)为插值点做三次样条插值求解思路简析:以插值为四段三次函数为例进行说明(题干为插值20段三次函数),可看出方程组为q*x=d,其中q为方程组系数矩阵,x为所求三次函数的系数矩阵,其中方程组系数矩阵和d均呈规律性变化(边界点除外,首位两个点特殊堪虑)function qiujieyangtiao %%定义求解函数q=zeros(80); %%方程组的系数矩阵,赋初值为0n=-1:0.1:1; %%插值点的横坐标nd=zeros(80,1); %%插值点q*x=d中的dy=zeros(21,1); %%插值点的纵坐标向量a=1;for i=-1:0.1:1y(a)=1/(1+i^2);a=a+1; %%给插值点的纵坐标y通过原函数赋值endq(1,3)=2;q(1,4)=6*n(1);q(2,1)=1;q(2,2)=n(1);q(2,3)=n(1)^2;q(2,4)=n(1)^3;d(2)=y(1); %%给左端边界点的两个方程组系数赋值j=2;for i=3:4:75q(i,i-1)=1;q(i,i)=2*n(j);q(i,i+1)=3*n(j)^2;q(i,i+3)=-1;q(i,i+4)=-2*n(j);q(i,i+5)=-3*n(j)^2;d(i)=0;q(i+1,i)=2;q(i+1,i+1)=6*n(j);q(i+1,i+4)=-2;q(i+1,i+5)=-6*n(j);d(i+1)=0;q(i+2,i-2)=1;q(i+2,i-1)=n(j);q(i+2,i)=n(j)^2;q(i+2,i+1)=n(j)^3;d(i+2)=y(j);q(i+3,i+2)=1;q(i+3,i+3)=n(j);q(i+3,i+4)=n(j)^2;q(i+3,i+5)=n(j)^3;d(i+3)=y(j);j=j+1;end %%给系数矩阵赋值q(79,79)=2;q(79,80)=6*n(21);d(79)=0;q(80,77)=1;q(80,78)=n(21);q(80,79)=n(21)^2;q(80,80)=n(21)^3;d(80)=y(21); %%给右端边界点的两个方程组系数赋值result=q\d; %%求解系数矩阵function A=fun(x)if x>=-1&&x<-0.9A=result(1)+result(2)*x+result(3)*x*x+result(4)*x*x*x;elseif x>=-0.9&x<-0.8A=result(5)+result(6)*x+result(7)*x*x+result(8)*x*x*x;elseif x>=-0.8&x<-0.7A=result(9)+result(10)*x+result(11)*x*x+result(12)*x*x*x; elseif x>=-0.7&x<-0.6A=result(13)+result(14)*x+result(15)*x*x+result(16)*x*x*x; elseif x>=-0.6&x<-0.5A=result(17)+result(18)*x+result(19)*x*x+result(20)*x*x*x; elseif x>=-0.5&x<-0.4A=result(21)+result(22)*x+result(23)*x*x+result(24)*x*x*x; elseif x>=-0.4&x<-0.3A=result(25)+result(26)*x+result(27)*x*x+result(28)*x*x*x; elseif x>=-0.3&x<-0.2A=result(29)+result(30)*x+result(31)*x*x+result(32)*x*x*x; elseif x>=-0.2&x<-0.1A=result(33)+result(34)*x+result(35)*x*x+result(36)*x*x*x; elseif x>=-0.1&x<0A=result(37)+result(38)*x+result(39)*x*x+result(40)*x*x*x; elseif x>=0&x<0.1A=result(41)+result(42)*x+result(43)*x*x+result(44)*x*x*x; elseif x>=0.1&x<0.2A=result(45)+result(46)*x+result(47)*x*x+result(48)*x*x*x; elseif x>=0.2&x<0.3A=result(49)+result(50)*x+result(51)*x*x+result(52)*x*x*x; elseif x>=0.3&x<0.4A=result(53)+result(54)*x+result(55)*x*x+result(56)*x*x*x; elseif x>=0.4&x<0.5A=result(57)+result(58)*x+result(59)*x*x+result(60)*x*x*x; elseif x>=0.5&x<0.6A=result(61)+result(62)*x+result(63)*x*x+result(64)*x*x*x; elseif x>=0.6&x<0.7A=result(65)+result(66)*x+result(67)*x*x+result(68)*x*x*x; elseif x>=0.7&x<0.8A=result(69)+result(70)*x+result(71)*x*x+result(72)*x*x*x; elseif x>=0.8&x<0.9A=result(73)+result(74)*x+result(75)*x*x+result(76)*x*x*x; elseA=result(77)+result(78)*x+result(79)*x*x+result(80)*x*x*x; endend %%插值函数用子函数表达,方便调用x=linspace(-1,1);for i=1:length(x)A(i)=fun(x(i));endY=1./(1+x.^2);plot(x,Y,'--',x,A,':')legend('primitive','fitting') %%将原函数与该插值函数画在同一图上进行比较grid ontitle('三次样条插值')for m=1:20fprintf("S%d=%.3f+%.3f*x+%.3f*x.^2+%.3f*x.^3\n",m,result(4*m-3,1),result(4*m-2,1),result(4*m-1,1),result(4*m,1)) %%输出结果endend输出结果:S1=2.049+3.619*x+3.104*x.^2+1.035*x.^3S2=1.010+0.156*x+-0.743*x.^2+-0.390*x.^3S3=1.137+0.632*x+-0.149*x.^2+-0.143*x.^3S4=1.054+0.273*x+-0.660*x.^2+-0.386*x.^3S5=1.023+0.120*x+-0.916*x.^2+-0.528*x.^3S6=1.003+-0.002*x+-1.160*x.^2+-0.691*x.^3S7=0.997+-0.044*x+-1.265*x.^2+-0.779*x.^3S8=0.998+-0.034*x+-1.233*x.^2+-0.743*x.^3S9=1.000+-0.010*x+-1.113*x.^2+-0.543*x.^3S10=1.000+-0.000*x+-1.010*x.^2+-0.200*x.^3S11=1.000+-0.000*x+-1.010*x.^2+0.200*x.^3S12=1.000+0.010*x+-1.113*x.^2+0.543*x.^3S13=0.998+0.034*x+-1.233*x.^2+0.743*x.^3S14=0.997+0.044*x+-1.265*x.^2+0.779*x.^3S15=1.003+0.002*x+-1.160*x.^2+0.691*x.^3S16=1.023+-0.120*x+-0.916*x.^2+0.528*x.^3S17=1.054+-0.273*x+-0.660*x.^2+0.386*x.^3S18=1.137+-0.632*x+-0.149*x.^2+0.143*x.^3S19=1.010+-0.156*x+-0.743*x.^2+0.390*x.^3S20=2.049+-3.619*x+3.104*x.^2+-1.035*x.^3对比图。
用Matlab实现了3次样条曲线插值的算法。
边界条件取为自然边界条件,即:两个端点处的2阶导数等于0;共包含3各个函数文件,主函数所在文件(即使用的时候直接调用的函数)为spline3.m,另外两个函数文件是在splin3函数文件中被调用的自定义函数。
一个是GetParam.m,一个是GetM.m。
%GetParam.m文件的内容:%根据给定的离散点的横坐标所构成的向量,计算各个区间段的h值;function GetParam(Vx,Vy)global gh;global gf;global gu;global gr;global gd;global gff;global gM;%global gn;%n=length(Vx);%length()为向量Vx所含元素的个数;%n=legth(Vx);%gn=n;%n=gn;n=length(Vx);gh(1)=Vx(2)-Vx(1);gf(1)=(Vy(2)-Vy(1))/gh(1);for i=2:1:n-1%从区间0到区间n-1; gh(i)=Vx(i+1)-Vx(i);gf(i)=(Vy(i+1)-Vy(i))/gh(i);gu(i)=gh(i-1)/(gh(i-1)+gh(i));gr(i)=1-gu(i);gff(i)=(gf(i-1)-gf(i))/(Vx(i-1)-Vx(i+1)); gd(i)=6*gff(i);end%设置与边界条件有关的参数;gM(1)=0;%起点的2阶导数;gM(n)=0;%终点的2阶导数;end%GetM.m文件的内容:function GetM(Vx)global gh;global gf;global gu;global gr;global gd;global gff;global gM;%global gn;nn=length(Vx);%nn=gn;n=nn-2;b=zeros(n,1);A=zeros(n,n);A(1,1)=2;A(1,2)=gr(2);b(1)=gd(2)-gu(2)*gM(1);for i=2:1:n-1A(i,i)=2;A(i,i-1)=gu(i+1);A(i,i+1)=gr(i+1);b(i)=gd(i+1);endA(n,n-1)=gu(n);A(n,n)=2;b(n)=gd(nn-1)-gr(nn-1)*gM(nn); X=(inv(A))*b;for i=2:1:nn-1gM(i)=X(i-1);end%主函数文件spline3.m的内容:function result=spline3(x,Vx,Vy) global gh;global gf;global gu;global gr;global gd;global gff;global gM;%global gn;GetParam(Vx,Vy);GetM(Vx);%n=length(Vx);%n=gn;n=length(Vx);nn=length(x);y=zeros(1,nn);for j=1:1:nni=1;while(x(j)>Vx(i+1))endsn=i;t1=(Vx(sn+1)-x(j))^3/(6*gh(sn));t1=t1*gM(sn);t2=(x(j)-Vx(sn))^3/(6*gh(sn));t2=t2*gM(sn+1);t3=Vy(sn)-gM(i)*((gh(i))^2)/6;t3=t3*(Vx(sn+1)-x(j))/gh(sn);t4=Vy(sn+1)-gM(sn+1)*((gh(sn))^2)/6;t4=t4*(x(j)-Vx(sn))/gh(sn);y(j)=t1+t2+t3+t4;endresult=y;end函数调用的时候,result=spline3(x,Vx,Vy),x为代求点的横坐标向量,(Vx,Vy)为已知的点的坐标。
文章标题:深度解析Matlab三次样条插值1. 前言在数学和工程领域中,插值是一种常见的数值分析技术,它可以用来估计不连续数据点之间的值。
而三次样条插值作为一种常用的插值方法,在Matlab中有着广泛的应用。
本文将从简单到复杂,由浅入深地解析Matlab中的三次样条插值方法,以便读者更深入地理解这一技术。
2. 三次样条插值概述三次样条插值是一种利用分段三次多项式对数据点进行插值的方法。
在Matlab中,可以使用spline函数来进行三次样条插值。
该函数需要输入数据点的x和y坐标,然后可以根据需要进行插值操作。
3. 三次样条插值的基本原理在进行三次样条插值时,首先需要对数据点进行分段处理,然后在每个分段上构造出一个三次多项式函数。
这些多项式函数需要满足一定的插值条件,如在数据点处函数值相等、一阶导数相等等。
通过这些条件,可以得到一个关于数据点的插值函数。
4. Matlab中的三次样条插值实现在Matlab中,可以使用spline函数来进行三次样条插值。
通过传入数据点的x和y坐标,可以得到一个关于x的插值函数。
spline函数也支持在已知插值函数上进行插值点的求值,这为用户提供了极大的灵活性。
5. 三次样条插值的适用范围和局限性虽然三次样条插值在许多情况下都能够得到较好的插值效果,但也存在一些局限性。
在数据点分布不均匀或有较大噪音的情况下,三次样条插值可能会出现较大的误差。
在实际应用中,需要根据具体情况选择合适的插值方法。
6. 个人观点和总结通过对Matlab中三次样条插值的深度解析,我深刻地理解了这一插值方法的原理和实现方式。
在实际工程应用中,我会根据数据点的情况选择合适的插值方法,以确保得到准确且可靠的结果。
我也意识到插值方法的局限性,这为我在实际工作中的决策提供了重要的参考。
通过以上深度解析,相信读者已经对Matlab中的三次样条插值有了更加全面、深刻和灵活的理解。
在实际应用中,希望读者能够根据具体情况选择合适的插值方法,以提高工作效率和准确性。
三次样条插值函数为()()[)()[]1011,,,,n n n S x x x x S x S x x x x-⎧∈⎪=⎨⎪∈⎩ 利用三次埃尔米特插值函数表示三次样条插值函数,即()()()()())111111,,j j j j j j j j j j j S x y x y x m x m x x x x ααββ++++++⎡=+++∈⎣(0,1,,1j n =-)基函数满足()()()()()()21112111121121111212jj j j j j j j j j j j j j j j j j j jj j j j x x x x x x x x xx xx x x x x x xx xx x x x xx x x x x x xααββ++++++++++++⎛⎫⎛⎫--=+ ⎪⎪ ⎪⎪--⎝⎭⎝⎭⎛⎫⎛⎫--=+ ⎪⎪ ⎪⎪--⎝⎭⎝⎭⎛⎫-=-⎪ ⎪-⎝⎭⎛⎫-=-⎪ ⎪-⎝⎭由上式易得()()()()()()()()()()()()()()1331111331112211112211612612246246j j j j j j j j j j j j j j j j j j j j j j jj j j j j x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x xx ααββ+++++++++++++++''=---+''=-+--+''=---+''=---则有()()()()()()()()()()()111111113333111111122221111661212242466j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j S x y x y x m x m x x x x x y x y x x x x x x x x x x x x x m x m x x x x x x x x x ααββ+++++++++++++++++++''''''''''=+++⎡⎤⎡⎤++⎢⎥⎢⎥=-+-+⎢⎥⎢⎥----⎣⎦⎣⎦⎡⎤++⎢⎥+-+-⎢⎥----⎣⎦)1,j j x x x +⎡⎤⎢⎥⎡∈⎣⎢⎥⎣⎦(0,1,,1j n =-)同理有()()()()()()()()()()()()()()()11111113333111111122221111661212242466j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j S x y x y x m x m x x x x x y x y x x x x x x x x x x x x x m x m x x x x x x x x x ααββ------------------''''''''''=+++⎡⎤⎡⎤++⎢⎥⎢⎥=-+-+⎢⎥⎢⎥----⎣⎦⎣⎦⎡⎤⎡++⎢⎥+-+-⎢⎥----⎣⎦⎣)1,j j x x x -⎤⎢⎥⎡∈⎣⎢⎥⎦(1,,j n =)根据样条函数二阶导数连续性,即()()100j j j j S x S x +''''+=-(1,,1j n =-)即()()()()()()()()()()()()()()()()111111332211111111113322111166426624j j jj j j j j j j jj j jj j j j j j jj j j j jj j j j j jjj jj jj jj x x y x x y x x x x m m x x xx xx xx x x y x x y x x x x m m x x xx xx xx ++++++++++--------------+++--------=+++----(1,,1j n =-)化简得()()()()()111111111111233j j j j j j j j j j j j j j j j j j jj j xx m x x m x x m x x x x y y y y x x x x +-+--+-++-+--+-+---=-+---(1,,1j n =-)可得线性方程组()()()()()()()()()()0121201023231213121221111110212110211032213221322122233333n n n n n n n n n n n n m m x x x x x x m x x x x x x m x x x x x x m m m x x x x y y y y x x x x x x x x y y y y x x x x y ------⨯+-+⨯⎛⎫ ⎪ ⎪ ⎪---⎛⎫⎪ ⎪--- ⎪ ⎪⎪ ⎪⎪ ⎪ ⎪--- ⎪⎝⎭ ⎪ ⎪ ⎪⎝⎭---+------+---=()()()121112112113n n n n n n n n n n n n n x x x x y y y x x x x ----------⨯⎛⎫⎪ ⎪ ⎪ ⎪⎪⎪ ⎪-- ⎪-+- ⎪--⎝⎭为了使样条插值问题有惟一解,我们在原有方程基础上增加两个边界条件。
如何运用MATLAB 三次样条插值的问题,今天做作业,突然想用Matlab搞搞。
题目如下:清华大学出版社的《数值分析(第5版)》P49,20题。
x=[0.25 0.3 0.39 0.45 0.53];y=[ 0.5 0.5477 0.6245 0.6708 0.7280 ]pp=csape(x,y,'second',[0,0.0]);disp(pp.coefs);其中COEFS的含义是在Xi-Xi+1区间上的多项式是,例如COEFS数组第一行的意思是在X=0.25到X=0.3的区间上时表达式是-6.2652*(X-0.25)^3+0.9697*(X-0.25)^1+0.5;-6.2652 0.0000 0.9697 0.50001.8813 -0.9398 0.9227 0.5477-0.4600 -0.4318 0.7992 0.62452.1442 -0.5146 0.7424 0.6708关于csape的用法引用自:/ck436/blog/item/6fe40c46400d3c046b63e52b.htmlcsape,是计算在各种边界条件下的三次样条插值。
pp = csape(x,y,conds)其中conds主要有以下的选项variational(自然边界条件,首末点二阶导数均为0),second (指定首末点的二阶导数),periodic(周期性边界条件,首末点的0~2阶导数相等),complete (给定导数情况,默认)function pp = csape(x,y,conds,valconds)%pp=csape(x,y,'变界类型','边界值'),生成各种边界条件的三次样条插值. 其中,(x,y)为数据向量%边界类型可为:'complete',给定边界一阶导数.% 'not-a-knot',非扭结条件,不用给边界值.% 'periodic',周期性边界条件,不用给边界值.% 'second',给定边界二阶导数.% 'variational',自然样条(边界二阶导数为0)% .%例考虑数据% x | 1 2 4 5% ---|-------------% y | 1 3 4 2%边界条件S''(1)=2.5,S''(5)=-3,% x=[1 2 4 5];y=[1 3 4 2];% pp=csape(x,y,'second',[2.5,-3]);pp.coefs % xi=1:0.1:5;yi=ppval(pp,xi);% plot(x,y,'o',xi,yi);。
MATLAB作业给定一个时间序列,使用三次样条插值方法进行均匀内插(题目的相关说明:按题目要求编写一个MATLAB程序函数,并把自己编制程序所得的结果与MATLAB库函数分析结果进行对比。
)理论基础:时间序列的概念:时间序列是一种定量预测方法,又称简单外延法,时间序列分析是根据系统观测得到的时间序列数据,通过曲线拟合和参数估计来建立数学模型的理论与方法,时间序列分析可分为以下三种情况(1)把一个时间序列的值变动为N 个组成部分,通常可以分为四种 a、倾向变动,又称长期趋势变动 b、循环变动,又称周期变动 c、季节变动,即每年有规则的反复进行变动 d、不规则变动,即随机变动。
然后把这四个综合到一起得出预测的结果。
虽然分成这四部分,但这四部分之间的相互关系是怎么样的呢,目前一般采用相乘的关系,其实各个部分都是在其他部分作用的基础上进行作用的,所以采用相乘是有一定依据的,此种方法适合于短期预测和库存预测(2)把预测对象、预测目标和对预测的影响因素都看成为具有时序的,为时间的函数,而时间序列法就是研究预测对象自身变化过程及发展趋势,如果未来预测是线性的,其数学模型为YT+L=aT+bTL,YT+L为未来预测值,aT为截距,bT为斜率,L为由T到需要预测的单位时间数(如5年、10年等)(3)根据预测对象与影响因素之间的关系及影响程度来推算未来,与目标的相关因素很多,只能选择那些因果关系较强的为预测影响的因素,此时间序列法用于短期预测比较有效,若要用于长期预测,还需要结合其他方法才行。
三次样条插值的实际应用:在制造船体和汽车外形等工艺中传统的设计方法是,首先由设计人员按外形要求,给出外形曲线的一组离散点值,施工人员准备好有弹性的样条(一般用竹条或有弹性的钢条)和压铁,将压铁放在点的位置上,调整竹条的形状,使其自然光滑,这时竹条表示一条插值曲线,我们称为样条函数。
从数学上看,这一条近似于分段的三次多项式,在节点处具有一阶和二阶连续微商。
MATLAB作业给定一个时间序列,使用三次样条插值方法进行均匀内插(题目的相关说明:按题目要求编写一个MATLAB程序函数,并把自己编制程序所得的结果与MATLAB库函数分析结果进行对比。
)理论基础:时间序列的概念:时间序列是一种定量预测方法,又称简单外延法,时间序列分析是根据系统观测得到的时间序列数据,通过曲线拟合和参数估计来建立数学模型的理论与方法,时间序列分析可分为以下三种情况(1)把一个时间序列的值变动为N 个组成部分,通常可以分为四种 a、倾向变动,又称长期趋势变动 b、循环变动,又称周期变动 c、季节变动,即每年有规则的反复进行变动 d、不规则变动,即随机变动。
然后把这四个综合到一起得出预测的结果。
虽然分成这四部分,但这四部分之间的相互关系是怎么样的呢,目前一般采用相乘的关系,其实各个部分都是在其他部分作用的基础上进行作用的,所以采用相乘是有一定依据的,此种方法适合于短期预测和库存预测(2)把预测对象、预测目标和对预测的影响因素都看成为具有时序的,为时间的函数,而时间序列法就是研究预测对象自身变化过程及发展趋势,如果未来预测是线性的,其数学模型为YT+L=aT+bTL,YT+L为未来预测值,aT为截距,bT为斜率,L为由T到需要预测的单位时间数(如5年、10年等)(3)根据预测对象与影响因素之间的关系及影响程度来推算未来,与目标的相关因素很多,只能选择那些因果关系较强的为预测影响的因素,此时间序列法用于短期预测比较有效,若要用于长期预测,还需要结合其他方法才行。
三次样条插值的实际应用:在制造船体和汽车外形等工艺中传统的设计方法是,首先由设计人员按外形要求,给出外形曲线的一组离散点值,施工人员准备好有弹性的样条(一般用竹条或有弹性的钢条)和压铁,将压铁放在点的位置上,调整竹条的形状,使其自然光滑,这时竹条表示一条插值曲线,我们称为样条函数。
从数学上看,这一条近似于分段的三次多项式,在节点处具有一阶和二阶连续微商。