ドキュメンテーション

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

fminsearch

導関数を使用せず制約なし多変数関数の最小値を求める

説明

非線形計画法ソルバーです。以下で指定された問題の最小値を求めます。

minxf(x)

f(x) はスカラーを返す関数、x はベクトルまたは行列です。行列引数を参照してください。

x = fminsearch(fun,x0) は、点 x0 を開始点として、fun に記述されている関数の局所的最小値 x を求めようとします。

x = fminsearch(fun,x0,options) は、options 構造体に指定する最適化オプションを使って最小化します。optimset を使用してこれらのオプションを設定してください。

x = fminsearch(problem) は、problem の最小値を求めます。problem は構造体です。作業のエクスポートで説明されているように、最適化アプリから問題をエクスポートして problem を作成します。

[x,fval] = fminsearch(___) は、前記のすべての入力構文に対して、解 x で目的関数 fun の値を fval に返します。

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

[x,fval,exitflag,output] = fminsearch(___) は最適化プロセスの情報を含む構造体 output も返します。

すべて折りたたむ

多くのアルゴリズムに対し、難しいことで知られる最適化の問題 Rosenbrock 関数を最小化します。

f(x)=100(x2-x12)2+(1-x1)2

関数は、最小値 0 での点 x = [1,1] で最小化されます。

開始点を x0 = [-1.2,1] に設定し、fminsearch を使用して Rosenbrock の関数を最小化します。

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
x = 1×2

    1.0000    1.0000

fminsearch が最小値を特定するプロセスを監視するオプションを設定します。

各反復で目的関数をプロットするオプションを設定します。

options = optimset('PlotFcns',@optimplotfval);

目的関数を Rosenbrock 関数に設定します。

f(x)=100(x2-x12)2+(1-x1)2

関数は、最小値 0 での点 x = [1,1] で最小化されます。

開始点を x0 = [-1.2,1] に設定し、fminsearch を使用して Rosenbrock の関数を最小化します。

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

x = 1×2

    1.0000    1.0000

ファイルを実行することにより与えられる値をもつ目的関数を最小化します。関数ファイルは実数ベクトル x を受け入れて、目的関数の値である実数スカラーを返さなければなりません。

次のコードをコピーし、MATLAB® パス上にある objectivefcn1.m という名前のファイルとして含めます。

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

x0 = [0.25,-0.25]objectivefcn の最小値の検索を開始します。

x0 = [0.25,-0.25];
x = fminsearch(@objectivefcn1,x0)
x =

   -0.1696   -0.5086

目的関数が追加パラメーターをもつ場合があります。これらのパラメーターは最適化するための変数ではなく、最適化中は固定値になります。たとえば、Rosenbrock タイプ関数にパラメーター a があるとします。

f(x,a)=100(x2-x12)2+(a-x1)2

この関数は、x1=ax2=a2 で最小値 0 をもちます。たとえば、a=3 の場合、無名関数を作成することによりパラメーターを目的関数に含めることができます。

追加パラメーターを追加引数として使用し、目的関数を作成します。

f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;

MATLAB® ワークスペースにパラメーターを配置します。

a = 3;

パラメーターのワークスペース値が含まれる x の無名関数のみを作成します。

fun = @(x)f(x,a);

x0 = [-1,1.9] から始めて問題を解きます。

x0 = [-1,1.9];
x = fminsearch(fun,x0)
x = 1×2

    3.0000    9.0000

追加パラメーターを目的関数で使用する方法の詳細については、関数のパラメーター化 (MATLAB) を参照してください。

fminsearch を使用して目的関数の最小の位置と値の両方を求めます。

3 変数問題の無名目的関数を記述します。

x0 = [1,2,3];
fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));

x0 から始めて fun の最小値を求めます。最小値も求めます。

[x,fval] = fminsearch(fun,x0)
x = 1×3

    1.5359    2.5645    3.5932

fval = -5.9565e+04

実行中および完了後の両方で最適化の結果を検証します。

ソルバーが実行されると最適化に情報を与える反復表示を提供するように、オプションを設定します。また、ソルバーが実行されると目的関数値を表示するようにプロット関数を設定します。

options = optimset('Display','iter','PlotFcns',@optimplotfval);

目的関数と開始点を設定します。

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

objectivefcn1 のコードを MATLAB® パス上のファイルとして含めます。

x0 = [0.25,-0.25];
fun = @objectivefcn1;

すべてのソルバー出力を取得します。これらの出力を使用して、ソルバー完了後に結果を検証します。

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count     min f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 


x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

exitflag の値は 1 です。つまり fminsearch は局所的最小値に収束した可能性が高いことを示します。

output 構造体は反復回数を示します。反復表示およびプロットはこの情報も示します。output 構造体は、反復表示が示す関数評価数も表示しますが、選択したプロット関数では表示されません。

入力引数

すべて折りたたむ

最小化する関数。関数ハンドルまたは関数名として指定されます。fun は、ベクトルまたは配列 x を受け、実数スカラー f (x で評価される目的関数) を返す関数です。

fun をファイルの関数ハンドルとして指定します。

x = fminsearch(@myfun,x0)

ここで myfun は次のような MATLAB® 関数です。

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

fun は、無名関数の関数ハンドルとして指定することもできます。

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

例: fun = @(x)-x*exp(-3*x)

データ型: char | function_handle | string

初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0 の要素数および x0 のサイズを使用して、fun が受け入れる変数の数およびサイズを決定します。

例: x0 = [1,2,3,4]

データ型: double

最適化オプション。optimset などによって返される構造体として指定されます。オプション構造体のこれらのフィールドの値を設定または変更するために、optimset を使用できます。詳細は、最適化オプション リファレンスを参照してください。

Display

表示レベル (反復表示を参照):

  • 'notify' (既定の設定) — 関数が収束しない場合にのみ出力を表示する。

  • 'final' — 最終出力のみを表示する。

  • 'off' または 'none' — 出力を表示しない。

  • 'iter' — 各反復の出力を表示する。

FunValCheck

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

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。既定値は 200*numberOfVariables です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

MaxIter

可能な反復の最大数 (正の整数)。既定値は 200*numberOfVariables です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

OutputFcn

各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します (関数ハンドルか関数ハンドルの cell 配列として)。既定の設定はなし ([]) です。詳細は、出力関数の構文を参照してください。

PlotFcns

アルゴリズム実行時における、進行状態の各種測定値のプロット。定義済みのプロットから選択するか、自身で記述します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ([]) です。

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

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

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

カスタム プロット関数の記述については、プロット関数の構文を参照してください。

TolFun

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

TolX

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

例: options = optimset('Display','iter')

データ型: struct

次のフィールドをもつ構造体として指定される問題構造体です。

フィールド名エントリ

objective

目的関数

x0

x の初期点

solver

'fminsearch'

options

optimset などによって返されるオプション構造体

problem 構造体を取得する最も簡単な方法は、最適化アプリから問題をエクスポートすることです。

データ型: struct

出力引数

すべて折りたたむ

実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質に関する詳細は、ソルバーが成功する場合 を参照してください。

解での目的関数値。実数として返されます。一般的に、fval = fun(x) になります。

fminsearch の停止理由。整数として返されます。

1

関数が解 x に収束したことを示します。

0

反復回数が options.MaxIter を超過、または関数評価の回数が options.MaxFunEvals を超過しています。

-1

アルゴリズムが出力関数により停止したことを示します。

最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。

iterations

反復回数

funcCount

関数評価の回数

algorithm

'Nelder-Mead simplex direct search'

message

終了メッセージ

ヒント

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

  • fminsearch を使用して微分不可能な問題を解いたり、不連続点を扱ったりすることもできます。特に解析の傍で不連続点が生じない場合です。

  • fminsearch は一般的に、特に 2 次を超える次元の問題に対して効率が fminunc より劣ります。しかし問題が不連続の場合、fminsearchfminunc よりロバストになります。

  • fminsearch は、二乗和すなわち次の形式の問題の推奨ソルバーではありません。

    minxf(x)22=minx(f1(x)2+f2(x)2+...+fn(x)2)

    代わりに、lsqnonlin を使用してください。この関数はこの形式の問題の最適化を行う関数です。

アルゴリズム

fminsearch は、Lagarias らのシンプレックス探索法 [1] を使用します。これは fminunc のように数値勾配または解析勾配を使用しない直接探索法です。このアルゴリズムは、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, 1998, pp. 112–147.

拡張機能

R2006a より前に導入