无限循环Newton Raphson

时间:2014-02-10 15:39:25

标签: matlab numerical-methods newtons-method

这里非常新的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

4 个答案:

答案 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。

enter image description here

你可以看到每个迭代在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方法的另一个陷阱就在附近。我建议你绑定解决方案,不要让步骤超出范围。