数值计算方法实验2

  • 格式:doc
  • 大小:144.50 KB
  • 文档页数:4

学院(系)名称:
三.埃特金插值法
附录(源程序及运行结果): 一. 拉格朗日插值法
#include<stdio.h> #include<math.h> #define MAX 100 void main(){ int n,k=0,j=0;
double x[MAX],y[MAX],x0,y0=0; printf("请输入节点个数n :"); scanf("%d",&n);
printf("请输入节点值(x,y):");
for(int i=0;i<n;i++) scanf("%lf,%lf",&x[i],&y[i]); printf("输入所求节点的x 的值:"); scanf("%lf",&x0); while(k!=n){double t=1; for(int j=0;j<n;j++) if((j!=k)) t=(x0-x[j])/(x[k]-x[j])*t; y0=y0+t*y[k]; k++;
}
printf("使用拉格朗日插值法输出x 的y 值为:%lf\n",y0); } 运行结果:
二. 分段抛物线插值法
#include<stdio.h> #include<math.h> #define MAX 20
void Y(double x[],double y[],double x0,int i){ double y0;
printf("选取的节点为(%lf,%lf) (%lf,%lf) (%lf,%lf)\n",x[i-1],y[i-1],x[i],y[i],x[i+1],y[i+1]);
y0=(x0-x[i])*(x0-x[i+1])*y[i-1]/(x[i-1]-x[i])/(x[i-1]-x[i+1]) +(x0-x[i-1])*(x0-x[i+1])*y[i]/(x[i]-x[i-1])/(x[i]-x[i+1])
+(x0-x[i-1])*(x0-x[i])*y[i+1]/(x[i+1]-x[i-1])/(x[i+1]-x[i]);
printf("使用分段抛物线插值输出结果为:%lf\n",y0);
}
void main(){
int n,i;
double x[MAX],y[MAX],x0,y0=0;
printf("请输入节点个数n:");
scanf("%d",&n);
printf("请输入节点值(x,y):");
for(i=1;i<=n;i++) scanf("%lf,%lf",&x[i],&y[i]);
printf("输入所求节点的x的值:");
scanf("%lf",&x0);
if(x0<=x[1]) { i=2;
Y(x,y,x0,i);
}
if(x0>=x[n]) { i=n-1;
Y(x,y,x0,i);
}
for(i=2;i<=n;i++){
if(x0<=x[i]){
if(fabs(x0-x[i-1])<=fabs(x0-x[i])) i=i-1;
Y(x,y,x0,i);break;
}
}
}
运行结果:
三.埃特金插值法
#include<stdio.h>
#include<math.h>
#define MAX 100
void main(){
int n,k=0;
double x[MAX],y[MAX],x0,y0=0;
printf("请输入节点个数n:");
scanf("%d",&n);
printf("请输入节点值(x,y):");
for(int i=0;i<n;i++){
scanf("%lf,%lf",&x[i],&y[i]);
}
printf("输入所求节点的x的值:");
scanf("%lf",&x0);
while(k!=n){
for(int i=k;i<n;i++)
y[i]=(x0-x[k-1])/(x[i]-x[k-1])*y[i]+(x0-x[i])/(x[k-1]-x[i])*y[k-1];
k++;
}
printf("用埃特金插值法输出:%lf\n",y[n-1]);
}
运行结果:。