文档介绍:计算方法上机题doc
第八题:
一,题目
(1)分段线性插值;(2)分段二次插值;(3)全区间上拉格朗日插值
(要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的结点)。
二,基本方法
(1)先选取两个结点xi?1与xi使x?[xi?1,xi],然后在区间[xi?1,xi]上作线
?x?xxx?y性插值,即得f(x)≈L(x)?y
?xxx?x
i
1
i?1
i
i?1
i
i
i?1
。
进行二次插值,即取
i?1
(2)选取距点x最近的三个结点
i?1
i?1
j
x
i?1
,
x
i
,
x
i?1
?xx)]。 f(x)≈L(x)??[y?(?xx
2
k?i?1
k
j?i?1,j?k
k
j
(3)n=5,
L(x)??yl
n
k?0
k
n
k
(x)??y
k?0
n
k
?x)...(x?x
k
k
(x?x0)...(x?xk
?1)(x?xk?1)...(x?xn)
k?1
)(xk?xk?1)...(xk?xn)
三,计算结果(1)
四,结果分析编程基本按照课本套公式,方法从(1)至(3),计算结果越来越精确。五,源程序
(1)
#include<>
int main(void)
{
int i,j;
double a[6],b[6],x,y;
printf("Enter x:");
for(i=0;i<6;i++)
scanf("%lf",&a[i]);
printf("Enter f(x):");
for(i=0;i<6;i++)
scanf("%lf",&b[i]);
for(j=0;j<3;j++){
printf("Enter x:");
scanf("%lf",&x);
for(i=0;x>a[i];i++);
y=b[i-1]*(x-a[i])/(a[i-1]-a[i])+b[i]*(x-a[i-1])/(a[i]-a[i-1]); printf("x=%lf , ",x);
printf("y=%lf\n",y);
}
return 0;
}
(2)
#include<>
int main(void)
{
int i,j;
double a[6],b[6],x,y;
printf("Enter x:");
for(i=0;i<6;i++)
scanf("%lf",&a[i]);
printf("Enter f(x):");
for(i=0;i<6;i++)
scanf("%lf",&b[i]);
for(j=0;j<3;j++){
printf("Enter x:");
scanf("%lf",&x);
for(i=0;x>a[i];i++);
if((a[i+1]-x)<(x-a[i-2]))
{
y=b[i-1]*(x-a[i])/(a[i-1]-a[i])*(x-a[i+1])/(a[i-1]-a[i+1]); y=y+b[i]*(x-a[i-1])/(a[i]-a[i-1])*(x-a[i+1])/(a[i]-a[i+1]); y=y+b[i+1]*(x-a[i-1])/(a[i+1]-a[i-1])*(x-a[i])/(a[i+1]-a[i]); printf("x=%lf , ",x); printf("y=%lf\n",y);
}
else{
y=b[i-2]*(x-a[i-1])/(a[i-2]-a[i-1])*(x-a[i])/(a[i-2]-a[i]); y=y+b[i-1]*(x-a[i-2])/(a[i-1]-a[i-2])*(x-a[i])/(a[i-1]-a[i]); y=y+b[i]*(x-a[i-2])/(a[i]-a[i-2])*(x-a[i-1])/(a[i]-a[i-1]); printf("x=%lf , ",x); printf("y=%lf\n",y);
}
}
return 0;
}
(3)
#include<>
int main(void)
{
int i,j,k;
double a[6],b[6],x,y,p;