您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 汽车理论 > 分段三次Hermite插值
摘要用函数来表示变量间的数量关系广泛应用于各学科领域,但是在实际问题中,往往是通过实验、观测以及计算等方法,得到的是函数在一些点上的函数值。如何通过这些离散数据找到函数的一个满足精度要求且便于使用的近似表达式,是经常遇到的问题。对于这类问题我们解决的方法为插值法,而最常用也最简单的插值方法就是多项式插值。当然用插值法得到的近似表达式必须满足插值条件即假设给定了n+1个点的自变量的值以及函数值,近似函数必须要过这n+1个点。多项式插值,从几何角度看,就是寻求n次代数曲线y=Pn(x)通过n+1个点作为f(x)的近似。但是随着插值节点个数的增加,高次插值多项式的近似效果并不理想。根据大量实验得出,在进行高次多项式插值时,会出现龙格现象。因此,为了解决这样的一个问题,我们可以通过缩小插值区间的办法达到减小误差的目的。但是当在每个小区间上用一次函数进行插值时,有很好的收敛性但是光滑度不够,因此本实验将用三次Hermite进行插值,做具体的讨论和学习。关键词:龙格现象分段差值三次Hermite进行插值11、实验目的1)通过对分段三次Hermite插值算法程序的编写,提高自己编写程序的能力2)体会分段三次Hermite插值比分段线性插值优越在哪里3)用实验报告的形式展现,提高自己在写论文方面的能力2、算法流程分段线性插值多项式𝑆(𝑥)在插值区间[𝑎,𝑏]上只能保证连续性,而不光滑。要想得到在插值区间上光滑的分段线性插值多项式,可采用分段埃尔米特(Hermite)插值,这里我们考虑在整个[𝑎,𝑏]上用分段三次埃尔米特插值多项式来逼近𝑓(𝑥)。一般的将带有导数的插值多项式称为Hermite插值多项式。如果已知函数y=f(x)在节点a=𝑥0𝑥1⋯𝑥𝑛=b处的函数的值和导数值:𝑦𝑖=𝑓(𝑥𝑖),𝑦𝑖′=𝑓′(𝑥𝑖),𝑖=0,1,2,⋯,𝑛则在小区间[𝑥𝑖−1,𝑥𝑖]上有四个插值条件:𝑦𝑖−1=𝑓(𝑥𝑖−1),𝑦𝑖=𝑓(𝑥𝑖)𝑦′𝑖−1=𝑓′(𝑥𝑖−1),𝑦𝑖′=𝑓′(𝑥𝑖)故能构造一个三次多项式𝐻𝑖(𝑥),并称为三次Hermite插值多项式。这时在整个[𝑎,𝑏]上可以用分段三次Hermite插值多项式来逼近𝑓(𝑥)。𝐻(𝑥)={𝐻1(𝑥),𝑥∈[𝑥0,𝑥1]𝐻2(𝑥),𝑥∈[𝑥1,𝑥2]⋯⋯⋯⋯⋯⋯⋯𝐻𝑛(𝑥),𝑥∈[𝑥𝑛−1,𝑥𝑛]其中𝐻𝑖(𝑥),𝑥∈[𝑥𝑖−1,𝑥𝑖]满足条件:𝐻𝑖(𝑥𝑖−1)=𝑓(𝑥𝑖−1)=𝑦𝑖−1,𝐻𝑖(𝑥𝑖)=𝑓(𝑥𝑖)=𝑦𝑖𝐻′𝑖(𝑥𝑖−1)=𝑓′(𝑥𝑖−1)=𝑦′𝑖−1,𝐻′𝑖(𝑥𝑖)=𝑓′(𝑥𝑖)=𝑦′𝑖关于𝐻𝑖(𝑥)的构造,我们可以通过基函数来进行,这时令𝐻𝑖(𝑥)=𝑦𝑖−1𝜑𝑖−1(𝑥)+𝑦𝑖𝜑𝑖(𝑥)+𝑦′𝑖−1𝜓𝑖−1(𝑥)+𝑦′𝑖𝜓𝑖(𝑥)2其中𝜑𝑖−1(𝑥)、𝜑𝑖(𝑥)、𝜓𝑖−1(𝑥)和𝜓𝑖(𝑥)均为三次多项式,并称为三次Hermite插值多项式的基函数。对上式两边关于x求导,得到𝐻′𝑖(𝑥)=𝑦𝑖−1𝜑′𝑖−1(𝑥)+𝑦𝑖𝜑′𝑖(𝑥)+𝑦′𝑖−1𝜓′𝑖−1(𝑥)+𝑦′𝑖𝜓′𝑖(𝑥)则由插值条件可以分别给出基函数满足的条件:{𝜑𝑖−1(𝑥𝑖−1)=1,𝜑𝑖(𝑥𝑖−1)=0,𝜓𝑖−1(𝑥𝑖−1)=0,𝜓𝑖(𝑥𝑖−1)=0𝜑𝑖−1(𝑥𝑖)=0,𝜑𝑖(𝑥𝑖)=1,𝜓𝑖−1(𝑥𝑖)=0,𝜓𝑖(𝑥𝑖)=0𝜑′𝑖−1(𝑥𝑖−1)=0,𝜑′𝑖(𝑥𝑖−1)=0,𝜓′𝑖−1(𝑥𝑖−1)=1,𝜓′𝑖(𝑥𝑖−1)=0𝜑′𝑖−1(𝑥𝑖)=0,𝜑′𝑖(𝑥𝑖)=0,𝜓′𝑖−1(𝑥𝑖)=1,𝜓′𝑖(𝑥𝑖)=1下面具体求解基函数𝜑𝑖−1(𝑥)、𝜑𝑖(𝑥)、𝜓𝑖−1(𝑥)和𝜓𝑖(𝑥)。由上面的条件的第一列可以得到𝜑𝑖−1(𝑥)满足条件:𝜑𝑖−1(𝑥𝑖−1)=1,𝜑𝑖−1(𝑥𝑖)=0,𝜑′𝑖−1(𝑥𝑖−1)=0,𝜑′𝑖−1(𝑥𝑖)=0(1)由上式中的第二、第四个条件可知𝜑𝑖−1(𝑥)应该具有形式𝜑𝑖−1(𝑥)=(𝑥−𝑥𝑖)2(𝑎𝑥+𝑏)(2)这时𝜑′𝑖−1(𝑥)=2(𝑥−𝑥𝑖)(𝑎𝑥+𝑏)+a(𝑥−𝑥𝑖)2(3)再由(1)式中的第一、第三个条件分别带入(2)式(3)式得到{ℎ𝑖2(𝑎𝑥𝑖−1+𝑏)=1−2ℎ𝑖(𝑎𝑥𝑖−1+𝑏)+𝑎ℎ𝑖2=0解此线性方程组得到a=2ℎ𝑖3,b=1ℎ𝑖2−2𝑥𝑖−1ℎ𝑖3将a、b代入(2)式得到𝜑𝑖−1(𝑥)=(𝑥−𝑥𝑖)2(2ℎ𝑖3𝑥+1ℎ𝑖2−2𝑥𝑖−1ℎ𝑖3)=(1+2𝑥−𝑥𝑖−1ℎ𝑖)(𝑥−𝑥𝑖)2ℎ𝑖2类似地有𝜑𝑖(𝑥)=(1−2𝑥−𝑥𝑖−1ℎ𝑖)(𝑥−𝑥𝑖)2ℎ𝑖2𝜓𝑖−1(𝑥)=1ℎ𝑖2(𝑥−𝑥𝑖−1)(𝑥−𝑥𝑖)23𝜓𝑖(𝑥)=1ℎ𝑖2(𝑥−𝑥𝑖)(𝑥−𝑥𝑖−1)2因此将得到𝐻𝑖(𝑥)=[ℎ𝑖+2(𝑥−𝑥𝑖−1)](𝑥−𝑥𝑖)2ℎ𝑖3𝑦𝑖−1+[ℎ𝑖−2(𝑥−𝑥𝑖)](𝑥−𝑥𝑖−1)2ℎ𝑖3𝑦𝑖+(𝑥−𝑥𝑖−1)(𝑥−𝑥𝑖)2ℎ𝑖2𝑦′𝑖−1+(𝑥−𝑥𝑖)(𝑥−𝑥𝑖−1)2ℎ𝑖2𝑦′𝑖这样,便求出了分段三次Hermite插值多项式:𝐻(𝑥)={𝐻1(𝑥),𝑥∈[𝑥0,𝑥1]𝐻2(𝑥),𝑥∈[𝑥1,𝑥2]⋯⋯⋯⋯⋯⋯𝐻𝑛(𝑥),𝑥∈[𝑥𝑛−1,𝑥𝑛]3、数值算例已知下列的条件𝑥𝑖12𝑦𝑖23𝑦′𝑖1-1通过分段三次Hermite插值法,求解当x=1.5时的y值。解:具体的程序如下所示:#includestdafx.hfloatHermite(floatx[],floaty[],floatz[],floatx1,intlen){inti=0;floats=0;floath=0;floatL1=0;floatL2=0;floatL3=0;floatL4=0;4for(i=0;ilen-1;i++){if(x1=x[i]&&x1x[i+1])break;}i=i+1;h=x[i]-x[i-1];L1=(h+2*(x1-x[i-1]))*(x1-x[i])*(x1-x[i])/(h*h*h);L2=(h+2*(x1-x[i]))*(x1-x[i-1])*(x1-x[i-1])/(h*h*h);L3=(x1-x[i-1])*(x1-x[i])*(x1-x[i])/(h*h);L4=(x1-x[i-1])*(x1-x[i-1])*(x1-x[i])/(h*h);s=L1*y[i-1]+L2*y[i]+L3*z[i-1]+L4*z[i];returns;}floatHermite(floatx[],floaty[],floatx1,intlen);voidmain(){floatx[]={1,2};floaty[]={2,3};floatz[]={1,-1};intlen=sizeof(x)/sizeof(x[0]);floatx1=0;floats=0;printf(请输入要求解的x1的值:\n);scanf(%f,&x1);s=Hermite(x,y,z,x1,len);printf(经过分段三次Hermite插值的结果为:\n);printf(%f\n,s);}5运行结果:4、对结果进行分析通过用编程实现对上例的求解,可以看出结果较为准确,但是由于Hermite插值的原理问题,所以本身存在误差,而且由于在计算机上计算,会存在计算误差。5、参考文献[1]秦新强.数值逼近.西安:西安理工大学出版社,2010
本文标题:分段三次Hermite插值
链接地址:https://www.777doc.com/doc-5487128 .html