当N = 3时,NUMERİCAL方法梯形法则失败?

时间:2017-11-29 22:01:24

标签: matlab

clc
clear all
close all
f=@(x) (exp(3*x)+sin(x));
x0=pi/2;
xn=pi;
%x0=input('lower= ');
%xn=input('upper= ');
N=input('N= ');
h=((xn-x0)/N);
area =0;
while (x0<xn)
   area=area+(h/2)*(f(x0)+f(x0+h));
   x0=x0+h;
end
fprintf('area=%f',area);

此代码中的所有内容都没有输入,而没有输入N值为3.为什么会出现失败?

1 个答案:

答案 0 :(得分:1)

这有效:

% ...
N = input('N= ');
h = (xn-x0) / N;
area = 0;

for i=1:N
    area = area + ((h/2) * (f(x0) + f(x0+h)));
    x0 = x0 + h;
end

fprintf('area=%f',area);

现在是时候解释原因了。

由于您要将xnx0之间的差异除以N,因此获取x0 = xn所需的循环次数等于N因为在每个循环结束时你都会x0 = x0 + h。如果是N = 3,您会自动知道在第三次循环后,您需要在x0 = xn后停止。

使用while并比较x0xn是危险的,因为它们都是双精度浮点数,并且在迭代期间可能会丢失精度。即使它们非常非常非常非常非常接近,它们也有可能无法匹配。

使用你的方法,由于精度的损失,在第三次循环之后你将x0xn几乎完全相同......好吧,如果你将它们四舍五入到大约10位左右那么相同,但小数点后更高的精度不完全相同...因此while条件将失败,循环将继续。

如果要在保持高精度配置文件的浮点数之间进行良好比较,则需要检查:

abs(a - b) > eps(max(abs(a), abs(b)))

喜欢(这个while可以在您的代码中完成工作):

while (abs(xn - x0) > eps(max(abs(xn), abs(x0))))
    %...
end

换句话说,您必须定义tolerance level