【问题标题】:While loop error with Netwon-Raphson Method使用 Newton-Raphson 方法的 While 循环错误
【发布时间】:2016-02-28 09:59:02
【问题描述】:

我正在尝试使用 Newton-Raphson 方法来查找根源。它通过猜测,然后在每次迭代后改进猜测,直到你得到一个零。

因为 Newton-Raphson 方法可以快速找到零点,所以它会立即给我一个小错误,并且在最多两到三个迭代后它应该无法满足 while 循环的条件。但是,问题是当我在循环中删除“错误”之后的分号时,我开始得到应该打破 while 循环的分数,但它就像 Matlab 不知道 123/8328423 小于 1 .它会继续运行,直到我手动强制程序停止运行。

我该如何解决这个问题?我在命令窗口、脚本文件和循环中的某处尝试了长格式、长格式和双精度。

提前感谢您提供任何可能有帮助的提示、建议或建议!

A = [1,2,-4;2,-2,-2;-4,-2,1;];
format longe
% syms x y z  
% P = x^4 + 3*x^2*y^2-z^3+y+1;
% feval(symengine,'degree',P,x)

syms x

B = mateigenvalue(A);
f(x) = simplify(matdet(B));

x0 = 1;
error = 10;
while(error > .01)
    x1 = x0 - f(x0)/(27*(x0)-3*(x0)^2);
    error = abs(((f(x0)-f(x1))/f(x0))*100)
    x0 = x1;  
end

x0 = double(x0)

【问题讨论】:

    标签: matlab while-loop numerical-methods approximation termination


    【解决方案1】:

    我认为主要问题在于error
    它以double 开头,但在while 循环中它变成了一个符号变量,您不能轻易地将符号变量与标量值进行比较(while 循环条件中的.01)。

    检查您的工作区是否error 是符号(或键入class(error) 并检查sym 是否返回)。我猜它是象征性的,因为返回了一个分数 (123/8328423),因为 Matlab 用小数处理双精度值,而不是分数。
    如果是这样,请尝试(在 while 循环内)为error 进行转换,即在该行下

    error = abs(((f(x0)-f(x1))/f(x0))*100);
    

    试一下

    error=double(error);
    

    所以error会被临时转换成double,你可以很容易地将它的值与.01比较来检查while循环条件。

    另外,调用变量error 是不好的做法,因为error() 是Matlab 中的内置函数。通过命名变量error,您不能使用error() 函数。其他内置函数也是如此。

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 2014-03-13
      • 2014-03-21
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多