20.2 Minimizers

Last-modified: 2025-04-05 (土) 14:35:23

20.2 最小化

多くの場合、関数が x 軸と交差するゼロだけではなく、関数の最小値を見つける方が便利です。 は、 fminbnd検索する区間が制限されている単変量関数の、より単純ですが非常に一般的なケース向けに設計されています。 潜在的に多くの変数を持つ関数の制限のない最小化には、fminuncまたはを使用しますfminsearch。 2 つの関数は異なる内部アルゴリズムを使用するため、目的関数に関する知識がいくらか必要です。 微分可能な関数の場合、 fminuncが適切です。 不連続性を持つ関数、または勾配検索が失敗する関数の場合は、 を使用しますfminsearch。制約関数が存在する場合の最小化については、 「最適化」を参照してください。 目的関数 ( Fto_max = -Fto_min) を単純に反転するだけで、最大値の検索を行うことができることに注意してください。

: x = fminbnd (fcn, a, b)

: x = fminbnd (fcn, a, b, options)

: [x, fval, info, output] = fminbnd (…)

一変数関数の最小点を見つけます。

fcn は、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。

開始間隔は、a (左境界) とb (右境界) によって指定されます。エンドポイントは有限である必要があります。

options は、 アルゴリズムを制御する追加のパラメータを指定する構造体です。現在、 は、次 のfminbndオプションを認識します: "Display"、、、、、。"FunValCheck""MaxFunEvals""MaxIter""OutputFcn""TolX"

"MaxFunEvals"最適化を停止するまでの関数評価の最大回数を指定します。デフォルト値は 500 です。値は正の整数でなければなりません。

"MaxIter"最適化が停止されるまでのアルゴリズムの最大反復回数を指定します。デフォルト値は 500 です。値は正の整数でなければなりません。

"TolX"解xの終了許容値を指定します。デフォルトは です1e-4。

その他のオプションの説明については、 を参照してください。 を使用するoptimsetために、オプション構造体をデフォルト値で初期化するには、 を参照してください。 fminbndoptions = optimset ("fminbnd")

終了時に、関数はおおよその最小点である xと、関数がxを評価した値であるfvalを返します。

3 番目の出力情報は、アルゴリズムが成功したかどうかを報告し、次のいずれかの値を取る可能性があります。

1 アルゴリズムは解に収束しました。
0 反復制限(MaxIterまたはMaxFunEvals)を超えました。

  • 1 アルゴリズムはユーザーによって終了されましたOutputFcn。
    アプリケーションノート:

最小値の探索は、aとbで囲まれた有限区間内に制限されます。探索を開始する初期点が 1 つしかない場合は、fminuncや などの制約のない最小化アルゴリズムを使用する必要がありますfminsearch。 fminbndは内部的に黄金分割探索戦略を使用します。
匿名関数を使用して、 fcnに追加のパラメータを渡します。fminbndおよびその他の最小化関数でこれを行う具体的な例については、GNU Octave マニュアルの 「Minimizers」セクションを参照してください。
See also: fzero, fminunc, fminsearch, optimset.

: x = fminunc (fcn, x0)

: x = fminunc (fcn, x0, options)

: [x, fval] = fminunc (fcn, …)

: [x, fval, info] = fminunc (fcn, …)

: [x, fval, info, output] = fminunc (fcn, …)

: [x, fval, info, output, grad] = fminunc (fcn, …)

: [x, fval, info, output, grad, hess] = fminunc (fcn, …)

関数 fcnによって定義された制約のない最適化問題を解きます。

fminuncが局所的最小値となる ような ベクトルxを決定しようとします。fcn (x)

fcn は、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。fcn は、未知の変数を定義するベクトル (配列) を受け入れ、オプションで勾配とともに目的関数の値を返します。

x0 は開始推測を決定します。 x0の形状はfcnへのすべての呼び出しで保持されますが、それ以外の場合は列ベクトルとして扱われます。

options は、 アルゴリズムを制御する追加のパラメータを指定する構造体です。現在、 は、次のオプション を 認識しfminuncます: "AutoScaling"、、、、、、、、、、、。"FinDiffType""FunValCheck""GradObj""MaxFunEvals""MaxIter""OutputFcn""TolFun""TolX""TypicalX"

"AutoScaling"が の場合"on"、変数は(推定)ヤコビアンの列ノルムに従って自動的にスケールされます。その結果、 は"TolFun"スケーリングに依存しなくなります。デフォルトでは、このオプションは です"off"。これは、予期しない(数学的には正しいが)結果が返される場合があるためです。

"GradObj"の場合、 fcn が2 つの出力引数で呼び出されたときに、要求されたポイントにおける部分一次導関数のヤコビ行列も返すこと "on"を指定します。

"MaxFunEvals"最適化を停止するまでの関数評価の最大回数を指定します。デフォルト値は 100 * number_of_variables、つまり です。値は正の整数でなければなりません。 100 * length (x0)

"MaxIter"最適化が停止されるまでのアルゴリズムの最大反復回数を指定します。デフォルト値は 400 です。値は正の整数でなければなりません。

"TolX"は未知の変数 xの終了許容値を指定し、は"TolFun"目的関数値fvalの許容値です。デフォルトは1e-6両方のオプションとも です。

その他のオプションの説明については、 を参照してくださいoptimset。

返されるとき、x は最小値の位置であり、fvalにはxにおける目的関数の値が含まれます。

info は次のいずれかの値になります。

1

解点に収束しました。相対勾配誤差は で指定された値より小さくなりますTolFun。

2

最後の相対ステップ サイズはTolX未満でした。

3

関数値の最後の相対変化はTolFun未満でした。

0

反復制限を超えました (アルゴリズム反復の最大数 MaxIterまたは関数評価の最大数のいずれか) MaxFunEvals。

-1

アルゴリズムはOutputFcnによって終了しました。

-3

信頼領域の半径が極端に小さくなりました。

オプションで、収束統計 ( output )、解xでの出力勾配 ( grad ) 、解 xでの近似ヘッセ行列 ( hessfminunc )を含む構造体を返すことができます。

アプリケーションノート:

目的関数が 1 つの変数の単一の非線形方程式である場合は、fminbnd通常、 を使用する方が適切な選択です。
で使用されるアルゴリズムはfminunc、目的関数が微分可能であることに依存する勾配探索です。関数に不連続性がある場合は、 などの導関数を使用しないアルゴリズムを使用する方がよい場合があります fminsearch。
匿名関数を使用して、 fcnに追加のパラメータを渡します。fminuncおよびその他の最小化関数でこれを行う具体的な例については、GNU Octave マニュアルの 「Minimizers」セクションを参照してください。

: x = fminsearch (fcn, x0)

: x = fminsearch (fcn, x0, options)

: x = fminsearch (problem)

: [x, fval, exitflag, output] = fminsearch (…)

多変数関数 fcnを最小化するxの値を見つけます。

fcn は、関数ハンドル、インライン関数、または評価する関数の名前を含む文字列です。

検索は点x0から始まり、Nelder & Mead Simplex アルゴリズム (導関数を使用しない方法) を使用して反復されます。このアルゴリズムは、不連続性がある関数や、 などの勾配ベースの検索がfminunc失敗する関数に適しています。

検索のオプションは、関数 を使用したパラメータ オプションで提供されます。 現在、 はoptimset、、、、、、、のオプションをfminsearch受け入れ ます。"Display""FunValCheck""MaxFunEvals""MaxIter""OutputFcn""TolFun""TolX"

"MaxFunEvals"最適化を停止するまでの関数評価の最大回数を指定します。デフォルト値は 200 * number_of_variables、つまり です。値は正の整数でなければなりません。 200 * length (x0)

"MaxIter"最適化が停止するまでのアルゴリズムの最大反復回数を指定します。デフォルト値は 200 * number_of_variables、つまり です。値は正の整数でなければなりません。 200 * length (x0)

その他のオプションの説明については、 を参照してください。を使用する optimsetために、オプション構造体をデフォルト値で初期化するには、 を参照してください。 fminsearchoptions = optimset ("fminsearch")

fminsearch次のフィールドを持つ単一の構造体引数で呼び出すこともできます。

objective

目的関数

x0

最初のポイント

solver

"fminsearch"に設定する必要があります.

options

デフォルトを使用する必要があることを示すために、から返される構造体optimsetまたは空の行列.

このフィールドoptionsはオプションです。その他はすべて必須です。

終了時に、関数は最小点xと、最小値における関数値 fval を返します。

3 番目の出力exitflag は、アルゴリズムが成功したかどうかを報告し、次のいずれかの値を取る可能性があります。

1

アルゴリズムが収束した場合(単体のサイズが より小さくTolX 、反復間の関数値のステップが より小さい場合TolFun)。

0

最大反復回数または最大関数評価回数を超えた場合。

-1

反復が によって停止された場合"OutputFcn"。

4 番目の出力は、アルゴリズムの実行時間を含む構造体出力です。構造体のフィールドには、fcnfuncCount への関数呼び出し回数、 反復ステップ数、検索アルゴリズムの名前 (常に: )、および 終了メッセージが含まれます。 iterationsalgorithm"Nelder-Mead simplex direct search"message

例:

fminsearch (@(x) (x(1)-5).^2+(x(2)-8).^4, [0;0])

単一変数関数の最小値を見つける必要がある場合は、 を使用する方がよいでしょうfminbnd。
fcnにパラメータを渡すために、オプションの後に入力引数リストに追加するための、文書化されていない従来の構文は推奨されておらず、Octave 10 では完全に削除されます。fcnにパラメータを渡すための推奨されるクロスプラットフォーム互換の方法は、 匿名関数を使用することです。fminsearchおよびその他の最小化関数でこれを行う具体的な例については、 GNU Octave マニュアルの 「Minimizers」セクションを参照してください。
参照: fminbnd、fminunc、optimset。

F特定の最小化操作では、最小化される関数 に追加のパラメータを渡す必要があります。例: F = F(x, C)。Octave の最小化関数は に 1 つの最適化変数のみを渡すように設計されていますが、必要なパラメータを含む 匿名関数Fを定義することでパラメータの受け渡しを実現できます。以下の例を参照してください。

A = 2; B = 3;
f = @(x) sin (A*x + B);
fminbnd (f, 0, 2)
  ⇒   0.8562

匿名関数は、定義された時点でのパラメータの値を保持することに注意してください。関数定義後にパラメータ値を変更しても、再定義されるまで関数の出力には影響しません。

B = 4;
fminbnd (f, 0, 2)
  ⇒   0.8562
f = @(x) sin (A*x + B);
fminbnd (f, 0, 2)
  ⇒   0.3562

この関数は、humpsゼロおよび極値検出関数をテストするのに便利な関数です。

: y = humps (x)

: [x, y] = humps (x)

複数の最小値、最大値、ゼロ交差を持つ関数を評価します。

出力yは有理関数の評価です。

       1200*x^4 - 2880*x^3 + 2036*x^2 - 348*x - 88
y = - ---------------------------------------------
        200*x^4 - 480*x^3 + 406*x^2 - 138*x + 17

x はスカラー、ベクトル、または配列です。x が省略された場合は、デフォルトの範囲 [0:0.05:1] が使用されます。

2 つの出力引数 [ x , y ] を指定して呼び出されると、x には入力値が含まれ、yにはからの出力が含まれます humps。

プログラミング ノート: xhumps = 0.300 と 0.893付近に 2 つの極大値、 x = 0.637付近に極小値、 x = -0.132 と 1.300 付近にゼロがあります。 ゼロまたは極小値と極大値を見つけるアルゴリズムをテストするのに便利な関数です。 humps

demo humps関数のプロットを確認してみてくださいhumps。

See also: fzero, fminbnd, fminunc, fminsearch.