拉格朗日牛顿插值法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标题:实验一拉格朗日插值法算法与牛顿插值算法
一、实验目的:
1.体会并了解拉格朗日插值法,用计算机插入x值,输出相应的
y值。
2.体会并了解牛顿插值法,用计算机插入x值,输出相应的y值。
二、实验原理:
1.拉格朗日插值法的插值公式:
L n(x)
=∑y k
n
k=0
(x−x0)(x−x1)⋯(x−x n)
(x−x k)(x k−x0)⋯(x k−x k−1)(x k−x k+1)⋯(x k−x n)
2.牛顿插值法的插值公式:
P n(x)=f(x0)+f[x0,x1](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,⋯,x n](x−x0)⋯(x−x n−1)
f[x0,x1,⋯,x k]=∑
f(x j)
(x j−x0)⋯(x j−x j−1)(x j−x j+1)⋯(x j−x k)
k
j=0
三、算法设计与程序流程图:
1.拉格朗日插值法算法分析:
a.输入节点的个数j。
b.输入节点的横纵坐标。
c.输入新插入的节点的横坐标。
d.通过两次循环求得新插入节点的纵坐标。程序流程图:
2.牛顿插值算法分析:
a.输入节点的个数j。
b.输入节点的横纵坐标。
c.输入新插入的节点的横坐标。
d.通过两次循环求得新插入节点的纵坐标。
程序流程图:
四、源程序:
#include "stdafx.h"
#include "stdio.h"
int main()
{
float x[20],y[20];
int k,j,i,flag;
float a,b1,b2,c,d,e,f,w1,w2,l,L,newx,P;
w1=1;
w2=1;
L=0;
P=0;
printf("请输入数据,不得超过20组。\n");
printf("输入的数据为几组:");
scanf("%d",&j);
for(i=0;i<=j-1;i++)
{
printf("第%d组为:\n",i+1);
printf("x=");
scanf("%f",&x[i]);
printf("y=");
scanf("%f",&y[i]);
}
printf("请选择:1,拉格朗日插值。2,牛顿插值。0,退出。\n"); scanf("%d",&flag);
if(flag==1)
{
printf("请输入插入的数值:");
scanf("%f",&newx);
for(k=0;k<=j-1;k++) {
b1=x[k];
b2=y[k];
for(i=0;i<=j-1;i++)
{
a=x[i];
c=newx-a;
w1=w1*c;
e=b1-a;
if(e!=0)
{
w2=w2*e;
}
if(e==0)
{
e=e+1;
w2=w2*e;
}
}
d=newx-b1;
f=d*w2;
printf("f=%f\n",f);
l=b2*w1/f;
printf("l=%f\n",l);
L=L+l;
w1=1;
w2=1;
}
printf("newy=%f",L);
}
if(flag==2)
{
printf("请输入插入的数值:");
scanf("%f",&newx);
for(f=0;f<=j-1;f++)
{
for(k=0;k<=f;k++)
{
b1=x[k];
b2=y[k];
for(i=0;i<=f;i++)
{
a=x[i];
e=b1-a;
if(e!=0)
{
w1=w1*e;
}
else if(e==0)
{
e=e+1;
w1=w1*e;
}
}
l=b2/w1;
L=L+l;
w1=1;
c=newx-b1;
w2=w2*c;
}
d=L*w2/c;
w2=1;
P=P+d;
L=0;
}
printf("newy=%f",P);
}
if(flag==0)
{
return 0;
}
}
五、程序执行情况:
1.拉格朗日插值法:
2.牛顿插值法:
六、结果分析:
引用课本例2进行拉格朗日插值法验证,与课本上的结果相一致,引用课本例4进行牛顿插值法验证,与课本答案相差0.000002,是因为课本的有效数字与计算机取得不同,所以经过计算、运行基本达到了预期效果。此程序可以用做数学计算。
七、实验体会:
经过此次实验基本上了解了拉格朗日插值法的算法和牛顿插值法算法的过程,对以后算法的运用和其他算法的理解有帮助,而且有助于编程能力的提高和实际问题的理解。