MATLAB のニュートン ラフソン法

Ammar Ali 2024年2月15日
MATLAB のニュートン ラフソン法

このチュートリアルでは、MATLAB で Newton-Raphson 法を使用して関数の根を見つける方法について説明します。

MATLAB のニュートン ラフソン法

関数の根を見つけるには、ニュートン ラフソン法を使用します。 この方法では、式を使用して連続関数を接線で近似し、特定の関数の根の近似を見つけます。

ニュートン・ラフソン法で根を見つけるために使用される式は次のとおりです。

ニュートン法

この式は、前の値、関数、およびその導関数を使用して、指定された関数の次の根を見つけます。 関数の導関数を見つけるには、MATLAB の diff() 関数を使用できます。

上記の式を使用してルートを取得するには、ループを使用する必要があります。 たとえば、4つのルートを見つける必要がある場合は、ループを 4 回繰り返します。

与えられた関数を変数に保存し、diff() 関数を使用してその導関数を取得し、変数内に保存します。 また、以前のルート値に簡単にアクセスできるように、すべてのルート値を配列内に格納する必要があります。

その後、ループを使用して根を見つける必要があり、根の配列を使用して値を更新します。 subs() 関数を使用してループ内の値を更新し、ルート値をルート配列に格納できます。

たとえば、関数を定義して乱数関数を使用し、MATLAB で上記の式を使用して最初の 5つの根を見つけてみましょう。 以下のコードを参照してください。

clc
clear
fun = @(x) sin(x);
roots = mynewton(fun, 2, 5)

function output = mynewton(fun,a,n)
syms x;
z = fun(x);
derZ = diff(z);
out = zeros(1,n+1);
out(1) = a;

for idx = 1 : n
    numeratorZ = subs(z,x,out(idx));
    denominatorZ = subs(derZ,x,out(idx));
    out(idx+1) = out(idx) - double(numeratorZ)/double(denominatorZ);
end
output = out;
end

出力:

roots =

    2.0000    4.1850    2.4679    3.2662    3.1409    3.1416

上記のコードでエラーが表示される場合は、関数 mynewton() を別の .m ファイルに保存し、mynewton.m のように関数名と同じ名前を付けてから、別の .m ファイルを作成し、 呼び出すコードの先頭 4 行と関数を記述するか、MATLAB のコマンド ウィンドウから呼び出します。 テスト ファイルと mynewton.m は同じディレクトリにある必要があります。

上記のコードでは、mynewton() 関数を定義しました。この関数では、根を見つけたい特定の関数、根の初期推定値、および見つけたい根の数を渡す必要があります。

zeros() 関数を使用してルート配列をゼロで初期化し、式を使用して評価した後に値を配置できるようにしました。

subs() 関数を使用して、上記のニュートン ラフソン法の式の分子と分母の値を更新しました。 subs() 関数の最初の引数は、ルートを見つけたい特定の関数です。

2 番目の引数は変更する古い値で、3 番目の引数は指定された関数内の古い値の代わりに配置する新しい値です。

subs() 関数の後、出力は cos(number) のような関数形式になるため、double() 関数を使用して値を数値に変換し、ニュートン ラフソン式を適用します これらの値を使用してルートの値を見つけます。

出力は、根と初期推定値が出力配列内に格納されていることを示しています。 上記のコードは Newton-Raphson 法の基本的な表現ですが、許容誤差やアルゴリズムが収束するかどうかを確認する方法など、他のものを追加できます。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook