数值计算方法上机题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题二

问题:1.编制通用子程序

对n+1个节点x i及y i=f(x i) (i=1,…n)(1)n次拉格朗日插值计算公式;(2)n次牛顿向前插值计算公式;(3)n次牛顿向后插值计算公式;(一)程序流程图

(1)拉格朗日插值程序流程图

(2)牛顿向前插值程序流程图

(3)牛顿向后插值程序流程图

(二)源程序

见主程序清单

问题:2.计算

(1)已知f(x)=lnx,,[a,b]=[1,2],取h=,x i=1+ih,i=0,1, (10)

用通用程序(1),(3)计算及的近似值;

(一)程序清单

/* program of question , page 61 */

#include ""

#include ""

main()

{ int i,flag=0;

double z1,z2,x[11],y[11],t,s1,s2,z[10],c[11][11],log(double),ntb(),L(); for(i=0;i<=10;i++){x[i]=1+*i;y[i]=log(x[i]);}

printf("data x:\n");

for(i=0;i<=10;i++)

{flag++;printf("%11.6f",x[i]);if(flag%4==0)printf("\n");}

printf("\ndata y:\n");flag=0;

for(i=0;i<=10;i++)

{flag++;printf("%11.6f",y[i]);if(flag%4==0)printf("\n");}

printf("\nThe true value:\n");

printf(" =%f =%f\n",log,log);

z1=L(x,y,10,;z2=L(x,y,10,;t=[10])/;

s1=ntb(y,10,t,z,c);s2=ntb(y,10,t,z,c);t=[10])/;

printf("The approximate value:\n");

printf(" L=%f L=%f\n",z1,z2);

printf(" NTB=%f NTB=%f\n",s1,s2);

}

double L(double x[],double y[],int n,double t)

{ int i,k; double z=,s;if(n==1)z=y[0];

for(k=0;k<=n;k++)

{ s=;for(i=0;i<=n;i++) if(i!=k)s=s*(t-x[i])/(x[k]-x[i]);

z=z+s*y[k]; }

return z;

}

double ntb(double y[],int n,double t,double z[],double c[][11]) { int i,j,sn=n;double s;z[0]=t;

for(i=1;i<=n-1;i++) z[i]=z[i-1]*(t+i)/(i+1);

for(i=0;i<=n;i++) c[i][0]=y[sn--];

for(j=1;j<=n;j++)

for(i=0;i<=n-j;i++) c[i][j]=c[i][j-1]-c[i+1][j-1];

s=y[n];

for(i=0;i<=n-1;i++) s=s+z[i]*c[0][i+1];

return s;

}

(二)运行结果

data x:

data y:

The true value:

= =

The approximate value:

L=0.431782 L=

NTB= NTB=

问题:(2)f(x)=1/(1+25x2), |x|≤1

取等距节点n=5和n=10,用通用程序(1),(2)依次计算x=+ih(i=0,1,…,19,h=)处f(x)的近似值,并将其结果与其真实值相比较。

(一)程序清单

/* program of question ,page 61 */

#include ""

#include ""

main()

{ int i,flag;

double z1[20],z2[20],t[20],ty[20],x1[5],y1[5],x2[10],y2[10],

z11[20],z22[20],n1[5],n2[10],c1[5][5],c2[10][10],m;

double L(),ntf1(),ntf2();

for(i=0;i<=4;i++)

{ x1[i]=-1+*i;y1[i]=(1+25*x1[i]*x1[i]); }

printf("When n=5:\ndata x:\n");

for(i=0;i<=4;i++) printf("%10.6f",x1[i]);

printf("\ndata y;\n");

for(i=0;i<=4;i++) printf("%10.6f",y1[i]);

for(i=0;i<=19;i++)

{ t[i]=+i*;z1[i]=L(x1,y1,4,t[i]);

m=(t[i]-x1[0])/;z11[i]=ntf1(y1,4,m,n1,c1); }

for(i=0;i<=19;i++) ty[i]=(1+25*t[i]*t[i]);

printf("\nThe true value:\n");flag=0;

for(i=0;i<=19;i++)

{ flag++;printf("%10.6f",ty[i]);if(flag%5==0) printf("\n"); }

printf("The approximate value:\n");printf(":\n");

flag=0;

for(i=0;i<=19;i++)

{ flag++;printf("%10.6f",z1[i]);if(flag%5==0)printf("\n"); }

printf(":\n");flag=0;

for(i=0;i<=19;i++)

{ flag++;printf("%12.4f",z11[i]);if(flag%4==0)printf("\n"); }

for(i=0;i<=9;i++)

{ x2[i]=-1+9)*i;y2[i]=(1+25*x2[i]*x2[i]); }

printf("\nWhen n=10:\ndata x:\n");

for(i=0;i<=9;i++) {printf("%10.6f",x2[i]);if(i==4)printf("\n");}

printf("\ndata y:\n");

for(i=0;i<=9;i++) {printf("%10.6f",y2[i]);if(i==4)printf("\n");}

for(i=0;i<=19;i++)

{ t[i]=+i*;z2[i]=L(x2,y2,9,t[i]);

m=(t[i]-x2[0])/;z22[i]=ntf2(y2,9,m,n2,c2); }

printf("\nThe approximate value:\n");printf(":\n");

flag=0;

for(i=0;i<=19;i++)

相关文档
最新文档