我正在用MATLAB编写一个割线方法,我想要迭代它整整n次。
function y = secantmeth(f,xn_2,xn_1,n)
xn = (xn_2*f(xn_1) - xn_1*f(xn_2))/(f(xn_1) - f(xn_2));
k = 0;
while (k < n)
k = k + 1;
xn_2 = xn_1;
xn_1 = xn;
xn = (xn_2*f(xn_1) - xn_1*f(xn_2))/(f(xn_1) - f(xn_2));
end
y = xn;
end我相信这个方法适用于n的小值,但是即使像n=9这样的东西也会产生NaN。我的猜测是,数量f(xn_1) - f(xn_2)大约为零,这导致了这个错误。我怎么才能阻止这一切?
示例:
输入1 eqn = @(x)(x^2 +x-9) (2,3,5) 输入2 eqn = @(x)(x^2 +x-9) 2,3,9) 输出1 2.7321 输出2 非数
发布于 2019-03-20 14:37:17
当xn和xn_1完全相等时,xn_2的值将为NaN,这将导致0/0条件。您需要在while循环条件中进行额外的检查,以查看xn_1和x_n是否相等(或者更好的是within some small tolerance of one another),从而表明循环已经收敛在解决方案上,不能再迭代了:
...
while (k < n) && (xn_1 ~= xn)
k = k + 1;
xn_2 = xn_1;
xn_1 = xn;
xn = (xn_2*f(xn_1) - xn_1*f(xn_2))/(f(xn_1) - f(xn_2));
end
...作为Ander mentions in a comment,如果您想要获得更精确的近似,那么可以在while循环之后继续使用不同的方法:
...
if (xn_1 == xn) % Previous loop couldn't iterate any further
% Try some new method
end
...再一次,我建议阅读this question来理解浮点比较的一些缺陷(也就是说,==和~=通常不是浮点数字的最佳运算符)。
https://stackoverflow.com/questions/55262519
复制相似问题