ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

fminsearch

導関数を使用しない方法で制約なし多変数関数の最小値を見つける

以下で指定される問題の最小値を見つけます。

minxf(x)

ここで、f(x) はスカラーを返す関数、x はベクトルまたは行列です。

構文

x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(problem)
[x,fval] = fminsearch(...)
[x,fval,exitflag] = fminsearch(...)
[x,fval,exitflag,output] = fminsearch(...)

説明

関数 fminsearch は、初期推定を基に、多変数スカラー関数の最小を求めます。通常、これを "制約なし非線形最適化" と呼びます。

x = fminsearch(fun,x0) は、点 x0 から開始して、fun に記述される関数の局所最小値である値 x を返します。x0 は、スカラー、ベクトルまたは行列にすることができます。fun は関数ハンドルです。「関数ハンドル」を参照してください。

『MATLAB® 数学』ドキュメンテーションの「関数のパラメーター化」では、目的関数 fun に追加のパラメーターを渡す方法を説明しています。後述の例 2および例 3も参照してください。

x = fminsearch(fun,x0,options) は、options 構造体に指定された最適化パラメーターを使用して最小化します。これらのパラメーターは、関数 optimset を使用して定義することができます。関数 fminsearch は、次に示す options 構造体のフィールドを使用します。

Display

表示のレベル。'off' は出力を表示しません。'iter' は反復ごとに出力を表示します。'final' は最終出力のみを表示します。'notify' (既定の設定) は関数が収束しなかったときのみ出力を表示します。詳細は、『MATLAB 数学』ドキュメンテーションの「反復表示」を参照してください。

FunValCheck

目的関数値が有効かどうかをチェックします。'on' は、目的関数が complex または NaN である値を返すとエラーを表示します。'off' (既定の設定) はエラーを出力しません。

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。既定値は 200*numberOfVariables です。

MaxIter

可能な反復の最大数 (正の整数)。既定値は 200*numberOfVariables です。

OutputFcn

各反復で最適化関数が呼び出すユーザー定義の関数を 1 つか複数指定します (関数ハンドルか関数ハンドルのセル配列として)。既定の設定はなし ([]) です。詳細は、『MATLAB 数学』ドキュメンテーションの「出力関数」を参照してください。

PlotFcns

アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。関数ハンドルか、関数ハンドルのセル配列を渡します。既定の設定はなし ([]) です。

  • @optimplotx は現在の点をプロットします。

  • @optimplotfval は関数値をプロットします。

  • @optimplotfunccount は関数計算をプロットします。

詳細は、『MATLAB 数学』ドキュメンテーションの「プロット関数」を参照してください。

TolFun

関数値の終了許容誤差 (正のスカラー)。既定値は 1e-4 です。「許容誤差と停止条件」を参照してください。他のソルバーとは異なり、fminsearchTolFunTolX"両方" を満たすと停止します。

TolX

x に関する許容誤差 (正のスカラー)。既定値は 1e-4 です。「許容誤差と停止条件」を参照してください。他のソルバーとは異なり、fminsearchTolFunTolX"両方" を満たすと停止します。

x = fminsearch(problem)problem の最小値を検出します。problem は次のフィールドをもつ構造体です。

objective

目的関数

x0

x の初期点

solver

'fminsearch'

options

optimset を使用して作成される options 構造体

[x,fval] = fminsearch(...) は、解 x での目的関数 fun の値を fval に返します。

[x,fval,exitflag] = fminsearch(...) は、関数 fminsearch の終了条件を記述する値 exitflag を返します。

1

関数 fminsearch が解 x に収束した

0

関数評価または反復の最大回数に到達した

-1

アルゴリズムが出力関数により停止した

[x,fval,exitflag,output] = fminsearch(...) は、以下のフィールドに最適化に関する情報を含む構造体 output を返します。

algorithm

'Nelder-Mead simplex direct search'

funcCount

関数評価の回数

iterations

反復回数

message

終了メッセージ

引数

関数 fun は、最小化される関数です。この関数は、入力 x を受け入れ、x で計算される目的関数であるスカラー f を返します。関数 fun は関数ファイルの関数ハンドルとして指定することができます。

x = fminsearch(@myfun, x0)

ここで、myfun は次のような関数ファイルです。

function f = myfun(x)
f = ...            % Compute function value at x

また、次のような「無名関数」の関数ハンドルとして指定することもできます。

x = fminsearch(@(x)sin(x^2), x0);

他の引数は、上記の構文で記述されます。

例 1

多次元最小化の古典的なテスト例は、Rosenbrock の banana 関数です。

f(x)=100(x2x12)2+(1x1)2.

最小値は (1,1) で値 0 をもちます。従来の初期点は (-1.2,1) です。以下に示す無名関数は関数を定義し、banana という名前の関数ハンドルを返します。

banana = @(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;

関数 fminsearch に関数ハンドルを渡します。

[x,fval] = fminsearch(banana,[-1.2, 1])

これは以下を出力します。

x =

    1.0000    1.0000

fval =

    8.1777e-010

この結果は、ゼロの近傍の値により、少なくとも小数点以下 4 桁の精度まで関数が最小になる値が求められたことを示します。

例 2

関数 fun がパラメーター化されている場合、問題に依存するパラメーターを得るために無名関数を使用できます。たとえば、次の関数ファイルにより定義される目的関数 myfun を最小化したいとします。

function f = myfun(x,a)
f = x(1)^2 + a*x(2)^2;

myfun は、特別なパラメーター a を使用するため、これを直接関数 fminsearch に渡すことはできません。a = 1.5 のように a の特定の値に対して最適化するには以下のようにします。

  1. a に値を割り当てます。

    a = 1.5; % define parameter first
  2. 単一引数の無名関数で関数 fminsearch を呼び出し、この無名関数によって a の値を取り出し、2 つの引数をもつ myfun を呼び出します。

    x = fminsearch(@(x) myfun(x,a),[0,1])

例 3

パラメーター a を banana 関数の第 2 項に追加することで、例 1 を修正することができます。

f(x)=100(x2x12)2+(ax1)2.

これにより最小値の位置が点 [a,a^2] に変化します。a の特定の値 (たとえば a = sqrt(2)) に対してこの関数を最小化するには、a の値をとる 1 入力の無名関数を作成します。

a = sqrt(2);
banana = @(x)100*(x(2)-x(1)^2)^2+(a-x(1))^2;

ステートメント

[x,fval] = fminsearch(banana, [-1.2, 1], ...
   optimset('TolX',1e-8));

は、既定の設定の x より精度が良い最小値 [sqrt(2), 2] を求めます。

制限

関数 fminsearch は、解の近傍で生じた場合でなければ、不連続を取り扱える場合がしばしばあります。fminsearch は、局所的な解のみを与えることがあります。

関数 fminsearch は実数上でのみ最小化します。すなわち、x は実数のみで構成され、f(x) は実数のみを返さなければなりません。x に複素数変数があるときには、これらを実数部と虚数部に分ける必要があります。

詳細

すべて折りたたむ

アルゴリズム

fminsearch は、Lagarias 等のシンプレックス探索法 [1] を使用します。この方法は、数値勾配や解析的勾配を使わない直接検索法です。

nx の長さである場合、n 次元空間のシンプレックスは、その頂点の n+1 個の別のベクトルにより特徴付けられています。2 次元において、シンプレックスは三角形になります。3 次元では、ピラミッド型です。検索の各ステップにおいて現在のシンプレックスあるいはその近傍において新しい点を生成します。新しい点での関数値をシンプレックスの頂点での関数値と比較して、通常は頂点の 1 つを新しい点と置き換えて新しいシンプレックスを作成します。このステップをシンプレックスの直径が指定した許容誤差内になるまで繰り返します。

詳細は、「fminsearch アルゴリズム」を参照してください。

参照

[1] Lagarias, J. C., J. A. Reeds, M. H. Wright, and P. E. Wright, “Convergence Properties of the Nelder-Mead Simplex Method in Low Dimensions,” SIAM Journal of Optimization, Vol. 9 Number 1, pp. 112-147, 1998.

R2006a より前に導入

この情報は役に立ちましたか?