这里非常新的matlab用户。您在下面看到的代码非常适合解决方程式2但是当我切换到EQUATION 1时,matlab变得“忙碌”,似乎没有任何效果。
ctrl + c,ctrl + d,ctrl +似乎没有用,但我想解决潜在的问题
function [x1, relErr] = NewtonRaphson(x0, TOL, MAX)
x = sym('x');
f(x) = x*exp(-x); %EQUATION 1
%f(x) = x^2-6 %EQUATION 2
df = diff(f);
relErr = 1:MAX;
for i = 1:MAX,
x1 = double(x0 - f(x0) / df(x0));
% Compute relative approximated error
relErr(i) = abs(x1-x0)/abs(x1);
if( abs(x0-x1) < TOL )
char(x1);
fprintf('Newton: Solution %0.5f in %d iterations\n',x1,i);
relErr = relErr(1:i);
plot(relErr);
lambda = abs(x1-6)/((abs(x0-6))^2);
char(lambda);
fprintf('Newton: Lamda = %0.5f\n',lambda);
return;
end
x0 = x1 ;
end
display('Method failed, hit max iterations');
end
答案 0 :(得分:1)
这是教授数值分析的一个典型问题。看看the plot of this function x*exp(-x)
(via FooPlot)。
你可以看到在x=0
找到零(这在检查时很明显)。但是这个功能也向正无穷大衰退。
因此,Newton-Raphson算法可能会陷入困境,试图走向无限远的零点。这个问题是mentioned in the Wikipedia article on this method。
您可以尝试不同的初始条件(在这种情况下,x=0
左侧的内容应该有效)。您还可以尝试一种称为连续过度放松的方法,这基本上意味着您选择介于0和1之间的分数,将其称为w
并在循环结束时设置x0 = w*x1 + (1-w)*x0
,将自己置于阴影中稍微接近你已经到达的点,而不是完全跳到计算的x1
。
答案 1 :(得分:1)
你获得无限循环的原因是Newton-Raphson的功能
f(x) = x * exp(-x)
对于大于1的初始猜测,不会收敛。
要了解其原因,请查看下图,其中蓝色曲线为x * exp(-x),虚线为x = 1,红线显示连续的Newton-Raphson迭代,从x =开始3。
你可以看到每个迭代在x = 0时进一步远离根,在x = +无穷大处向“假根”移动,如EMS的答案所述。
答案 2 :(得分:0)
详细说明EMS的答案:
对于f(x)=x*exp(-x)
,得到f'(x)=(1-x)*exp(-x)
,以便牛顿迭代读为
x[n+1]=N(x[n])=x[n]-x[n]/(1-x[n])=-x[n]**2/(1-x[n])
但同样如
x[n+1]=N(x[n])=x[n]+x[n]/(x[n]-1)=x[n]+1+1/(x[n]-1)
从第一种形式开始,您可以看到x=0
的小值为x
的二次收敛,比如说|x|<0.5
。
但从第二种形式可以看出,对于x[n]>1
,下一个值会更大,增量总是大于1
,所以你甚至不会得到某种伪收敛
答案 3 :(得分:0)
尝试:
relErr(i) = abs(x1-x0)/abs(x0);
因此您将相对于先前的值与当前值进行比较。当df=0
步骤变得太大时,NR方法的另一个陷阱就在附近。我建议你绑定解决方案,不要让步骤超出范围。