Main Content

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 は構造体です。

[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.

この関数は点 x = [1,1] で最小になり、最小値は 0 です。

開始点を 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.

この関数は点 x = [1,1] で最小になり、最小値は 0 です。

開始点を 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)

Figure Optimization Plot Function contains an axes object. The axes object with title Current Function Value: 8.17766e-10, xlabel Iteration, ylabel Function value contains an object of type scatter.

x = 1×2

    1.0000    1.0000

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

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

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

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

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         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 で評価される目的関数) を返す関数です。

fminsearchxx0 引数の形状で目的関数に渡します。たとえば、x0 が 5 行 3 列の配列の場合、fminsearchx を 5 行 3 列の配列として fun に渡します。

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 の要素数およびサイズを使用して、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 などによって返されるオプション構造体

データ型: 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 は、Lagarias et al. のシンプレックス探索法[1]を使用します。これは fminunc (Optimization Toolbox) とは異なり、数値勾配または解析勾配を使用しない直接探索法です。このアルゴリズムは、fminsearch アルゴリズムで詳しく説明されています。このアルゴリズムでは、確実に局所的最小値に収束するとは限りません。

代替機能

アプリ

[最適化] ライブ エディター タスクは、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 より前に導入