Python で Fsolve を使用する

Abid Ullah 2023年6月21日
  1. Python の fsolve 関数
  2. fsolve 関数を使用して Python で解を見つける
Python で Fsolve を使用する

この記事では、fsolve を使用して Python で解を見つける方法について説明します。 また、それが使用されるシナリオと、特定の種類の結果に到達するためにいつどのように使用できるかをよりよく理解するためのサンプル コードも検討します。

fsolve とは何か、なぜそれが使われるのかを理解することから始めましょう。

Python の fsolve 関数

方程式はデータ サイエンスのルーツであり、データ サイエンティスト、数学者、化学エンジニア、医師が日常的に扱うさまざまなシナリオを理解するのに役立ちます。 コンピュータが日常生活に溶け込んだ現在、より大きなスケールの方程式を逐次解くことは難しくなっています。

Python の fsolve を使用すると、これらの専門家やその他の人々が、Python ライブラリが提供するさまざまなモジュールを使用してこれらの方程式を簡単に解くことができます。 fsolve は基本的に、非線形方程式の根を返す SciPy モジュールです。

fsolve がさまざまなシナリオで提供するさまざまなパラメーターがあります。 これらは、オンラインで入手できる SciPy ドキュメントから直接簡単に見つけることができます。

fsolve のパラメータのリスト全体は次のようになります。

コード例:

scipy.optimize.fsolve(
    func,
    x0,
    args=(),
    fprime=None,
    full_output=0,
    col_deriv=0,
    xtol=1.49012e-08,
    maxfev=0,
    band=None,
    epsfcn=None,
    factor=100,
    diag=None,
)

SciPy のドキュメントで、すべてのパラメーターの詳細な説明とそれぞれの内容を確認できます。 ただし、これらのパラメーターの簡単でわかりやすい概要を説明します。

パラメータ 説明
func、callable f(x, *args) これは基本的に、1つ以上のベクトル引数を取り、引数と同じ長さの値を返す関数の記述です。
x0, ndarray この引数は、関数 f(x)=0 の根の初期推定が何であるかを示します。
args, タプル (オプション) これらは、関数に必要な追加の引数です。
fprime、callable f(x, *args) (オプション) これは、関数のヤコビアンの推定値を行全体の導関数で計算するための関数です。
full_output、ブール値 (オプション) これは、条件が満たされるか True の場合にオプションの出力値を返します。
col_deriv, bool (オプション) この引数を介して、ヤコビ関数が列の導関数を計算するかどうかを指定します。 SciPy のドキュメントによると、転置操作がないため、これは高速です。
xtol, float (オプション) この引数により、関数は、2つの連続する反復値の間の相対誤差の最大の xtol に基づいて計算を終了できます。
maxfev, int (オプション) これは、関数の呼び出しの最大数を定義します。
band, タプル (オプション) これは、fprimeNone に設定されている場合です。 引数が、行列内のサブ対角とスーパー対角の数を含む 2つのシーケンスに設定されている場合、Jacobi 行列はバンド化されていると見なされます。
epsfcn, float (オプション) fprimeNone に設定されている場合、この引数には、ヤコビアンの前方差分の近似に適したステップ長が含まれます。 epsfcn が機械精度よりも小さい場合、関数の相対誤差は機械精度のオーダーであると想定されます。
factor, float (オプション) この引数は初期ステップ バウンドを決定し、(0.1, 100) の間でなければなりません。
diag, シーケンス (オプション) これらの N 正のエントリは、変数のスケール ファクターとして機能します。

fsolve 関数を使用して Python で解を見つける

お気づきかもしれませんが、fsolve はさまざまなシナリオのさまざまな非線形方程式に使用できます。 fsolve がどのように使用されるかをよりよく把握するために、いくつかの簡単なコード サンプルを調べてみましょう。

-0.2 を始点とする方程式 x+2cos(x) の根を求めます

コード例:

from math import cos
import scipy.optimize


def func(x):
    y = x + 2 * cos(x)
    return y


y = scipy.optimize.fsolve(func, 0.2)
print(y)

このコードでは、Python の膨大な math ライブラリから cos 関数をインポートし、scipy (fsolve のソース) から optimize をインポートします。 次に、方程式を定義し、それを func メソッドの y に格納します。

方程式が正しく初期化された後は、単に fsolve を使用して、方程式を含むメソッド (func) を呼び出します。 2 番目の引数では、方程式の開始点を定義します。

結果は変数 y に格納され、出力用に出力されます。

コードの出力:

[-1.02986653]

始点 0 と 2 で方程式を解く

コード例:

from math import cos
import scipy.optimize


def func(x):
    y = [x[1] * x[0] - x[1] - 6, x[0] * cos(x[1]) - 3]
    return y


x0 = scipy.optimize.fsolve(func, [0, 2])
print(x0)

このコードでは、Python の math および scipy ライブラリから cos および scipy.optimize をインポートすることにより、コード 1 と同じ手順に従います。 次のステップに進み、func というメソッドで方程式を定義します。

次に、このメソッドを fsolve 関数の引数として呼び出し、0 と 2 の 2つの開始点を指定します。これらは、x0 という変数に保存および出力されます。

コードの出力:

[6.49943036 1.09102209]

始点 0.3 で式 4sin(y)-4 の根を見つけます

コード例:

from math import sin
import scipy.optimize


def func(y):
    x = 4 * sin(y) - 4
    return x


x = scipy.optimize.fsolve(func, 0.3)
print(x)

このコード例では、cos の代わりに math ライブラリから sin をインポートします。 コードの構造は上記の例と同じままで、fsolvescipy.optimize をインポートし、メソッド func 内で方程式を定義します。

このメソッドを、開始点が 0.3 の fsolve の引数と呼びます。 結果の値は変数 x に格納され、出力用に出力されます。

コードの出力:

[1.57079633]

この記事では、fsolve が非線形方程式の根を見つけるために使用されること、fsolve が取ることができるさまざまな種類のパラメーターとそれぞれが何を伴うかについて学びました。 さらに、fsolve の実用的な例をいくつか見て、コードでどのように使用できるかを調べました。

fsolve を使用して解を導出する方法の理論と実際のコード サンプルを確認したので、次は独自のコードを作成して、fsolve の動作をさらに調査します。

この記事が、fsolve を使用して Python の問題を解決する方法を理解するのに役立つことを願っています。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn