我正在用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)
secantmeth(eqn,2,3,5)
输入2
eqn = @(x)(x ^ 2 + x-9)
secantmeth(eqn,2,3,9)
输出1
2.7321
输出2
NaN
答案 0 :(得分:1)
当xn
和NaN
完全相等时,xn_2
的值将为xn_1
,这将导致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以了解浮点比较的一些陷阱(即==
和~=
通常不是最佳的运算符)浮点数)。