数值分析第二次实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实习目的:
(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 插值法流程图
开始
插值节点序列,对应的导数值
根据节点个数确定插值次数然后for i 0 to n a=(1-2*(x-xi))/(xi-xk)*Li(x)*Li(x)) b=(x-xi)* Li(x)*Li(x)
根据插值公式计算插值点的值for i 0 to n
H(x)=yi((1-2(x-xi )*a )+mi*b*b)
输出插值点所对应的值
结束
开始
根据区间[a,b],对给定的节点划分为多个小区间,每个小区间n+1个节点
在每个小区间上构造插值多项式Pi (x )
输入n 来确定
插值次数
判断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
#include
using namespace std;
int main()
{
int i,j,n;
double a[100],b[100];
cout<<"请输入插值节点控制数:n"< cin>>n; cout<<"请输入n+1个插值点:"< for(i=0;i<=n;i++) { cin>>a[i]>>b[i]; } double f,x,tmp; cout<<"请输入所求函数值对应的x点"< cin>>x; f=0; for(i=0;i<=n;i++) { tmp=1;