内容发布更新时间 : 2025/1/23 14:48:42星期一 下面是文章的全部内容请认真阅读。
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