当前位置:文档之家› 数值分析总结计划实验一拉格朗日插值算法报告总结计划.doc

数值分析总结计划实验一拉格朗日插值算法报告总结计划.doc

拉格朗日插值算法的实现
实验报告
姓名:** 年级:**** 专业:计算机科学与技术科目:数值分析题目:拉格朗日插值算法的实现
实验时间 : 2014 年 5 月27 日实验成绩: 实验教师:
一、实验名称:拉格朗日插值算法的实现
二、实验目的:
a.验证拉格朗日插值算法对于不同函数的插值
b.
验证随着插值结点的增多插值曲线的变化情况。

三、实验内容:
拉格朗日插值基函数的一般形式:
也即是:
所以可以得出拉格朗日插值公式的一般形式:
其中,
n=1 时,称为线性插值,P1(x) = y 0*l 0(x) + y 1*l 1(x)
n=2 时,称为二次插值或抛物插值,精度相对高些, P2(x)= y0 *l 0(x)+ y1*l 1(x)+ y2 *l 2(x)
四、程序关键语句描写
double Lagrange(int n,double X[],double Y[],double x)
{
double result=0;
for (int i=0;i<n;i++)
{
double temp=Y[i];
for(int j=0;j<n;j++)//插值基函数乘以相应的y 值
{
if(i!=j)
{
temp=temp*(x-X[j]);
temp=temp/(X[i]-X[j]);
}
result+=temp;
}// 求出 Pn(x)
return result;
}
五、实验源代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
double Lagrange(int n,double X[],double Y[],double x); //插值函数double x;//要求插值的x的值
double result;//插值的结果
char a='n';
double X[20],Y[20];
do
{
cout<<" 请输入插值次数n 的值: "<<endl;
int n;
cin>>n;
cout<<" 请输入插值点对应的值及函数值(xi,yi):"<<endl;
for(int k=0;k<n;k++)
{
cin>>X[k]>>Y[k];
}
cout<<" 请输入要求值 x 的值: "<<endl;
cin>>x;
result=Lagrange(n,X,Y,x);
cout<<" 由拉格朗日插值法得出结果: "<<result<<endl;
cout<<" 是否要继续? yes or no:";
cin>>a;
}while(a=='yes');
return 0;
}
double Lagrange(int n,double X[],double Y[],double x)
{
double result=0;
for (int i=0;i<n;i++)
{
double temp=Y[i];
for(int j=0;j<n;j++)//插值基函数乘以相应的y 值
if(i!=j)
{
temp=temp*(x-X[j]);
temp=temp/(X[i]-X[j]);
}
}
result+=temp;
}// 求出 Pn(x)
return result;
}
六、实验用测试数据和相关结果:
1、线性插值:书上例2。

2、抛物插值:书上例3。

3、三次插值:
七、实验体会
对于现在的许多实际问题来说,我们并不知道 f(x) 的具体形式,所对应的函数值可能是由测量仪器或其他设备中直接读出来的, f(x) 只是一个数学概念意义下的函数。

(比如:图像的方法处理,天气预报,机床加工等方面)解答这类问题的方法就是插值方法。

泰勒插值要求提供f(x) 在点 x0 处的各阶导数值,这项要求很苛刻,函数f(x) 的表达式必须相当简单才行。

如果仅仅给出一系列节点上的函数值f(x i ) = y i (i=0,1,2,n), 则插值问题可表述如下:求作 n 次多项式 P n(x) ,使满足条件 P n(x)= y i,i = 0 ,1,, n 。

这就是所谓拉格朗日( Lagrange )插值。

通过本次实验,我不仅学会了如何用程序实现拉格朗日插值的算法,而且更深刻的理解
了拉格朗日插值的原理及方法。

相关主题