MATLAB-正割法产生NaN

时间:2019-03-20 13:59:46

标签: matlab numerical-methods

我正在用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

1 个答案:

答案 0 :(得分:1)

xnNaN完全相等时,xn_2的值将为xn_1,这将导致0/0条件。您需要在while循环条件中进行其他检查,以查看xn_1x_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以了解浮点比较的一些陷阱(即==~=通常不是最佳的运算符)浮点数)。