首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB -割线法生成NaN

MATLAB -割线法生成NaN
EN

Stack Overflow用户
提问于 2019-03-20 13:59:45
回答 1查看 394关注 0票数 1

我正在用MATLAB编写一个割线方法,我想要迭代它整整n次。

代码语言:javascript
复制
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 非数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 14:37:17

xnxn_1完全相等时,xn_2的值将为NaN,这将导致0/0条件。您需要在while循环条件中进行额外的检查,以查看xn_1x_n是否相等(或者更好的是within some small tolerance of one another),从而表明循环已经收敛在解决方案上,不能再迭代了:

代码语言:javascript
复制
...
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循环之后继续使用不同的方法:

代码语言:javascript
复制
...
if (xn_1 == xn)  % Previous loop couldn't iterate any further
  % Try some new method
end
...

再一次,我建议阅读this question来理解浮点比较的一些缺陷(也就是说,==~=通常不是浮点数字的最佳运算符)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55262519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档