0

环路错误我试图找到利用牛顿迭代法找到根源。它通过猜测然后在每次迭代之后改进猜测来做到这一点,直到得到一个零。虽然与Netwon迭代法

因为牛顿迭代方法很快就找到了零,则立即和两个或三个迭代最大应该不符合while循环的条件后,给了我一个小错误。然而,问题是,当我在我的循环“错误”后删除分号,我开始越来越分数应该打破while循环,但它像Matlab不知道123/8328423小于1。它会继续运行,直到我手动强制程序停止运行。

我该如何解决这个问题?我试图格式化long格式,并在命令窗口,脚本文件和循环中的某处使用double。

预先感谢您的任何提示,建议或意见,可以帮助!

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) 

回答

2

我认为主要的问题是error
它开始为double但while循环里面变成了一个象征性的变量,你不能轻易比较标值(.01在while循环条件)符号变量。

检查您的工作区,如果error是符号(或键入class(error)并检查是否返回sym)。我猜它是符号的,因为返回一个分数(123/8328423),因为相反,Matlab会用小数对待double值,而不是分数。
如果是这样,尝试做(while循环中)转换为error也就是线下

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

尝试把

error=double(error); 

所以error将暂时转换在double和你可以轻松地将其值与.01进行比较以检查while-loop条件。

此外,由于error()是Matlab中的一个内置函数,所以调用变量error是个不好的做法。通过命名变量error你不能使用error()功能。同样的故事也适用于其他内置功能。