equation-newton-raphson.py 技術ドキュメント

プログラムの動作

本プログラム equation-newton-raphson.py は、ニュートン・ラフソン法を用いて超越方程式の根を数値的に求めるPythonスクリプトです。具体的には、\(f(x) = e^x - 3x = 0\) という方程式の根を探索します。

主な機能:

  • 指定された初期値からニュートン・ラフソン法を適用し、方程式の根を求めます。

  • 計算過程でダンピングファクターを導入し、収束挙動を調整できます。

  • 反復ごとに現在の解の推定値と収束状況をコンソールに表示します。

  • 計算の進捗をリアルタイムでグラフ上に可視化し、解の探索過程を視覚的に理解できます。グラフには、対象関数 \(f(x)\) の形状、ゼロ点を示す直線、および各反復での解の推定値が表示されます。

解決する課題:

解析的に解を求めることが難しい非線形方程式や超越方程式の根を、数値計算によって効率的に探索することを目的としています。特に、視覚的なフィードバックを通じて、ニュートン・ラフソン法の動作原理を理解するのに役立ちます。

原理

このプログラムは、ニュートン・ラフソン法(Newton-Raphson method)をアルゴリズムの根幹としています。ニュートン・ラフソン法は、関数 \(f(x)\) の根(\(f(x)=0\) となる \(x\) の値)を見つけるための反復手法です。

  1. ニュートン・ラフソン法の基本原理 初期値 \(x_0\) から始め、各反復で接線を利用して次の近似値 \(x_{n+1}\) を計算します。反復式は以下のようになります。

    \[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\]

    ここで、\(f(x_n)\) は現在の近似値 \(x_n\) における関数の値、\(f'(x_n)\)\(x_n\) における関数の導関数の値です。

  2. 対象となる方程式と導関数 本プログラムで根を求める対象となる関数 \(f(x)\) は、

    \[f(x) = e^x - 3x\]

    です。その導関数 \(f'(x)\) は、

    \[f'(x) = e^x - 3\]

    となります。

  3. ダンピングファクター (Dumping Factor) プログラムでは、ニュートン・ラフソン法の反復式にダンピングファクター dump を導入しています。これは、収束を安定させたり、発散を防ぐためにステップ幅を調整する目的で使用されます。具体的には、導関数 \(f'(x)\) の項に \((1 + \text{dump})\) を乗算します。

    \[x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n) (1 + \text{dump})}\]

    dump > 0 の場合、分母の絶対値が大きくなるため、ステップ幅 \(|x_{n+1} - x_n|\) は小さくなり、収束がより緩やかになります。

  4. 収束判定 反復は、近似値の差 \(|x_{n+1} - x_n|\) が事前に設定された許容誤差 eps より小さくなったときに収束したと判断し、終了します。最大反復回数 nmaxiter を超えた場合は、収束失敗と判断されます。

必要な非標準ライブラリとインストール方法

本プログラムの実行には、以下の非標準ライブラリが必要です。

  • numpy: 数値計算(特に指数関数 exp)に使用されます。

  • matplotlib: グラフ描画に使用されます。

これらのライブラリは、Pythonのパッケージマネージャー pip を使用してインストールできます。以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。

pip install numpy matplotlib

必要な入力ファイル

本プログラムは、実行に必要な入力ファイルを特に必要としません。すべてのパラメータはプログラム内にデフォルト値として設定されており、一部はコマンドライン引数で指定できます。

生成される出力ファイル

本プログラムは、計算結果をファイルとして保存しません。

  • 計算の進捗と最終結果は標準出力(コンソール)に表示されます。

  • 計算過程のグラフはリアルタイムでGUIウィンドウに表示されます。

コマンドラインでの使用例 (Usage)

equation-newton-raphson.py は、以下の形式でコマンドラインから実行できます。

python equation-newton-raphson.py [x0] [dump] [tsleep]

引数の説明:

  • x0 (オプション): ニュートン・ラフソン法の初期値。浮動小数点数。デフォルトは 0.0

  • dump (オプション): ダンピングファクター。浮動小数点数。デフォルトは 0.0

  • tsleep (オプション): グラフ描画間の一時停止時間(秒)。浮動小数点数。デフォルトは 1.0。この値が大きいほど、グラフの更新がゆっくりになります。

コマンドラインでの具体的な使用例

1. デフォルト設定での実行

最も基本的な実行方法で、すべてのパラメータはプログラム内のデフォルト値を使用します。

python equation-newton-raphson.py

実行結果の説明: コンソールには、初期値 \(x_0=0.0\)、ダンピングファクター \(0.0\) が表示され、その後、各反復における \(x\) の値、次の \(x\) の値、および \(dx\) の値が表示されます。最終的に収束すると「Success: Convergence reached: ...」というメッセージと共に収束した \(x\) の値が表示され、プログラム終了の入力を待ちます。 同時に、リアルタイムでグラフウィンドウが表示され、\(f(x)\) の曲線、 \(y=0\) の直線、そして反復ごとにプロットされる \((x_n, f(x_n))\) の点が確認できます。\(x_n\) の値が根に近づくにつれて、点が \(y=0\) の交点に移動していく様子が視覚的に表示されます。

コンソール出力例:

Solution of transcendental equation by Newton-Raphson method

x0 = 0.0
dumping factor = 0.0

Iter     0: x:       0.000000000000 =>        1.500000000000, dx =     1.5
Iter     1: x:       1.500000000000 =>        1.512134448375, dx =  0.01213
Iter     2: x:       1.512134448375 =>        1.512134551797, dx = 1.034e-07
Iter     3: x:       1.512134551797 =>        1.512134551797, dx = 1.137e-14
  Success: Convergence reached: dx = 1.1368683772161603e-14 < eps = 1e-10
Press enter to terminate:

2. 特定の初期値とダンピングファクター、表示速度を指定して実行

初期値を \(x_0 = 2.0\)、ダンピングファクターを \(0.1\)、グラフの更新間隔を \(0.5\) 秒に設定して実行します。

python equation-newton-raphson.py 2.0 0.1 0.5

実行結果の説明: コンソールには、指定された初期値 \(x_0=2.0\) とダンピングファクター \(0.1\) が反映されて表示されます。ダンピングファクターが \(0.1\) のため、デフォルト設定よりも収束がわずかに遅くなる可能性がありますが、安定した収束が期待されます。グラフの更新は \(0.5\) 秒ごとに行われるため、デフォルトよりも速くアニメーションが進みます。

コンソール出力例:

Solution of transcendental equation by Newton-Raphson method

x0 = 2.0
dumping factor = 0.1

Iter     0: x:       2.000000000000 =>        1.624775464879, dx =   -0.3752
Iter     1: x:       1.624775464879 =>        1.528448963493, dx =  -0.09633
Iter     2: x:       1.528448963493 =>        1.513627259166, dx =  -0.01482
Iter     3: x:       1.513627259166 =>        1.512134586617, dx = -0.001493
Iter     4: x:       1.512134586617 =>        1.512134551797, dx = -3.482e-08
Iter     5: x:       1.512134551797 =>        1.512134551797, dx = 2.776e-15
  Success: Convergence reached: dx = 2.7755575615628914e-15 < eps = 1e-10
Press enter to terminate: