《数值分析论文几种插值方法的比较课程论文》由会员分享,可在线阅读,更多相关《数值分析论文几种插值方法的比较课程论文(10页珍藏版)》请在金锄头文库上搜索。
1、数值分析论文 几种插值方法的比较1插值法概述插值法是函数逼近的重要方法之一,有着广泛的应用 。在生产和实验中,函数或者其表达式不便于计算复杂或者无表达式而只有函数在给定点的函数值(或其导数值) ,此时我们希望建立一个简单的而便于计算的函数,使其近似的代替,有很多种插值法,其中以拉格朗日(Lagrange)插值和牛顿(Newton)插值为代表的多项式插值最有特点,常用的插值还有Hermite插值,分段插值和样条插值.这里主要介绍拉格朗日(Lagrange)插值和牛顿(Newton)插值和埃尔米特插值(Hermite插值)。2插值方法的比较21拉格朗日插值2.1.1基本原理构造次多项式,这是不超过
2、次的多项式,其中基函数: 显然满足 =此时,误差 其中且依赖于,.很显然,当,插值节点只有两个,时 其中基函数 = , = 2.1.2优缺点可对插值函数选择多种不同的函数类型,由于代数多项式具有简单和一些良好的特性,故常选用代数多项式作为插值函数。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值可以克服这一缺点。2.1.3数值实验程序如下:#include#define TRUE 1#define FALSE 0#define N 10
3、#define M 2void main(void) double xN,yN,a,lN; int i,j,n,flag; double answer=0.00f; do printf(创建Lagrange插值多项式共用到N组(X,Y)值,请输入N:); scanf(%d,&n); if(n=M) flag=FALSE; else if(nN|n=1) printf(对不起,你输入错误!n请确保你输入的N满足2=N=%d.,N); printf(n); flag=TRUE; while(flag=TRUE); printf(n请输入需要计算的X值:); scanf(%lf,&a); for(i
4、=0;in;i+) printf(请输入第%d组(X,Y)的值:,i+1); scanf(%lf%lf,x+i,y+i); for(i=0;in;i+) li=1.0f; for(j=0;jN;j+) if(i!=j) li*=(a-xj)/(xi-xj); else continue; answer+=li*yi; printf(f(%.3lf)=%lfn,a,answer); 2.2牛顿插值2.2.1基本原理构造n次多项式称为牛顿插值多项式,其中 (二个节点,一阶差商) (三个节点,二阶差商) (n+1个节点,n阶差商)注意:由于插值多项式的唯一性,有时为了避免拉格朗日余项Rn(x)中n+
5、1阶导数的运算,用牛顿插值公式,其中.2.2.2优缺点牛顿插值法具有承袭性和易变性的特点,当增加一个节点时,只要再增加一项就可以了即而拉格朗日插值若要增加一个节点时全部基函数都需要重新算过。牛顿插值法既适合于用来计算函数值,也适合于做理论推导,比如说可用来推导微分方程的数值求解公式。2.2.3数值实验程序如下:#include stdafx.h#includevoid main(int argc,char* argv) int i1,i2,p,j,k,w,n=0; float x100,f100100,f1100,x1,x2,N1,N2=1.0,N3=0.0; printf(请输入节点个数w=
6、100: ); scanf(%d,&w); for(n=0;nw;n+) printf(x=); scanf(%f,&xn); printf(f(x)=); scanf(%f,&f1n); for(n=0;nw;n+) fn0=f1n; for(j=1;jn;j+) k=j; for(p=0;kn;k+,p+) fkj=(fkj-1-fk-1j-1)/(xk-xp); printf( xi f(xi) 1阶差商); for(i1=1;i1n-1;i1+) printf( %d阶差商,(i1+1); for(i1=0;i1=0) if(xi1=10&xi1=100) printf(n%.5f ,
7、xi1); else printf(n%.5f ,xi1); else if(xi1=-10) printf(n%.5f ,xi1); else if(xi1=-100) printf(n%.5f ,xi1); else printf(n%.5f ,xi1); for(i2=0;i2=0) if(fi1i210) if(fi1i2=100) printf(%.5f ,fi1i2); else printf(%.5f ,fi1i2); else printf(%.5f ,fi1i2); else if(fi1i2=-10) if(fi1i2=-100) printf(%.5f ,fi1i2);
8、else printf(%.5f ,fi1i2); else printf(%.5f ,fi1i2); printf(nN%d(x)=%.5f+,n-1,f00); for(i1=1;i1n;i1+) for(j=1;jn;j+) if(i1=j) if(fi1j0) printf(%.5f),fi1j); else printf(%.5f,fi1j); for(k=0;kj;k+) printf(x-%.5f),xk); printf(n); if(jn-1) printf( +); printf(输入节点x1(用3次多项式计算), scanf(%f%f,&x1,&x2); for(i1=0
9、;i1xi1) break; if(n-i1)=3) i2=i1; else i1=i1-2; if(i1=0) i2=i1; else i2=i1+1; i1=i2; N1=fi10; for(j=1;j4;j+,i1+) N2=N2*fi1+1i1+1; for(k=i2;ki2+j;k+) N2=N2*(x1-xk); N3=N2+N3; N2=1.0; N3=N1+N3; printf(N3(%.5f)=%.5fn,x1,N3); N3=0.0; N1=f00; for(i1=1;i1n;i1+) for(i2=0;i2i1;i2+) N2=N2*(x2-xi2); N2=N2*fi1
10、i1; N3=N2+N3; N2=1.0; N3=N1+N3; printf(N%d(%.5f)=%.5fn,n-1,x2,N3); 2.3 埃尔米特插值2.3.1基本原理设在个互不相同的节点处,已知 ,.要求插值多项式满足: ,.这类问题与前面的插值问题的区别在于不仅要求在节点上的函数值相等,而且还要求导数也相等,甚至要求高阶导数也相等.求次数不超过的多项式使得: 1),. 2),.类似求Lagrange插值多项式的方法,通过构造基函数的方法.若能够构造出基函数,满足条件 ;,. = ;,.则容易得到如下:=确定基函数,:=,.=,. 插值余项,若在内的阶导数存在,则插值余项满足=,其中且与有关.2.3.2优缺点 Hermite插值多项式具有唯一性和承袭性的特点,对相应于条件的,的组合形式可以找