文档介绍:第八题:
一,题目
从函数表
x
f(x)
出发,用下列方法计算f(),f(),f()的近似值:
分段线性插值;(2)分段二次插值;(3)全区间上拉格朗日插值
(要求一次性输入整张函数表,并利用计算机选择在插值计算中所需的结点)。
二,基本方法
先选取两个结点与使[,],然后在区间[,]上作线性插值,即得f(x)≈。
选取距点x最近的三个结点,,进行二次插值,即取f(x)≈。
n=5,
三,计算结果
(1)
x
f(x)
(2)
x
f(x)
(3)
x
f(x)
四,结果分析
编程基本按照课本套公式,方法从(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;
printf("Enter x:");
for(i=0