1、时 其中基函数 , = 2.1.2优缺点可对插值函数选择多种不同的函数类型,由于代数多项式具有简单和一些良好的特性,故常选用代数多项式作为插值函数。利用插值基函数很容易得到拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为方便,但当插值节点增减时全部插值基函数均要随之变化,整个公式也将发生变化,这在实际计算中是很不方便的,为了克服这一缺点,提出了牛顿插值可以克服这一缺点。2.1.3数值实验程序如下:#include#define TRUE 1#define FALSE 0#define N 10#define M 2void main(void) double xN,yN,a,lN; int
2、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) 对不起,你输入错误!n请确保你输入的N满足2=N=%d.,N);n flag=TRUE; while(flag=TRUE);n请输入需要计算的X值:%lfa); for(i=0;in;i+) 请输入第%d组(X,Y)的值:,i+1);%lf%lf,x+i,y+i); li=1.0f; for(j=0;jN;j+) if(i!=j) li*=(
3、a-xj)/(xi-xj); else continue; answer+=li*yi;f(%.3lf)=%lfn,a,answer);2.2牛顿插值2.2.1基本原理构造n次多项式称为牛顿插值多项式,其中 (二个节点,一阶差商) (三个节点,二阶差商) (n+1个节点,n阶差商)注意:由于插值多项式的唯一性,有时为了避免拉格朗日余项Rn(x)中n+1阶导数的运算,用牛顿插值公式2.2.2优缺点牛顿插值法具有承袭性和易变性的特点,当增加一个节点时,只要再增加一项就可以了即而拉格朗日插值若要增加一个节点时全部基函数都需要重新算过。牛顿插值法既适合于用来计算函数值,也适合于做理论推导,比如说可用来
4、推导微分方程的数值求解公式。2.2.3数值实验#include stdafx.hvoid 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;请输入节点个数w=100: w); for(n=0;nw;n+) printf(x=%fxn);f(x)=f1n); fn0=f1n; for(j=1;j+) k=j; for(p=0;kk+,p+) fkj=(fkj-1-fk-1j-1)/(xk-xp); xi f(xi) 1阶差商 for(i1=1;i1=0)
5、 if(xi1=10&xi1=100) else printf( else if(xi1=-10)=-100) for(i2=0;i2=0) if(fi1i210)%.5f ,fi1i2); else if(fi1i2nN%d(x)=%.5f+,n-1,f00);i1+) if(i1=j) if(fi1j0) (%.5f),fi1j);%.5f for(k=0;j;k+) (x-%.5f),xk); if(jxi1) break; if(n-i1)=3) i2=i1; else i1=i1-2; if(i1=0) i2=i1; i2=i1+1; i1=i2; N1=fi10;4;j+,i1+)
6、 N2=N2*fi1+1i1+1; for(k=i2;i2+j; N2=N2*(x1-xk); N3=N2+N3; N2=1.0; N3=N1+N3;N3(%.5f)=%.5fn,x1,N3); N3=0.0; N1=f00; for(i2=0;i1;i2+) N2=N2*(x2-xi2); N2=N2*fi1i1;N%d(%.5f)=%.5fn,n-1,x2,N3);2.3 埃尔米特插值2.3.1基本原理设在个互不相同的节点处,已知要求插值多项式满足:这类问题与前面的插值问题的区别在于不仅要求在节点上的函数值相等,而且还要求导数也相等,甚至要求高阶导数也相等.求次数不超过的多项式使得: 1)
7、 2)类似求Lagrange插值多项式的方法,通过构造基函数的方法.若能够构造出基函数满足条件 ;=则容易得到如下:确定基函数: 插值余项,若在内的阶导数存在,则插值余项,其中且与有关.2.3.2优缺点 Hermite插值多项式具有唯一性和承袭性的特点,对相应于条件的的组合形式可以找出尽可能多的条件给出的根,根据多项式的总阶数和根的个数写出表达式,但表达式具有唯一性,可以根据尚未利用的条件解出表达式中的待定系数,在这里待定系数法任适用,但插值节点多时比较麻烦.2.3.3数值实验struct HINTEPint n;double *x;double *y;double *dy;double t;
8、hp,ha;double hermite(struct HINTEP *hp)int num,i,j;double *x,*y,*dy,pio,z,p,q,s;num=hp-x=hp-x;y=hp-y;dy=hp-dy;pio=hp-t;z=2.0;for(i=1;=num;s=1.0;for(j=1;if(j!=i) s*=(pio-xj-1)/(xi-1-xj-1);s=s*s;p=0.0;=i) p+=1.0/(xi-1-xj-1);q=yi-1+(pio-xi-1)*(dyi-1-2.0*yi-1*p);z+=q*s;return(z);main()double x10=3.0,5.0,8.0,13.0,17.0,25.0,27.0,29.0,31.0,35.0;double y10=7.0,10.0,11.0,17.0,23.0,18.0,13.0,6.0,3.0,1.0;double dy10;int i;struct HINTEP ha=10,x,y,dy,19.0;for(i=0;=9;dyi=-yi;printf(npio=%6.3f,z=%enn,ha.t,hermite(&ha);
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2