optimize_simplex プログラム仕様

Simplex最適化アルゴリズムの実装。

このモジュールは、Nelder-Mead (Simplex) 法を用いた多変数関数の最小化機能を提供します。 初期シンプレックスの構築、反射、拡張、収縮、縮小の各ステップを通じて、 関数の局所最小値を見つけます。

optimize-simplex_usage

cms.optimization.optimize_simplex.func(x)[ソース]

最適化対象の目的関数を定義します。

この関数は2変数の二次関数であり、f(x0, x1) = (x0 - 1.0)^2 + (x1 - 3.0)^2 を計算します。 最小値はx = [1.0, 3.0]で0.0です。

パラメータ:

x (numpy.ndarray) -- 評価する変数のnumpy.ndarray。x[0]とx[1]を含む必要があります。

戻り値:

関数の評価値。

戻り値の型:

float

cms.optimization.optimize_simplex.main()[ソース]

Simplex最適化アルゴリズムを実行するメイン関数です。

最適化の初期条件(初期点、ステップサイズ、許容誤差、最大反復回数など)を設定し、 `simplex`関数を呼び出して関数の最小化を行います。

cms.optimization.optimize_simplex.simplex(func, x, dx, tolx, tolf, itmax, lprint, iprintinterval)[ソース]

Nelder-Mead (Simplex) 法を用いて多変数関数を最小化します。

この関数は、反射、拡張、収縮、縮小といった幾何学的な操作を繰り返すことで、 与えられた目的関数の局所最小値を探索します。 初期シンプレックスを構築し、各反復でシンプレックスの頂点を更新して、 関数値が最も低い点へと移動させます。

パラメータ:
  • func (callable) -- 最小化される目的関数。1つのnumpy.ndarrayを引数にとり、floatを返す関数である必要があります。

  • x (numpy.ndarray) -- 最適化の開始点となる変数の初期値。最適化完了時には最小値を与える変数が格納されます。

  • dx (numpy.ndarray) -- 最初のシンプレックスを各次元に拡張するためのステップサイズ。

  • tolx (float) -- 変数の値に関する収束判定許容誤差。シンプレックスのサイズがこの値より小さくなると収束と判断されます。

  • tolf (float) -- 関数値の変化に関する収束判定許容誤差。シンプレックスの関数値の差がこの値より小さくなると収束と判断されます。

  • itmax (int) -- 最大反復回数。この回数を超えると探索を終了します。

  • lprint (int) -- 出力の詳細度を設定します。 0: 収束/反復上限に関する情報のみ。 1: 主要な反復情報(ITER, FL, FS, FH)を出力します。 2以上: 詳細な操作(REFLECTION, EXPANSION, CONTRACTION, REDUCTION)を出力します。

  • iprintinterval (int) -- lprintが1以上のとき、主要な反復情報を出力する間隔。

戻り値:

  • fmin (float): 最小化された関数値。

  • x (numpy.ndarray): 最小値を与える変数。

戻り値の型:

tuple[float, numpy.ndarray]

注釈

元のコードにはC/Fortran由来と思われる1ベースインデックスの記述や、 Pythonでは使用されない`goto`文のコメントアウトが存在します。 これらの記述は既存のロジックを変更しないというルールに基づき、そのまま残されています。 特に、配列のインデックス処理(f[il - 1], xx[ih][j+1])は、 一部で直感的ではないように見えるかもしれませんが、元のコードの意図を尊重しています。