当前位置:首页 >> 理学 >>

数值分析第二次实习报告


一、实习目的:
(1)通过编程计算实践,体会和理解 Lagrange 插值公式、Newton 插值公式、 分段插值公式和 Hermite 插值公式。 (2) 通过编程计算实践, 搞清 Larange 插值、 Newton 插值、 分段插值和 Hermite 插值的基本计算流程。 (3)通过编程计算实践,掌握和提高 Newton 插值、Hermite 插值算法流程的 控制技术。 (4)通过各种方法对同一题目的求解,体会各种方法的精度差异。

二、实习步骤:
(1) 分别画出 Lagrange 插值公式、 Newton 插值公式、 分段插值公式和 Hermite 插值公式的算法流程图。 (2)分别用 Lagrange 插值公式和 Newton 插值公式通过编程计算函数 f(x)的近 似值。 已知对于 f(x),有数据表如下: xi 0 0.5 1.0 2.0 f(xi) 1.00000 1.64872 2.71828 7.38906 ① 对对 x0=0,x1=0.5 利用线性插值计算 f(0.25)的近似值;对 x0=0.5,x1=1 利用线性插值计算 f(0.75)的近似值; ② x0=0,x1=0.5 ,x2=2 利用二次插值计算 f(0.25)和 f(0.75)的近似值; ③ x0=0,x1=0.5 ,x2=2 求 f(x)的 Hermite 插值多项式; ④ 析和比较各插值算法的精度差异; (3) 通过编程计算函数 f(x)的近似值。已知对与 f(x)= x^(0.5),有数据表如下: xi 2.0 2.1 2.2 2.3 2.4 f(xi) 1.414214 1.449138 1.483340 1.516575 1.549193 ① 算各阶插值多项式在不同点的值:f(2.05) ,f(2.15), f(2.45); ② 用分段线性插值和分段抛物线插值计算(1)中的函数值; ③ 析和比较算法的效率差异和精度差异(同时注意插值点的位置与精度之间 的关系) ; (4)不同方式方法编程给出计算拉格朗日插值和牛顿插值的算法,分析和比较两 种算法的编程难易以及算法的效率差异和总计算量之间的关系;

三、算法流程图:
(一)拉格朗日插值程序算法流程图
开始

定义两个数组 a[100], b[100]

插值节点控制数 n

n+1 个插值点 f=0

for i 0 To n forj 0 To n

是 i=j 否 tmp=tmp*(x-a[j])/(a[i]a[j]); f=f+tmp*b[i];

输出 f_x

开始

(二)牛顿插值法程序流程图

开始

输入插值截点控制数 n, 插值序列, 和要计算的函 数点 x

插值计算 for i o to n-1 tmp=tmp*(x-a[i]); f=f+tmp*b[i+1];

设 定 初 始 值 t=1,newton=f(x0)

tmp=tmp*(x-a[i]);f=f +tmp*b[i+1]; 输出插值计算的函 数值

结束

(三)分段插值法流程图
开始

(四) Hermite 插值法流程图
开始

输入 n 来确定 插值次数

插值节点序列,对应的导数值

根据区间[a,b], 对给定的节点划分为多 个小区间,每个小区间 n+1 个节点

根据节点个数确定插值次数然后 for i 0 to n a=(1-2*(x-xi))/(xi-xk)*Li(x)*Li(x)) b=(x-xi)* Li(x)*Li(x)

在每个小区间上构造插值多项式 Pi (x) 根据插值公式计算插值点的值 for i 0 to n H(x)=yi((1-2(x-xi)*a)+mi*b*b)

判断 x 所属的区间

计算所求插值节 点的函数值

输出插值点所对应的值

输出所求函数值

结束

结束

四、编程计算 f(x)= e^(x)的近似值
(一)Lagrange 插值: (1)拉格朗日插值程序算法描述
(1)程序开始; (2)定义两个数组 a[100],b[100]; (3)输入插值节点控制数 n; (4)输入 n+1 个插值点; (5)输入所求插值点的 x 值,然后执行一下程序; for(i=0;i<=n;i++) { tmp=1; for(j=0;j<=n;j++) if(i=j)continue; else tmp=tmp*(x-a[j])/(a[i]-a[j]); f=f+tmp*b[i]; (6)输出所得到插值点的值 f_x; (7)程序结束。

(2)拉格朗日插值程序源代码
#include<iostream> #include<cmath> using namespace std; int main() { int i,j,n; double a[100],b[100]; cout<<"请输入插值节点控制数:n"<<endl; cin>>n; cout<<"请输入 n+1 个插值点:"<<endl; for(i=0;i<=n;i++) { cin>>a[i]>>b[i]; } double f,x,tmp; cout<<"请输入所求函数值对应的 x 点"<<endl; cin>>x; f=0; for(i=0;i<=n;i++) { tmp=1;

for(j=0;j<=n;j++) if(i==j)continue; else tmp=tmp*(x-a[j])/(a[i]-a[j]); f=f+tmp*b[i]; } cout<<"所求函数值为 f_x="<<f<<endl; return 0;

(二)Newton 插值: (1)牛顿插值算法描述
(1)输入:插值截点控制数 n,插值序列(xi,yi),要计算的函数点 x0; (2)形成差商表 d[k](k=1,2,……n); (3)置初始值 t=1,newton=f(x0); (4)i=1,2,……n t=(u-x(i-1))*t, newton=newton+t*g[i] (5)输出 f(u)的插值 N(u)=newton。

(2)牛顿插值法程序源代码
#include<iostream> #include<cmath> using namespace std; int main() { int i,j,n; double a[100],b[100]; cout<<"请输入插值节点控制数:n"<<endl; cin>>n; cout<<"请输入 n+1 个插值点:"<<endl; for(i=0;i<=n;i++) { cin>>a[i]>>b[i]; } double f,x,tmp; cout<<"请输入所求函数值对应的 x 点"<<endl; cin>>x; for(i=0;i<n;i++) for(j=n;j>i;j--) { b[j]=(b[j]-b[j-1])/(a[j]-a[j-1-i]); } tmp=1; f=b[0]; {

for(i=0;i<n;i++) { tmp=tmp*(x-a[i]); f=f+tmp*b[i+1]; } cout<<"所求函数值为 f_x="<<f<<endl; } return 0; }

(三)调试过程,实验结果及分析:
(1)利用拉格朗日插值
的近似值 运行结果如下图: 对于 f(x)=e^x, x0=0,x1=0.5 利用线性插值计算 f(0.25)

对于 x0=0.5,x1=1.0 利用线性插值计算 f(0.75)的近似值 运行结果如下图:

对于 x0=0,x1=0.5,x2=2.0 利用二次插值计算 f(0.25)的近似值 运行结果如下图:

对于 x0=0,x1=0.5,x2=2.0 利用二次插值计算 f(0.75)的近似值

运行结果如下图:

(2)利用牛顿插值对于 f(x)=e^x, x0=0,x1=0.5
运行结果如下图:

利用线性插值计算 f(0.25)的近似值

对于 x0=0.5,x1=1 利用线性插值计算 f(0.75)的近似值 运行结果如下图:

对于 x0=0,x1=0.5,x2=2.0 利用二次插值计算 f(0.25)的近似值 运行结果如下图:

对于 x0=0,x1=0.5,x2=2.0 利用二次插值计算 f(0.75)的近似值 运行结果如下图:

(3)运行结果的比较:
①拉格朗日插值和牛顿插值计算出的结果相同, 但是牛顿插值法的计算量较少。 拉格朗日法 形式对称,结构简单,便于在计算机上实现,只是计算量大。 ②二次插值因为在取点更准确和计算复杂,所得到的结果精确度更好。

五、编程计算 f(x)= x^(0.5)的近似值
(一)分段插值: (1)分段插值法算法描述
(1)将所考虑的区间[a,b]作一划分:a<=x0<x1<……<xn<=b (2)在每个小区间[xi,xi+1]上构造插值多项式 Pi(x) (3)将每个小区间的 Pi(x)连接在一起,作为 f(x)在[a,b]上的插值函数.即 Sk(x)=Pi(x),x 在小区间[a,b]。

(2)分段线性插值法程序源代码
#include<iostream> #include<cmath> using namespace std; int main() { int i,j,n; double a[10],b[10],x,f,tmp; cout<<"请输入插值节点的个数:n"<<endl; cin>>n; cout<<"请输入 n 个插值节点:"<<endl; for(i=0;i<n;i++) { cin>>a[i]>>b[i]; } cout<<"请输入所求函数值对应的 x 点"<<endl; cin>>x; f=0;

if(x<a[1])goto loop; else for(i=1;i<n-1;i++) { if(x<a[1])goto loop; } loop:for(i=0;i<=1;i++) { tmp=1; for(j=0;j<=1;j++) if(i==j)continue; else tmp=tmp*(x-a[j])/(a[i]-a[j]); f=f+tmp*b[i]; } cout<<"所求函数值为"<<f<<endl; return 0; }

(3)分段抛物线插值法程序源代码
#include<iostream> #include<cmath> using namespace std; int main() { int i,j,n; double a[10],b[10],x,f,tmp; cout<<"请输入插值节点的个数:n"<<endl; cin>>n; cout<<"请输入 n 个插值节点:"<<endl; for(i=0;i<n;i++) { cin>>a[i]>>b[i]; } cout<<"请输入所求函数值对应的 x 点"<<endl; cin>>x; f=0; if(x<a[1])goto loop; else for(i=1;i<n-1;i++) { if(x<a[1])goto loop; } loop:for(i=0;i<=2;i++)

{ tmp=1; for(j=0;j<=2;j++) if(i==j)continue; else tmp=tmp*(x-a[j])/(a[i]-a[j]); f=f+tmp*b[i]; } cout<<"所求函数值为"<<f<<endl; return 0; }

(4)调试过程,实验结果及分析:
1、分段线性插值程序运行结果如下:

2、分段抛物线插值程序运行结果如下:

3、由运行结果可以看出:
分段抛物线插值比分段线性插值更准确, 这是因为抛物线插值在所求点的附近选取的点, 并且线性插值和抛物线插值在所考虑区间内插值得到的数值精确度比在考虑区间外所得到 的数值的精确度要高,这说明了内插比外推插值效果要好。

(二)Hermite 插值 (1)Hermite 插值法算法描述
(1)输入插值序列和对应的导数值 (2)根据插值节点的个数确定插值次数 (3)构造插值基函数 for i 0 to n a=(1-2*(x-xi))/(xi-xk)*Li(x)*Li(x)) b=(x-xi)* Li(x)*Li(x) (4)根据插值公式计算插值点的值 for i 0 to n H(x)=yi((1-2(x-xi)*a)+mi*b*b) (5)输出插值点所对应的值

(2)Hermite 插值法程序源代码
#include<iostream>

#include<cmath> using namespace std; int main() { int i,j,n; double a[10],b[10],m[10],x,f,tmp1,tmp2,H(x); cout<<"请输入插值节点的个数:n"<<endl; cin>>n; cout<<"请输入 n 个插值节点及对应的导数值:"<<endl; for(i=0;i<n;i++) { cin>>a[i]>>b[i]>>m[i]; } cout<<"请输入所求函数值对应的 x 点"<<endl; cin>>x; f=0; for(i=0;i<=n;i++) { tmp=1; for(j=0;j<=n;j++) { if(i==j)continue; else tmp=tmp*(x-a[j])/(a[i]-a[j]); f=f+tmp*b[i]; tmp1=(1-2*(x-a[i])/a[i]-a[k])*f*f; tmp2=(x-a[i])*f*f; } H(x)=b[i]*tmp1+m[i]*tpm2 } cout<<"经 Hermite 插值得所求插值点数值 H(x)="<<H(x)<<endl; return 0; }

(3)调试过程,实验结果及分析:
1、利用 Hermite 插值,程序运行结果如下:

2、由运行结果可以看出:
在 x=0.25 时,所求插值点数值与拉格朗日插值法和牛顿插值法所得数值相等,但在 x=0.75 处,所得结果就有较大差别,这是因为 Hermite 插值有导数的运算在内,因此对曲线 的的平滑性要求就比较高了,在曲线可以保证良好平滑性的情况下,Hermite 插值因为对数 据的准确度的要求更高,所以所得到的结果就更加准确。

第二次实验小结及体会
1、插值法是数值分析中的一类重要方法,有着广泛的应用。本次试验中几种数值方法及有 关概念和理论是数值分析最基本的内容 2、拉格朗日插值多项式是研究数值微积分与微分方程数值解的重要工具,但该方法计算量 很大,且误差估计很困难,理论上还是比较重要。 3、牛顿插值多项式是拉格朗日插值多项式的变形,具有继承性,比拉格朗日插值多项式节 省计算量,试验中用到了均差的概念,当节点数增加或减少时,只需将原有的计算结果增加 或减少一项,着也是牛顿插值比拉格朗日插值方便的地方,应当注意。 4、分段低次多项式插值由于具有良好的稳定性与收敛性,且算法简单,可根据节点处函数 值的具体情况,采用不同的插值公式,解决了曲线平滑性的问题,更便于应用。 5、用一个插值多项式来近似代替一个函数,当节点数增多时查汉字多项式不一定能收敛的 哦原函数,一般避免采用高阶插值多项式。 6、Hermite 插值公式,有不少实际问题不但要求在节点上函数值相等,而且还要求它的导数 值或高阶导数值也相等,Hermite 插值公式满足这种要求。 7、尽管没有什么准则来确定插值多项式的最有阶,但一个总的建议就是在 x 的一个小范围 内使用相对较低的插值多项式。


赞助商链接
相关文章:
北航数值分析实习第二题
数值分析计算实习报告 第二题 所学学 在生生 班姓学 级名号 A1 班 2015 年 11 月 北航数值分析计算实习报告 第1页 1 算法设计方案 1.1 矩阵的输入 A ...
数值分析实习报告
数值分析实习报告_其它_高等教育_教育专区。《数值分析》编程实习报告 姓学 名号 Agunk·D·Ragon 院(所) 年专级业 XD 二〇XX 年 XX 月 用高斯-赛德尔迭代...
数值分析实习报告
数值分析实习报告 - 数值分析实习报告 数值分析实习报告 题 目: MATLAB 算法实习 学生姓名: 指导教师: 学学院: 号: 刘圣军 2016 年 12 月 数值分析实...
数值分析上机实习报告
, n-2. 第 15 页 数值分析上机实习报告 2012 年 12 月 (2)程序主体 #include <stdio.h> #include <math.h> void main( ) { int i,j,m,r,sign;...
数值分析上机实习报告10
数值分析上机实习报告10 - 数值分析上机实习报告要求 1.应提交一份完整的实习报告。具体要求如下: (1)要有封面,封面上要标明姓名、学号、专业和联系电话; (2)...
北航数值分析计算实习报告一
暂无评价|0人阅读|0次下载|举报文档北航数值分析计算实习报告一_理学_高等教育_教育专区。北京航空航天大学研究生数值分析大作业第一题 北京...
西南交大数值分析上机实习报告
暂无评价|0人阅读|0次下载|举报文档 西南交大数值分析上机实习报告_实习总结_总结...在给定的四道上机题中,第一 题(插值多项式和多项式拟合)和第二题(雅格比迭代...
数值分析上机实习报告
数值分析上机实习报告 - 研究生数值分析课程,雅可比迭代法和高斯-塞得尔迭代法的收敛性和收敛速度,松弛因子对SOR法收敛速度的影响,Runge-Kutta 4阶算法对初值问题的...
西南交通大学研究 数值分析上机实习报告2012
西南交通大学研究 数值分析上机实习报告2012 - 数值分析上机实习报告要求 1.应提交一份完整的实习报告。具体要求如下: (1)要有封面,封面上要标明姓名、学号、专业...
数值分析上机实习报告
数值分析上机实习报告 - 数值分析上机实习报告 学姓专 号: 名: 业: 联系电话: 联系电话: 2011 年 11 月 (数值分析)上机实习报告 第 I 页 序 言 1...
更多相关标签: