分段三次Hermite插值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
用函数来表示变量间的数量关系广泛应用于各学科领域,但是在实际问题中,往往是通过实验、观测以及计算等方法,得到的是函数在一些点上的函数值。
如何通过这些离散数据找到函数的一个满足精度要求且便于使用的近似表达式,是经常遇到的问题。
对于这类问题我们解决的方法为插值法,而最常用也最简单的插值方法就是多项式插值。
当然用插值法得到的近似表达式必须满足插值条件即假设给定了n+1个点的自变量的值以及函数值,近似函数必须要过这n+1个点。
多项式插值,从几何角度看,就是寻求n次代数曲线y=P n(x)通过n+1个点作为f(x)的近似。
但是随着插值节点个数的增加,高次插值多项式的近似效果并不理想。
根据大量实验得出,在进行高次多项式插值时,会出现龙格现象。
因此,为了解决这样的一个问题,我们可以通过缩
小插值区间的办法达到减小误差的目的。
但是当在每个小区间上用一次函数进行插值时,有很好的收敛性但是光滑度不够,因此本实验将用三次Hermite进行插值,做具体的讨论和学习。
关键词:龙格现象分段差值三次Hermite进行插值
1、实验目的
1)通过对分段三次Hermite插值算法程序的编写,提高自己编写程序的
能力
2)体会分段三次Hermite插值比分段线性插值优越在哪里
3)用实验报告的形式展现,提高自己在写论文方面的能力
2、算法流程
分段线性插值多项式在插值区间上只能保证连续性,而不光滑。
要想得到在插值区间上光滑的分段线性插值多项式,可采用分段埃尔米特(Hermite)插值,这里我们考虑在整个上用分段三次埃尔米特插值多项式来逼近。
一般的将带有导数的插值多项式称为Hermite插值多项式。
如果已知函数在节点处的函数的值和导数值:
则在小区间上有四个插值条件:
故能构造一个三次多项式,并称为三次Hermite插值多项式。
这时在整个上可以用分段三次Hermite插值多项式来逼近。
其中满足条件:
关于的构造,我们可以通过基函数来进行,这时令
其中、、和均为三次多项式,并称为三次Hermite 插值多项式的基函数。
对上式两边关于x求导,得到
则由插值条件可以分别给出基函数满足的条件:
下面具体求解基函数、、和。
由上面的条件的第一列可以得到满足条件:
(1)由上式中的第二、第四个条件可知应该具有形式
(2)这时
(3)再由(1)式中的第一、第三个条件分别带入(2)式(3)式得到
解此线性方程组得到
将a、b代入(2)式得到
类似地有
因此将得到
这样,便求出了分段三次Hermite插值多项式:
3、数值算例
已知下列的条件
1 2
2 3
1 -1
时的y值。
解:具体的程序如下所示:
#include "stdafx.h"
float Hermite(float x[],float y[],float z[],float x1,int len) {
int i=0;
float s=0;
float h=0;
float L1=0;
float L2=0;
float L3=0;
float L4=0;
for(i=0;i<len-1;i++)
{
if(x1>=x[i] && x1<x[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];
return s;
}
float Hermite(float x[],float y[],float x1,int len);
void main()
{
float x[]={1,2};
float y[]={2,3};
float z[]={1,-1};
int len=sizeof(x)/sizeof(x[0]);
float x1=0;
float s=0;
printf("请输入要求解的x1的值:\n");
scanf("%f",&x1);
s=Hermite(x,y,z,x1,len);
printf("经过分段三次Hermite插值的结果为:\n");
printf("%f\n",s);
}
运行结果:
4、对结果进行分析
通过用编程实现对上例的求解,可以看出结果较为准确,但是由于Hermite插值的原理问题,所以本身存在误差,而且由于在计算机上计算,会存在计算误差。
5、参考文献
[1] 秦新强.数值逼近.西安:西安理工大学出版社,2010。