计算方法上机实验报告-MATLAB

Pn?x? 在区间?a,b?上的截断误差为 f(n?1)(?)R()?f?x?? Pn?x???n?1?x?,x?[a,b], nx?n?1?!其中?n?1?x?=??x?x? ii?0n程序:

function y=f(x)%定义原函数 y=x*(1+cos(x)); end

function y1=maxM(a,b)%输入区间[a,b]的上下限% syms x y=f(x);

y5=diff(y,5);%求n+1阶导

y1=max(abs(subs(y5,x,[a:0.01:b])));%求导函数的绝对值在[a,b]区间上的最大值 end

function lagrange_interpolation(x)%输入待求点x值矩阵x % 给定插值节点x0[N]%

x0=[0,pi/8,pi/4,3*pi/8,pi/2];

% x0=input('x0=');%输入插值节点矩阵x0 n=length(x0); m=length(x);

% 计算插值节点所对应的函数值% for i=1:n

y0(i)=f(x0(i)); end

% lagrange插值法% for i=1:m

z=x(i);s=0.0; for k=1:n p=1.0; for j=1:n if j~=k

p=p*(z-x0(j))/(x0(k)-x0(j));

11

end end

s=p*y0(k)+s; end y(i)=s; end w=1.0;

% 结果输出% for i=1:m for j=1:n

w=w*(x(i)-x0(j)); end

fprintf('f(x(%d))的近似值为 %1.15g\\n',i,y(i)); fprintf(' 误差估计

<=%1.15e\\n',maxM(x0(1),x0(n))/prod(1:n)*abs(w));%调用MaxM函数 fprintf(' 绝对误差为 %1.15e\\n',abs(f(x(i))-y(i))); end end

结果:

12

五、题目

例4.3已知f(x)?1?ch2x,试取插值节点

x0?0.35,x1?0.50,x2?0.65,x3?0.80,x4?0.95,

构造4次Newton插值多项式,由此计算f(0.7)的逼近值,并指出其绝对误差。

原理:

设x0,则称(为(在x1,?,xn 为区间?a,b?上的互异节点,fxi)fx)xi处的零阶差商,称

f?xi?? f?xj?xi?xj 为函数( 在xi,xj处的一阶fx)差商,记为f[xi,xj] , 一般称

f[x0,x1,?,xn]f[x0,x1,?,xn?1]?f[x1,x2,?,xn]

x0?xnf?xi?为( 在x0,x1,?,xn处的n阶差商 fx)f[x0,x1,?,xn]??j?0n??1?xj??n

这里?n?1?x????x?x?.

ii?0n按照差商定义可得,

f?x??Nn?x??Rn?x?,

13

其中

Nn?x??f?x0??f[x0,x1]?x? x0????f[x0,x1,?,xn]?n?x?, Rn?x??f[x0,x1,?,xn,x]?n?1?x?

?n?x????x?xi?,

i?0n?1易知N()?P(),?x?[a,b], nxnx因此N可作为(的n次插值多项式,称之为n次Newton插值公()fx)nx式,其截断误差

f(n?1)(?)Rn?x??f?x? ?Nn?x???n?1?x?,x?[a,b],

?n?1?!其中?n?1?x????x?x?,其中?在诸x和x之间。

inii?0程序:

function y=f(x)%定义原函数 y=sqrt(1+cosh(x)^2); end

function newton_interpolation(x)%输入待求点x值 % 给定插值节点x0%

x0=[0.35,0.50,0.65,0.80,0.95];

% x0=input('x0=');%输入插值节点矩阵x0 n=length(x0);

% 计算插值节点所对应的函数值y0% for i=1:n

y0(i)=f(x0(i)); end

% Newton插值法% a(1)=y0(1); for k=1:n-1

d(k,1)=(y0(k+1)-y0(k))/(x0(k+1)-x0(k));

14

end

for j=2:n-1 for k=1:n-j

d(k,j)=(d(k+1,j-1)-d(k,j-1))/(x0(k+j)-x0(k)); end end

fprintf('\\n差商值表为\\n'); disp(vpa(d,15)); for j=2:n

a(j)=d(1,j-1); end

b(1)=1;c(1)=a(1); for j=2:n

b(j)=(x-x0(j-1)).*b(j-1); c(j)=a(j).*b(j); end

% 结果输出 %

fprintf('f(x)的逼近值为 %1.16g\\n',sum(c));

fprintf(' 绝对误差为 %1.16g\\n',abs(f(x)-sum(c))); end

结果:

15

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