虽然与Netwon迭代法
问题描述:
环路错误我试图找到利用牛顿迭代法找到根源。它通过猜测然后在每次迭代之后改进猜测来做到这一点,直到得到一个零。虽然与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)
答
我认为主要的问题是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()
功能。同样的故事也适用于其他内置功能。