《计算方法》实验报告.docx

上传人:wj 文档编号:4817843 上传时间:2023-05-07 格式:DOCX 页数:9 大小:378.99KB
下载 相关 举报
《计算方法》实验报告.docx_第1页
第1页 / 共9页
《计算方法》实验报告.docx_第2页
第2页 / 共9页
《计算方法》实验报告.docx_第3页
第3页 / 共9页
《计算方法》实验报告.docx_第4页
第4页 / 共9页
《计算方法》实验报告.docx_第5页
第5页 / 共9页
《计算方法》实验报告.docx_第6页
第6页 / 共9页
《计算方法》实验报告.docx_第7页
第7页 / 共9页
《计算方法》实验报告.docx_第8页
第8页 / 共9页
《计算方法》实验报告.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《计算方法》实验报告.docx

《《计算方法》实验报告.docx》由会员分享,可在线阅读,更多相关《《计算方法》实验报告.docx(9页珍藏版)》请在冰点文库上搜索。

《计算方法》实验报告.docx

计算机科学与工程学院

《计算方法》实验报告

学号

姓名

班级

实验项目名称

计算方法实验

一、实验名称

实验一插值与拟合

二、实验目的:

(1)明确插值多项式和分段插值多项式各自的优缺点;

(2)编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;

(3)运用牛顿插值方法解决数学问题。

三、实验内容及要求

(1)对于

要求选取11个等距插值节点,分别采用拉格朗日插值和分段线性插值,计算x为0.5,4.5处的函数值并将结果与精确值进行比较。

输入:

区间长度,n(即n+1个节点),预测点

输出:

预测点的近似函数值,精确值,及误差

(2)已知用牛顿插值公式求的近似值。

输入:

数据点集,预测点。

输出:

预测点的近似函数值

四、实验原理及算法描述

算法基本原理:

(1)拉格朗日插值法

(2)牛顿插值法

算法流程

五、程序代码及实验结果

(1)输出:

A.拉格朗日插值法

B.分段线性插值

X y(精确) y(拉格朗日)y(分段线性)误差(拉)误差(分)

0.500000 0.800000 0.843407 0.750000 -0.054259 0.050000

4.500000 0.047059 1.5787200.0486425-32.547674 -0.033649

(2)输出:

X y(精确) y(牛顿插值)误差(牛顿插值)

5.00000 2.236068 2.266670 -0.013686

源码:

(1)A.拉格朗日插值法

#include

#include

#include

usingnamespacestd;

doubleLagrange(intN,vector&X,vector&Y,doublex);

intmain(){

doublep,b,c;

chara='n';

do{

cout<<"请输入差值次数n的值:

"<

intN;

cin>>N;

vectorX(N,0);

vectorY(N,0);

cout<<"请输入区间长度(a,b):

"<

cin>>p;

cin>>b;

c=b-p;

c=c/(N-1);

for(inti=0;i

X[i]=p;

Y[i]=1/(1+p*p);

p=p+c;

}

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

"<

doublex;

cin>>x;

doubleresult=Lagrange(N,X,Y,x);

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

"<

cout<<"是否要继续?

(y/n):

";

cin>>a;

}while(a=='y');

return0;

}

doubleLagrange(intN,vector&X,vector&Y,doublex){

doubleresult=0;

for(inti=0;i

doubletemp=Y[i];

for(intj=0;j

if(i!

=j){

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

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

}

}

result+=temp;

}

returnresult;

};

B:

分段线性插值

#include

#include

#include

usingnamespacestd;

doublefenduan(intN,vector&X,vector&Y,doublex,doublec);

intmain(){

doublep,b,c;

chara='n';

do{

cout<<"请输入差值次数n的值:

"<

intN;

cin>>N;

vectorX(N,0);

vectorY(N,0);

cout<<"请输入区间长度(a,b):

"<

cin>>p;

cin>>b;

c=b-p;

c=c/(N-1);

for(inti=0;i

X[i]=p;

Y[i]=1/(1+p*p);

p=p+c;

}

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

"<

doublex;

cin>>x;

doubleresult=fenduan(N,X,Y,x,c);

cout<<"由分段线性插值法得出结果:

"<

cout<<"是否要继续?

(y/n):

";

cin>>a;

}while(a=='y');

return0;

}

doublefenduan(intN,vector&X,vector&Y,doublex,doublec){

doubleresult=0;

intb;

b=0;

while(x-X[b]>c)

{

b=b+1;

}

result=Y[b]*(1-(x-X[b])/c)+Y[b+1]*((x-X[b])/c);

returnresult;

};

(3)牛顿插值法

#include

#include

#include

usingnamespacestd;

doubleChaShang(intn,vector&X,vector&Y);

doubleNewton(doublex,vector&X,vector&Y);

intmain(){

chara='n';

do{

intn;

cout<<"请输入插值点个数:

"<

cin>>n;

vectorX(n,0);

vectorY(n,0);

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

"<

for(inti=0;i

cin>>X[i]>>Y[i];

}

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

"<

doublex;

cin>>x;

cout<<"由牛顿插值法得出结果:

"<

cout<<"是否要继续?

(y/n):

";

cin>>a;

}while(a=='y');

return0;

}

doubleChaShang(intn,vector&X,vector&Y){

doublef=0;

doubletemp=0;

for(inti=0;i

temp=Y[i];

for(intj=0;j

if(i!

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

f+=temp;

}

returnf;

}

doubleNewton(doublex,vector&X,vector&Y){

doubleresult=0;

for(inti=0;i

doubletemp=1;

doublef=ChaShang(i,X,Y);

for(intj=0;j

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

}

result+=f*temp;

}

returnresult;

}

六、实验总结

1.通过实验一数据发现,拉格朗日插值在低次插值时,同源函数偏差并不大,但在高次插值时同原函数偏差大、存在明显的龙格现象,而分段线性插值可以避免出现的龙格现象,与原函数比较吻合,但是分段线性插值由于其分段属性,使得插值函数失去光滑性,可以考虑采用Hermite插值优化。

2.通过实验二计算过程发现,拉格朗日插值法的线性插值的计算过程没有继承性,即增加一个节点时整个计算工作必须重新开始。

而牛顿插值则避免了这一问题,这样大量的节省了乘、除法运算次数,减少了计算的时间。

因此,对于一些结构相当复杂的函数,牛顿插值法比拉格朗日插值法要占优势。

五、教师评语(或成绩)

教师签字:

9

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2