数值分析实验一——拉格朗日插值算法报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

拉格朗日插值算法的实现

实验报告

姓名:** 年级:****专业:计算机科学与技术科目:数值分析题目:拉格朗日插值算法的实现

实验时间: 2014年5月27日实验成绩: 实验教师:

一、实验名称:拉格朗日插值算法的实现

二、实验目的:

a. 验证拉格朗日插值算法对于不同函数的插值

b. 验证随着插值结点的增多插值曲线的变化情况。

三、实验内容:

拉格朗日插值基函数的一般形式:

也即是:

所以可以得出拉格朗日插值公式的一般形式:

其中,

n=1时,称为线性插值,P1(x) = y0*l0(x) + y1*l1(x)

n=2时,称为二次插值或抛物插值,精度相对高些,P2(x) = y0*l0(x) + y1*l1(x) + y2*l2(x)

四、程序关键语句描写

double Lagrange(int n,double X[],double Y[],double x)

{

double result=0;

for (int i=0;i

{

double temp=Y[i];

for(int j=0;j

{

if(i!=j)

{

temp=temp*(x-X[j]);

temp=temp/(X[i]-X[j]);

}

}

result+=temp;

}//求出Pn(x)

return result;

}

五、实验源代码:

#include

#include

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的值:"<

int n;

cin>>n;

cout<<"请输入插值点对应的值及函数值(xi,yi):"<

for(int k=0;k

{

cin>>X[k]>>Y[k];

}

cout<<"请输入要求值x的值:"<

cin>>x;

result=Lagrange(n,X,Y,x);

cout<<"由拉格朗日插值法得出结果:"<

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

{

double temp=Y[i];

for(int j=0;j

{

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)插值。

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

相关文档
最新文档