牛顿插值法matlab程序

《计算方法》数值实验报告

班级 学号 金志彬 090712 09071235 姓名 实验室 设备编号 日期 2012.06.05 3-128 D12 实验题目 编写牛顿插值方法的MATLAB主程序并验算P183.11 1、实验目的: 通过编程实现牛顿插值方法,加深对多项式插值的理解。应用所编程序解决实际算例。 2、实验要求: (1)认真分析课题要求,复习相关理论知识,选择适当的解决方案; (2)上机实验程序,做好上机前的准备工作; (3)调试程序,记录计算结果; (4)分析和解释计算结果; (5)按照要求书写实验报告。 3、实验内容: (1)算法原理或计算公式 算法原理:根据均差定义,把x看成[a,b]上一点,可得 f(x)?f(x0)?f[x,x0](x?x0) f[x,x0]?f[x0,x1]?f[x,x0,x1](x?x1) … f[x,x0,...,xn?1]?f[x0,x1,...,xn]?f[x,x0,...,xn](x?xn 只要把后一式代入前一式,就得到 f(x)?f(x0)?f[x0,x1](x?x0)?f[x0,x1,x2](x?x0)(x?x1)?...?f[x0,x1,...,xn](x?x0)...(x?xn?1)?f[x0,x1,...,xn]?n?1(x)?Nn(x) 其中 Nn(x)?f(x0)?f[x0,x1](x?x0)?f[x0,x1,x2](x?x0)(x?x1)?...?f[x0,...,xn](x?x0)...(x?xn) Rn(x)?f(x)?Nn(x)?f[x,x0,...,xn]?n?1(x) ?n(x)?(x?x0)(x?x1)...(x?xn) 由式(1-1)确定的多项式Nn(x)显然满足插值条件,且次数不超过n次的多项式,其系数为 ak?f[x0,...,xk](k?0,1,...,n)

称Nn(x)为牛顿(Newton)均差插值多项式。系数ak就是书本表5-1中第一条斜线上对应的数值。 式(1-2)为插值余项,由插值多项式唯一性可知,它与书本式(5.1.19)是等价的,事实上,利用均差与导数关系式可由式(1-2)推出书本式(5.1.19)。但式(1-2)更有一般性,它对f是由离散点给出的情形或f导数不存在时均适用。 (2)程序设计思路 1)输入:n的值及(xi,yi),i?0,1,...,n;要计算的函数点x(本文取x0,x1两个函数点); 2)由 Nn(x)?f(x0)?f[x0,x1](x?x0)?f[x0,x1,x2](x?x0)(x?x1)?...?f[x0,...,xn](x?x0)...(x?xn)计算 Nn(x)的值; Nn(x)。 3)输出:(3)源程序 function f=Newton(x,y,x0,x1) syms t; if(length(x)==length(y)) n=length(x); c(1:n)=0.0; else disp('x和y的维数不相等!'); return; end f=y(1); y1=0; l =1; for(i=1:n-1) for(j=i+1:n) y1(j)=(y(j)-y(i))/(x(j)-x(i)); end c(i)=y1(i+1); l=l*(t-x(i)); f=f+c(i)*l; y=y1; end f=simplify(f); g=subs(f,'t',x0) g1=subs(f,'t',x1) A=zeros(n,n-1); A=[y',A]; for j=2:n for i=j:n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(x(i)-x(i+1-j)); end end disp('差商表为'); disp(A); (4)运行结果 >> x=[0 1 2 3]; >> y=[1 2 17 64]; >> x0=0.5; >> x1=2.5; >> f=Newton(x,y,x0,x1)

g = 0.8750 g1 = 35.3750 差商表为 0 0 0 0 1.0000 1.0000 0 0 7.0000 6.0000 2.5000 0 3.0000 -4.0000 -5.0000 -2.5000 f = 1-2*t^2+3*t^3 4、实验小结体会: 1)通过本次实验让我从实践验证了理论-------插值多项式的基本思想; 2)牛顿插值法建立过程中用到了插商计算,这是有别于拉格朗日插值法的一部分,在已知点数较少的情况下用牛顿插值法较为准确; 3)通过编程,加深了matlab的熟悉特别是一些函数语句,进一步体会到了函数逼近的思想。

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4