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

これは、数値解析を教えるための古典的な種類の問題です。この関数のプロットをx*exp(-x)見てください(FooPlot 経由)

で見つけるゼロがあることがわかりますx=0(これは調べれば明らかです)。しかし、関数は正の無限大に向かって減衰します。

したがって、ニュートン ラフソン アルゴリズムは、無限遠に存在するゼロに到達しようとして行き詰まる可能性があります。この問題は、このメソッドに関するウィキペディアの記事で言及されています。

さまざまな初期条件を試すことができます (この場合、 の左側がx=0機能するはずです)。また、逐次過緩和と呼ばれるアプローチを試すこともできます。これは基本的に、0 から 1 の間の分数を選択して呼び出し、ループの最後にw設定x0 = w*x1 + (1-w)*x0し、自分がすでにいるポイントに少し近づくように自分自身をシェーディングすることを意味します。計算された に完全にジャンプする代わりにx1

于 2014-02-10T16:07:30.347 に答える