数值计算方法上机题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)