《数值分析》课程实验报告
用拉格朗日和牛顿插值法求解函数值
算法名称 用拉格朗日和牛顿插值法求函数值
学科专业 xxxxx
作者姓名 xxxx
作者学号 xxxxx
作者班级 xxxxxx
xxx大学
二〇一五年十二月
《数值分析》课程实验报告
实验名称 用拉格朗日和牛顿插值法求解函数值 成绩 一、问题背景 在工程技术与科学研究中,常遇到考察两个变量间的相互关系问题。两个变量间的关系可以通过函数表示,若x为自变量,y为因变量,则函数关系可描述为y=f(x)。大多数问题中,函数表达式y=f(x)未知,人们通常采用逼近的方法处理:取得一组数据点(xi,yi)(i=0,1,2,…,n),数据点可由不同方式取得(例如,可根据工程设计要求得到,也可通过采样或实验取得),然后构造一个简单函数P(x)作为y=f(x)的近似表达式,即y=f(x)≈P(x),对于y=f(x)≈P(x),若满足P(xi)=f(xi)=yi,i=0,1,2…,n,这类问题成为插值问题。 二、数学模型 1.函数f(x)=lnx的一些数值如表: x lnx 用拉格朗日插值法计算的近似值。 2.函数f(x)=x的一些数值如表: x 用牛顿插值法计算√的近似值,画出插值函数与原函数的图形做比较。 三、算法描述 1.拉格朗日插值法:设已知多项式且满足其中,ix0,x1,x2,...,xn及yi=f(xi)(i=0,1,.....,n),Ln(x)为不超过n次Ln(x)l0l(x)yny=(x)0+....+n. Ln(xi)yi(i=0,1,...n).易知l(x)均为n次多项式且满足式(3)(i,j=0,1,...,n),再由xj(ji)为n次多项式li(x)的n个根知li(x)nxx=cj0iinj.最后,由 1li(xj)c(xixj)1j0ji(xx)ijnc=j0ji,i=0,1,...,n. 总之,Ln(x)=li(x)yii0n,li(x)xx.=j0jiijnxxj式为n阶Lagrange插值公式,其中,li(x)(i=0,1,...n)称为n阶Lagrange插值的基函数。 2.牛顿插值法: 插值法是利用函数f(x)在某区间中若干点的函数值,作出适当的特定函数,在这些点上取已知值,在区间的其他点上用这特定函数的值作为函数f(x)的近似值。如果这特定函数是多项式,就称它为插值多项式。当插值节点增减时全部插值基函数均要随之变化,这在实际计算中很不方便。为了克服这一缺点,提出了牛顿插值。牛顿插值通过求各阶差商,递推得到的一个公式: f(x)=f[x0]+f[x0,x1](x-x0)+f[x0,x1,x2](x-x0)(x-x1)+...f[x0,...xn](x-x0)...(x-xn-1)+Rn(x)。 四、主要代码 1.拉格朗日插值 建立函数文件: function [yt,L]=LagInterpl(x,y,xt) syms t; n=length(x); ny=length(y); if n~=ny error end L=; for k=1:n lk=1; for j=1:n if j~=k lk=lk*(t-x(j))/(x(k)-x(j)); end end; L=L+y(k)*lk; end simplify(L); L=collect(L); yt=subs(L,'t',xt); 2.牛顿插值 建立函数文件: function [yt,N]=NewtInterp(x,y,xt) syms t; n=length(x); ny=length(y); if n~=ny error end a=zeros(1,n); N=y(1); w=1; for k=1:n-1 yy=zeros(1,n); for j=k+1:n yy(j)=(y(j)-y(k))/(x(j)-x(k)); end a(k)=yy(k+1); w=w*(t-x(k)); N=N+a(k)*w; y=yy; end yt=subs(N,'t',xt); simplify(N); N=collect(N); N=vpa(N,6); 五、实验结果及分析 1.拉格朗日插值法 在命令窗口输入: x=[,,,,]; y=[,,,,]; xt=; [yt,L]=LagInterpl(x,y,xt); z=1::4; yz=subs(L,'t',z); figure; plot(z,log(z),'--r',z,yz,'-b') hold on plot(x,y,'marker','+') hold on plot(xt,yt,'marker','o') legend('ln(x)','拉格朗日插值多项式','(x_k,y_k)','x=') xlabel('x') ylabel('y') yt 得到结果及图像如下: yt = 得到的近似值为。 拉格朗日插值模型简单,结构紧凑,是经典的插值法。但是由于拉格朗日的插值多项式和每个节点都有关,当改变节点个数时,需要重新计算。且当增大插值阶数时容易出现龙格现象。 2.牛顿插值法 在命令窗口输入: x=[ ]; y=[ ]; xt=; [yt,N]=NewtInterp(x,y,xt) z=::2; yz=subs(N,'t',z); figure; plot(z,sqrt(z),'--r',z,yz,'-b') hold on plot(x,y,'marker','+') hold on plot(xt,yt,'marker','o') h=legend('$\\sqrt{x}$','牛顿','$(x_k,y_k)$','$x=$'); set(h,'Interpreter','latex') xlabel('x') ylabel('y') 得到结果及图像如下: yt = N = - *t^4 + *t^3 - *t^2 + *t + 得到√的近似值为,插值函数为 N =- *t^4 + *t^3 - *t^2 + *t + , 其计算精度是相当高的。 Lagrange插值法和Newton插值法解决实际问题中关于只提供复杂的离散数据的函数求值问题,通过将所考察的函数简单化,构造关于离散数据实际函数f(x)的近似函数P(x),从而可以计算未知点出的函数值,是插值法的基本思路。 实际上Lagrange插值法和Newton插值法是同一种方法的两种变形,其构造拟合函数的思路是相同的,而实验中两个实际问题用两种算法计算出结果是相同的。