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.为什么会出现失败?
答案 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);
现在是时候解释原因了。
由于您要将xn
和x0
之间的差异除以N
,因此获取x0 = xn
所需的循环次数等于N
因为在每个循环结束时你都会x0 = x0 + h
。如果是N = 3
,您会自动知道在第三次循环后,您需要在x0 = xn
后停止。
使用while
并比较x0
和xn
是危险的,因为它们都是双精度浮点数,并且在迭代期间可能会丢失精度。即使它们非常非常非常非常非常接近,它们也有可能无法匹配。
使用你的方法,由于精度的损失,在第三次循环之后你将x0
和xn
几乎完全相同......好吧,如果你将它们四舍五入到大约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
。