数值分析实验报告插值法.docx

上传人:b****6 文档编号:8854100 上传时间:2023-02-02 格式:DOCX 页数:11 大小:68.10KB
下载 相关 举报
数值分析实验报告插值法.docx_第1页
第1页 / 共11页
数值分析实验报告插值法.docx_第2页
第2页 / 共11页
数值分析实验报告插值法.docx_第3页
第3页 / 共11页
数值分析实验报告插值法.docx_第4页
第4页 / 共11页
数值分析实验报告插值法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数值分析实验报告插值法.docx

《数值分析实验报告插值法.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告插值法.docx(11页珍藏版)》请在冰豆网上搜索。

数值分析实验报告插值法.docx

数值分析实验报告插值法

学生学号

实验课成绩

武汉理工大学

学生实验报告书

 

实验课程名称数值分析

开课学院计算机科学与技术学院

指导老师姓名

学生姓名

学生专业班级

 

2010—2010学年第一学期

 

实验课程名称:

数值分析

实验项目名称

实验成绩

实验者

专业班级

组别

同组者

实验日期

年月日

第一部分:

实验分析与设计(可加页)

一、实验内容描述(问题域描述)

1、分别画出Lagrange插值公式、Newton插值公式、分段插值公式和Hermite插值公式的算法流程图

2、分别用Lagrange插值公式和Newton插值公式通过编程计算函数f(x)的近似值

已知对于f(x)=ex,有数据表如下:

xi

0

f(xi)

(1)对x0=0,x1=利用线性插值计算f的近似值;对x0=,x1=1利用线性插值计算f的近似值;

(2)对x0=0,x1=,x2=2利用二次插值计算f和f的近似值

(3)对x0=0,x1=,x2=2求f(x)的Hermite插值多项式H5(x);

(4)分析和比较各插值算法的精度差异

3、通过编程计算函数f(x)的近似值。

已知对于f(x)=,有数据表如下:

xi

f(xi)

(1)计算各阶插值多项式在不同点的值:

f,f,f;

(2)利用分段线性插直和分段抛物插值计算

(1)中的函数值;

(3)分析和比较算法的效率差异和精度差异(同时注意插值点的位置与精度之间的关系)。

4、用不同方式方法编程给出计算Langrange插值和Newton插值的算法,分析和比较两种算法的编程难易以及算法的效率差异总计算量之间的关系。

5、写出实习报告

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)

【拉格朗日插值法算法流程图】

 

【牛顿插值法算法流程图】

 

【分段插值法算法流程图】

 

【艾尔米特插值法算法流程图】

 

【拉格朗日插值法源程序】

#include

usingnamespacestd;

intmain()

{

cout<<"请输入坐标点个数:

"<

intcount;

cin>>count;

doublepoint[100][2];

intcount1=0;

cout<<"请输入坐标:

"<

while(count1

{

cin>>point[count1][0]>>point[count1][1];

count1++;

}

cout<<"计算f(x)请输入x:

"<

doublex;

cin>>x;

doublef=0,Lu=1;

for(inti=0;i

{

for(intj=0;j

{

if(j==i)continue;

Lu=Lu*(x-point[j][0])/(point[i][0]-point[j][0]);

}

Lu=Lu*point[i][1];

f=f+Lu;

Lu=1;

}

cout<<"f(x)的值为:

"<

return0;

}

【牛顿插值法源程序】

#include

usingnamespacestd;

intmain()

{

cout<<"请输入坐标点个数:

"<

intcount;

cin>>count;

doublepoint[100][2];

intcount1=0;

cout<<"请输入坐标:

"<

while(count1

{

cin>>point[count1][0]>>point[count1][1];count1++;

}

cout<<"计算f(x)请输入x:

"<

doublex;

cin>>x;

doubled[100];

for(inti=0;i

d[i]=point[i][1];

for(intj=1;j

for(i=count-1;i>=j;i--)

d[i]=(d[i]-d[i-1])/(point[i][0]-point[i-j][0]);

doublef=d[0],Lu=1,L;

for(i=1;i

{

Lu=Lu*(x-point[i-1][0]);

L=Lu*d[i];

f=f+L;

}

cout<<"f(x)的值为:

"<

return0;

}

【埃米尔特插值法源程序】

#include

usingnamespacestd;

structpoint

{

doublex;

doubley;

doubled;

}point[100];

intmain()

{

cout<<"请输入坐标点个数:

"<

intcount;

cin>>count;

intcount1=0;

cout<<"请依次输入坐标的横纵坐标和对应的导数:

"<

while(count1

{

cin>>point[count1].x>>point[count1].y>>point[count1].d;

count1++;

}

cout<<"计算f(x)请输入x:

"<

doublex;

cin>>x;

doublef=0,Lu=1,Laa=0,La,Lb;

for(inti=0;i

{

for(intj=0;j

{

if(j==i)continue;

Lu=Lu*(x-point[j].x)/(point[i].x-point[j].x);

Laa=Laa+(point[i].x-point[j].x);

}

La=point[i].y*(1-2*(x-point[i].x)*Laa)*Lu*Lu;

Lb=point[i].d*(x-point[i].x)*Lu*Lu;

f=f+La+Lb;

Lu=1;

Laa=0;

}

cout<<"f(x)的值为:

"<

return0;

}

三、主要仪器设备及耗材

1.PC机

2.开发环境(比如:

VC,Eclipse)

第二部分:

实验调试与结果分析(可加页)

一、调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)

(1)用拉格朗日插值法计算时,输入及运行结果如下:

拉格朗日插值法

牛顿插值法

(2)利用二次插值计算时,输入及运行结果如下:

拉格朗日插值法

牛顿插值法

(3)用艾尔米特插值法计算时,f(x)的插值多项式

H5(x)=(1+4*x)***(x-2)*(x-2)+(4)各插值算法的精度差异比较

经过比较,拉格朗日插值法要比牛顿插值法算法的计算量多一些,拉格朗日插值法后一次计算时用到了前一次计算的结果,提高了运算的效率,但拉格朗日插值法在构造艾尔米特插值法时很方便,将坐标点和对应的导数结合起来的精度比线性插值的精度又要高一些。

但从实验数据来看,在坐标不是很多的情况下,已知的点越多精度也就相对较高。

 

对于实验要求的第二组数据用拉格朗日插值法(或者牛顿插值法)实验结果如下:

一下分别是二阶、三阶、四阶、五阶插值得到的结果

以上只是实验结果的一部分,改变插值的位置时,得到的实验结果精度也是有所不同的。

由以上结果分析可知,插值次数并不是越多越好,多了反而会让结果更加偏离真实结果,这充分说明了高次插值存在“病态性质”,在已知点很多的情况下应该采用分段低次插值,将拉格朗日插值法和牛顿插值法运用到分段低次插值法当中,这样得到的结果可能胡更加精确。

对于分段低次插值本实验没有给出实验结果,但从实践上来看,分段低次插值的精度要比线性插值精度高,但当插值阶数比较少的时候没有必要采用分段低次插值。

 

二、实验小结、建议及体会

各种插值法都有自己的利与弊,拉格朗日插值法运算过程相对复杂,但当和导数结合起来,组成抛物插值的时候,精度就可以提高很多。

牛顿插值法、拉格朗日插值法等线性插值法只能适合在已知点不多的情况下使用,当已知的坐标点很多时候应该将区间分成小段进行分段线性插值或者分段抛物插值。

采用组合的思想是数值分析常用的思想和技巧之一,单个的方法得到的结果虽然不是很理想,但将多个方法按照某种方式结合在一起就能改进实验方法,我们应该触类旁通,在以后的学习中学会使用这种思想。

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

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1