【发布时间】:2022-12-31 04:30:36
【问题描述】:
我写了下面的代码,它使用 Newton Raphson 方法求根。它可以找到 1 个根,但随后会中断。应该如何修改代码以重复该算法,直到在所需范围内找到所有根?
我知道我应该使用 for 或 while 循环我只是想不通。
'''
function [xn nrfail] = newraphson(fun,xg,xl,xr,tol)
% fun is the function of interest = (0.01-1) + x*cot(x), xg is the initial root guess, xl and xr are the bounds of the range I am using
% Initializing
i=0;
nrfail=0;
check=1;
h=1e-4;
% Loop
while tol<check % Tolerence check
i=i+1;
fp=derivative(fun,xg,h); %derivative is another function I wrote that finds the derivative of the function of interest
y=feval(fun,xg);
xn=xg-y/fp; % NR method
if xn<xl || xn>xr || i>10 || fp==0 % Method check
nrfail=1;
break
end
if abs(xn) <= 1
check=abs(xg-xn); % Absolute error
else
check=abs(1-xg/xn); % Relative error
end
xg=xn; % New guess
end
end
'''
【问题讨论】:
-
初始条件至关重要,如何选择它们并非易事,以至于该算法创建了一个分形。检查牛顿分形。您确实可以在这里陷入解决方案的无限循环。
-
那么为了避免无限循环,在代码之外添加一个 for 循环会更有效吗?
-
因此,据我了解,对于给定的初始条件,您的代码有效,对吗?但是你的多项式可能有更多根。所以,你在这里真正能做的唯一一件事就是去尝试不同的初始条件,并希望你能找到一个新的根。但是牛顿分形向您展示了选择这些初始条件的方法并不简单。它变得无限复杂。因此,除非您有更多关于方程式细节的信息,否则答案是您无法找到选择起始条件的通用解决方案,以确保您找到所有根。
标签: matlab loops newtons-method