Newton-Raphson 方法的 While 循环错误
While loop error with Netwon-Raphson Method
我正在尝试使用 Newton-Raphson 方法求根。它通过进行猜测然后在每次迭代后改进猜测直到获得零之一来做到这一点。
因为Newton-Raphson法找零的速度很快,马上报了个小错误,最大两三次迭代后应该不满足while循环的条件。但是,问题是当我在循环中删除 "error" 之后的分号时,我开始得到应该打破 while 循环的分数,但它就像 Matlab 不知道 123/8328423
更少比 1
。它继续 运行 直到我手动强制程序停止 运行ning.
我该如何解决这个问题?我在命令 window、脚本文件和循环中的某处尝试了 format long、format longe 和 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 循环内它变成一个符号变量,您不能轻易地将符号变量与标量值(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()
函数。其他内置函数也是如此。
我正在尝试使用 Newton-Raphson 方法求根。它通过进行猜测然后在每次迭代后改进猜测直到获得零之一来做到这一点。
因为Newton-Raphson法找零的速度很快,马上报了个小错误,最大两三次迭代后应该不满足while循环的条件。但是,问题是当我在循环中删除 "error" 之后的分号时,我开始得到应该打破 while 循环的分数,但它就像 Matlab 不知道 123/8328423
更少比 1
。它继续 运行 直到我手动强制程序停止 运行ning.
我该如何解决这个问题?我在命令 window、脚本文件和循环中的某处尝试了 format long、format longe 和 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 循环内它变成一个符号变量,您不能轻易地将符号变量与标量值(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()
函数。其他内置函数也是如此。