1

非常新的matlab用户在这里。您在下面看到的代码非常适合求解公式 2,但是当我切换到公式 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

4 回答 4

1

你得到一个无限循环的原因是这个函数的牛顿拉夫森

f(x) = x * exp(-x)

对于大于 1 的初始猜测不收敛。

要了解为什么不这样做,请看下图,其中蓝色曲线是 x * exp(-x),虚线位于 x = 1,红线显示连续的 Newton-Raphson 迭代,从 x = 3 开始。

在此处输入图像描述

您可以看到每次迭代在 x = 0 处远离根,在 x = + 无穷大处向“假根”移动,如 EMS 的回答中所述。

于 2014-02-12T17:44:44.350 回答
1

这是教学数值分析的经典问题。看看这个函数的图x*exp(-x)(通过 FooPlot)

你可以看到有一个零可以找到x=0(这通过检查很明显)。但该函数也会向正无穷方向衰减。

因此,Newton-Raphson 算法可能会在试图走到远在无穷远处的零时卡住。这个问题在 Wikipedia 文章中提到了这个方法

您可以尝试不同的初始条件(在这种情况下,左边的东西x=0应该可以工作)。您也可以尝试一种称为连续过度松弛的方法,这基本上意味着您选择 0 和 1 之间的一个分数,调用它wx0 = w*x1 + (1-w)*x0在循环结束时设置,使自己保持一点接近您已经在的点at 而不是完全跳到计算的x1.

于 2014-02-10T16:07:30.347 回答
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,所以你甚至没有得到某种伪收敛。

于 2014-02-11T15:50:38.517 回答
0

尝试:

relErr(i) = abs(x1-x0)/abs(x0);

所以你比较相对于以前的值而不是当前值。当df=0步长变得太大时,NR 方法的另一个缺陷就在附近。我建议您限制解决方案,并且不要让步骤超出范围。

于 2014-02-12T17:24:43.407 回答