浙江大学计算方法大作业第八题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Байду номын сангаас
思路步骤:
(1)利用公式 l ( x)
y0
( y1 y0 )( x x0 ) 就可以求得结果 ( x1 x0 )
(2)利用公式 l ( x)
y0
( x x0 )( x x2 ) ( x x0 )( x x1 ) ( x x1 )( x x2 ) y1 y2 ( x0 x1 )( x0 x2 ) ( x1 x0 )( x1 x2 ) ( x2 x0 )( x2 x1 )
k 0 n
( x x 0 ) * ... * ( x x k 1 )( x x k 1 ) * ... * ( x x n ) ( x k x 0 ) * ... * ( x k x k 1 )( x k x k 1 ) * ... * ( x k x n )
结果分析:很漂亮的结果,本题基本上完全套书里面的公式,只有第二小问稍麻烦点。
结果很精确,并且可以很明显的看到,三个结果越来越精确。
源程序:
(1) #include<stdio.h> int main(void) { printf("输入表格:\n"); double a[2][6]; int i,j,b; double y,x,x1,x0,y0,y1; for(i=0;i<2;i++) for(j=0;j<6;j++) scanf("%lf",&a[i][j]); for(b=1;b<=3;b++) { printf("x=") ; scanf("%lf",&x); for(j=1;j<6;j++) { if(x<a[0][j])break; } x0=a[0][j-1]; x1=a[0][j]; y0=a[1][j-1]; y1=a[1][j]; y=y0+(y1-y0)*(x-x0)/(x1-x0); printf("f(%.2f)=%.5f\n",x,y); } return 0; } (2) #include<stdio.h> int main(void) { printf("表格就不用输入了,已经初始化了(嘿嘿! )直接输入 x 就好了\n"); double a[2][6]={{0.0,0.1,0.195,0.3,0.401,0.5}, {0.39894,0.39695,0.39142,0.38138,0.36812,0.35206}}; int i,j,b,n; double y,x,x0,x1,x2,y1,y2,y0,o,p,q; for(b=1;b<=3;b++) { printf("x=") ; scanf("%lf",&x);
} (3) #include<stdio.h> int main(void) { printf("表格就不用输入了,已经初始化了(嘿嘿! )直接输入 x 就好了\n"); double a[2][6]={{0.0,0.1,0.195,0.3,0.401,0.5}, {0.39894,0.39695,0.39142,0.38138,0.36812,0.35206}}; int i,j,k; double y,x,o,p,q,b,c; for(b=1;b<=3;b++) { printf("x=") ; y=0; scanf("%lf",&x); for(k=0;k<6;k++) { c=1; b=a[1][k]; for(i=0;i<6;i++) { if(i!=k) { c=c*(a[0][k]-a[0][i]) ; b=b*(x-a[0][i]); continue; } } y=y+b/c; } printf("f(%.2f)=%.5f\n",x,y); } }
题目:从函数表
x f(x) 0.0 0.39894 0.1 0.39695 0.195 0.39142 0.3 0.38138 0.401 0.36812 0.5 0.35206
出发,用下列方法计算 f(0.15),f(0.31),及 f(0.47)的近似值: (1)分段线性插值; (2)分段二次插值; (3)全区间上拉格朗日插值
最开始一个三个输入的循环,然后是加法公式的六个循环,除法式子上下都要用到循环, 每 个里面要判断 x 取的值不能取到 k,这里需要一个判断。很简单。
计算结果:
(输入省略) (1)f(0.15)=0.39404 f(0.31)=0.38007 f(0.47)=0.35693 (2)表格就不用输入了,已经初始化了(嘿嘿! ) f(0.15)=0.39446 f(0.31)=0.38022 f(0.47)=0.35725 (3)表格就不用输入了,已经初始化了(嘿嘿! ) f(0.15)=0.39447 f(0.31)=0.38022 f(0.47)=0.35722
中间有一点麻烦的可能就是要分几种情况,因为如果 x 在最左端或最右端的区间,都很肯 x0,x1,x2。如果 x 在其他,x< xh 要判断 x xh 2 与 xh 1 x 哪个更大,也就是判断 x 离哪一 边更近,然后就去那边的三个点,然后套公式。 (3)利用公式 l n ( x ) y k
for(j=1;j<6;j++) { if(x<a[0][j])break; } if((j!=1)&&(j!=5)) { if((a[0][j]-x)>(x-a[0][j-1])) { x0=a[0][j-2]; x1=a[0][j-1]; x2=a[0][j]; n=j-2; }else{ x0=a[0][j-1]; x1=a[0][j]; x2=a[0][j+1]; n=j-1; } }else{ if(j==1) { x0=a[0][0]; x1=a[0][1]; x2=a[0][2]; n=0; }else{ x0=a[0][3]; x1=a[0][4]; x2=a[0][5]; n=3; } } y0=a[1][n]; y1=a[1][n+1]; y2=a[1][n+2]; o=(x0-x1)*(x0-x2); p=(x1-x0)*(x1-x2); q=(x2-x0)*(x2-x1); y0=y0*(x-x1)*(x-x2)/o; y1=y1*(x-x0)*(x-x2)/p; y2=y2*(x-x0)*(x-x1)/q; y=y0+y1+y2; printf("f(%.2f)=%.5f\n",x,y); }