ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

fminunc

制約なし多変数関数の最小値を求める

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

ここで、f(x) はスカラーを返す関数です。

x はベクトルまたは行列です。「行列引数」を参照してください。

構文

x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(problem)
[x,fval] = fminunc(...)
[x,fval,exitflag] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad] = fminunc(...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)

説明

fminunc は複数変数のスカラー関数の最小値を初期推定値を使って探索します。通常、これを制約なし非線形最適化と呼びます。

x = fminunc(fun,x0) は、点 x0 を開始値として fun に記述する関数の局所的最小値 x を求めます。x0 はスカラー、ベクトル、行列のいずれかです。

x = fminunc(fun,x0,options) は、options で指定された最適化オプションを使って最小化します。optimoptions を使用してこれらのオプションを設定してください。

x = fminunc(problem) は、problem の最小値を求めます。ここで、problem は「入力引数」に説明されている構造体です。

作業のエクスポート」で説明されているように、最適化アプリケーションから問題をエクスポートして problem 構造体を作成します。

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

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

[x,fval,exitflag,output] = fminunc(...) は最適化の情報を含む構造体 output を返します。

[x,fval,exitflag,output,grad] = fminunc(...) は、解 x における、fun の勾配を grad に返します。

[x,fval,exitflag,output,grad,hessian] = fminunc(...) は、解 x における、目的関数 fun のヘッセ行列の値を hessian に返します。ヘッセ行列を参照してください。

入力引数

fminunc に渡す引数の一般的な説明は 関数の引数 にあります。この節では、funoptionsproblem の各関数に固有な詳細を示します。

fun

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

x = fminunc(@myfun,x0)

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

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

fun は無名関数の関数ハンドルにもなります。

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

またfun の勾配を計算することもでき、さらに次のように GradObj オプションが 'on' である場合、

options = optimoptions(@fminunc,'GradObj','on')

関数 fun は 2 番目の出力引数に x での勾配値ベクトル g を返さなければなりません。勾配は点 x での f の偏導関数 ∂f/∂xi です。gi 番目の要素は xi 番目の f の偏導関数値になります。

ヘッセ行列も計算でき、かつ Hessian オプションが 'on' である場合、すなわち options = optimoptions(@fminunc,'GradObj','on','Hessian','on') である場合、関数 fun は 3 番目の出力引数に x での対称行列であるヘッセ行列値 H を返さなければなりません。ヘッセ行列は点 x での f の 2 番目の偏導関数行列です。すなわち、H の (i,j) 番目の要素は xi および xj における f の 2 次偏導関数で ∂2f/∂xi∂xj と表されます。ヘッセ行列は、定義により対称行列です。

スカラー目的関数の記述 は勾配とヘッセ行列を受け付けないソルバーの使用に合わせて、それらを条件付ける方法を説明します。追加パラメーターの受け渡し は必要に応じて fun をパラメタライズする方法を説明します。

 
 
 

options

オプションoptions の値の関数固有の詳細を示します。

 
problem

objective

目的関数 

x0

x の初期点 

solver

'fminunc' 

options

optimoptions で作成されたオプション 

出力引数

fminunc が返す引数の一般的な説明は 関数の引数 にあります。この節では、exitflagoutput の各関数に固有な詳細を示します。

exitflag

アルゴリズムが停止した理由を示す整数。以下の表は exitflag の値とそれに対応したアルゴリズムが終了した理由を示します。

1

TolFun 許容誤差より小さい勾配の大きさです。

2

x の変位が TolX 許容誤差より小さくなったことを示します。

3

目的関数値の変化が TolFun 許容誤差より小さくなったことを示します。

5

目的関数値の予測減少が TolFun 許容誤差より小さかったことを示します。

0

反復回数が MaxIter を超えた、または関数評価の回数が MaxFunEvals を超えたことを示します。

-1

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

-3

現在の反復の目的関数が ObjectiveLimit 以下であることを示します。

grad

x での勾配です。

 

hessian

x でのヘッセ行列です。

 

output

最適化に関する情報を含む構造体。構造体のフィールドは以下のようになります。

iterations

実行した反復回数

funcCount

関数評価の回数

firstorderopt

1 次の最適性の尺度

algorithm

使用される最適化アルゴリズム

cgiterations

PCG 法の合計反復回数 (信頼領域法アルゴリズムのみ)

stepsize

x 最終ステップ サイズ (中規模アルゴリズムのみ)

message

終了メッセージ

ヘッセ行列

fminunc は次のように出力引数 hessian を計算します。

  • 中規模アルゴリズムを使用する場合、関数は以下を使用して x でのヘッセ行列に対する有限差分近似を計算します。

    • 勾配 grad を与える場合は

    • 勾配を与えない場合は目的関数 fun

  • 信頼領域法アルゴリズムを使用する場合、関数では以下が使用されます。

    • options.Hessian(x でのヘッセ行列を計算するために与える場合)

    • x でのヘッセ行列に対する有限差分近似 (勾配のみを与える場合)

オプション

fminunc は最適化オプションを使用します。一部のオプションはすべてのアルゴリズムで使用されますが、trust-region アルゴリズムを使用する場合や quasi-newton アルゴリズムを使用する場合のみに適用されるオプションもあります。options を設定または変更するには optimoptions を使用します。詳細は 最適化オプション リファレンス を参照してください。

すべてのアルゴリズム

すべての fminunc アルゴリズムは以下のオプションを使用します。

Algorithm

optimset を使用する場合 (推奨しません) は、 Algorithm の代わりに LargeScale を使用します。

fminunc アルゴリズムを選択します。選択肢は、'quasi-newton''trust-region' (既定) です。

trust-region アルゴリズムでは勾配を与えなければなりません (上記 fun の説明を参照)。勾配を与えないと、fminunc では 'quasi-newton' アルゴリズムが使用されます。アルゴリズムの選択についての詳細は、「アルゴリズムの選択」を参照してください。

DerivativeCheck

ユーザー設定の導関数 (目的関数の勾配) を有限差分導関数と比較します。選択肢は 'on' または 'off' (既定の設定) です。

Diagnostics

最小化または計算する関数に関する情報を表示します。選択肢は 'on' または 'off' (既定の設定) です。

DiffMaxChange

有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は Inf です。

DiffMinChange

有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は 0 です。

Display

表示レベル:

  • 'off' または 'none' は出力を表示しません。

  • 'iter' は各反復の出力を表示し、既定の終了メッセージを与えます。

  • 'iter-detailed' は各反復の出力を表示し、技術的な終了メッセージを与えます。

  • 'notify' は、関数が収束しない場合にのみ出力を表示し、既定の終了メッセージを与えます。

  • 'notify-detailed' は、関数が収束しない場合にのみ出力を表示し、技術的な終了メッセージを与えます。

  • 'final' (既定の設定) は最終出力を表示し、既定の終了メッセージを返します。

  • 'final-detailed' は最終出力を表示し、技術的な終了メッセージを返します。

FinDiffRelStep

スカラーまたはベクトルのステップ サイズ ファクター。FinDiffRelStep をベクトル v に設定すると、前方有限差分 delta は次のとおりです。

delta = v.*sign(x).*max(abs(x),TypicalX);

中央有限差分は次のとおりです。

delta = v.*max(abs(x),TypicalX);

スカラー FinDiffRelStep はベクトルに拡張します。前方有限差分の既定値は sqrt(eps)、中央有限差分の既定値は eps^(1/3) です。

信頼領域法アルゴリズムでは、DerivativeCheck'on' の場合にのみ FinDiffRelStep が使用されます。

FinDiffType

勾配推定に使用される有限差分は 'forward' (既定の設定) または 'central' (中央) のいずれかです。'central' では 2 倍の関数評価が必要になりますが、正確性が増します。信頼領域法アルゴリズムでは、DerivativeCheck'on' の場合にのみ FinDiffType が使用されます。

FunValCheck

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

GradObj

ユーザーが定義する目的関数の勾配。fun の勾配の定義方法については、上述の fun の説明を参照してください。'on' に設定すると、fminunc は目的関数のユーザー定義の勾配を使用します。既定の 'off' の場合、fminunc は有限差分を使用して勾配を推定します。信頼領域法アルゴリズムを使用するには、勾配を与え、GradObj'on' に設定しなければなりません。準ニュートン アルゴリズムの場合、このオプションは必要ありません。

LargeScale

optimoptions を使用する場合 (推奨) は、LargeScale の代わりに Algorithm を使用します。

既定の 'on' に設定されているとき、可能な場合は大規模アルゴリズムを使用します。'off' に設定されている場合は中規模アルゴリズムを使用します。

LargeScale アルゴリズムでは勾配(上記 fun の説明を参照) を与えなければなりません。そうでなければ fminunc は中規模アルゴリズムを使用します。アルゴリズムの選択についての詳細は、「アルゴリズムの選択」を参照してください。

MaxFunEvals

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

MaxIter

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

OutputFcn

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

PlotFcns

アルゴリズムを実現しながら、進行中のさまざまな測定値をプロットします。定義済みのプロットから選択するか、自身で記述します。関数ハンドルか、関数ハンドルのセル配列を渡します。既定の設定はなし ([]) です。

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

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

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

  • @optimplotstepsize はステップ サイズをプロットします。

  • @optimplotfirstorderopt は 1 次の最適性尺度をプロットします。

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

TolFun

関数値に関する終了許容誤差 (正のスカラー)。既定値は 1e-6 です。

TolX

x に関する許容誤差 (正のスカラー)。既定値は 1e-6 です。

TypicalX

典型的な x の値です。TypicalX の要素数は、開始点 x0 の要素数と等しくなります。既定値は ones(numberofvariables,1) です。fminunc では TypicalX を使用して勾配推定の有限差分をスケーリングします。

trust-region アルゴリズムは DerivativeCheck オプションに対してのみ TypicalX を使用します。

trust-region アルゴリズムのみ

trust-region アルゴリズムでは以下のオプションを使用します。

Hessian

'on' に設定すると、fminunc は目的関数のユーザー定義のヘッセ行列を使用します。ヘッセ行列 (fun を参照) は、目的関数内で定義されるか、HessMult を使用するときに間接的に定義されます。

'off' (既定の設定) の場合、fminunc は有限差分を使用してヘッセ行列を近似します。

HessMult

ヘッセ行列乗算関数用の関数ハンドル。大規模構造問題のために、この関数は実際に H を作らずにヘッセ行列の乗数 H*Y を計算します。この関数は次の形式を取ります。

W = hmfun(Hinfo,Y)

ここで Hinfo は、H*Y を計算するために使われる行列を含んでいます。

1 番目の引数は目的関数 fun が返す 3 番目の引数と同じにしなければなりません。

[f,g,Hinfo] = fun(x)

Y は問題の次元と同じ行数をもつ行列です。H は明示的に作成されていませんが、W = H*Y です。fminuncHinfo を使用して、前提条件を計算します。hmfun が必要とする追加のパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

    メモ:   'ヘッセ行列' は、fminuncHinfofun から hmfun に渡すために 'on' に設定しなければなりません。

例については、密に構造化されたヘッセ行列と線形等式を使用した最小化 を参照してください。

 
HessPattern

有限差分に対するヘッセ行列のスパース パターン。fun でスパース ヘッセ行列 H を計算しにくい場合、H"スパース構造"、すなわち非ゼロの位置が HessPattern の値として指定されれば、fminunc の信頼領域法は (勾配の) スパース有限差分によって H を近似できます。最悪の場合、構造が不明であれば、HessPattern を密行列として設定し、非スパース状態の有限差分近似を反復ごとに計算します (これは既定の設定です)。大規模な問題では、この計算には多大なリソースが必要となる場合があり、通常はスパース構造の決定を試みるのが妥当です。

 
MaxPCGIter

PCG (前処理付き共役勾配) 法の反復の最大回数です (正のスカラー)。既定値は max(1,floor(numberOfVariables/2)) です。詳細は、アルゴリズムを参照してください。

 
PrecondBandWidth

PCG に対する前提条件の帯域幅の上限 (非負の整数)。既定の設定では、fminunc は対角型をした前提条件を使用します (帯域幅の上限 0)。一部の問題では、帯域幅を上げることで、PCG 法の反復回数を減らします。PrecondBandWidthInf に設定すると、共役勾配 (CG) ではなく、直接因数分解 (コレスキー因子) を使用します。直接因数分解は CG より計算量が増加しますが、解を求めるためのステップの質が向上します。

 
TolPCG

PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は 0.1 です。

 

quasi-newton アルゴリズムのみ

quasi-newton アルゴリズムでは以下のオプションを使用します。

HessUpdate

準ニュートン アルゴリズムで探索方向を選択するための方法。選択肢は以下になります。

  • 'bfgs' (既定の設定)

  • 'dfp'

  • 'steepdesc'

    これらの方法の説明は ヘッセ行列の更新 を参照してください。

InitialHessMatrix

初期準ニュートン行列。このオプションは InitialHessType'user-supplied' に設定する場合のみ利用できます。その場合、InitialHessMatrix を次のいずれかに設定できます。

  • 正のスカラー ― 初期行列は単位行列のスカラー倍です。

  • 正の値のベクトル ― 初期行列は対角上にベクトルの要素をもつ対角行列です。このベクトルは x0 ベクトル (初期点) と同じサイズでなければなりません。

InitialHessType

初期準ニュートン行列タイプ。以下のオプションがあります。

  • 'identity'

  • 'scaled-identity' (既定の設定)

  • 'user-supplied' — 以下を参照してください。 InitialHessMatrix

ObjectiveLimit

スカラーの許容誤差 (停止条件) です。反復の目的関数値が ObjectiveLimit 以下になった場合、問題が非有界であると推定されるため、その反復は中止されます。既定値は -1e20 です。

関数 を最小化します。

myfun.m ファイルを作成します。

function f = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    % Cost function

次に fminunc を呼び出して [1,1] の近傍で myfun の最小値を求めてください。

x0 = [1,1];
[x,fval] = fminunc(@myfun,x0);

数回の反復後、fminunc は解 x および x での関数値 fval を返します。

x,fval

x =
  1.0e-006 *
    0.2541   -0.2029

fval =
  1.3173e-013

与えられた勾配を使ってこの関数を最小化するには、myfun.m を変更して勾配が 2 番目の出力引数になるようにしてください。

function [f,g] = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2;    % Cost function
if nargout > 1
   g(1) = 6*x(1)+2*x(2);
   g(2) = 2*x(1)+2*x(2);
end

optimoptions を使用して GradObj オプションを 'on' に設定し、最適化オプションを作成することで、勾配値が利用可能であることを示します。

options = optimoptions('fminunc','GradObj','on');
x0 = [1,1];
[x,fval] = fminunc(@myfun,x0,options);

数回の反復後、fminunc は解 x および x での関数値 fval を返します。

x,fval

x =
  1.0e-015 *
    0.1110   -0.8882

fval =
  6.2862e-031

無名関数を使用して関数 f(x) = sin(x) + 3 を最小化するには次のようにします。

f = @(x)sin(x)+3;
x = fminunc(f,4)

fminunc は解を返します。

x

x =
    4.7124

メモ:

二乗和すなわち次の形式の問題を解くために fminunc を選択することは推奨できません。

の形式である問題を解く場合に推奨される選択肢ではありません。代わりに、lsqnonlin を使用してください。この関数はこの形式の問題の最適化を行う関数です。

信頼領域法を使用するには fun に勾配を与えなければなりません (さらに optimoptions を使用して GradObj オプションを 'on' に設定します)。勾配が提供されず、Algorithm オプションが 'trust-region' である場合には、警告が表示されます。

制限

最小化する関数は連続でなければなりません。そうでなければ、fminunc が局所解のみを出力する可能性があります。

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

信頼領域法の最適化

trust-region アルゴリズムを使用するには、fun に勾配を与えなければなりません (また、optionsGradObj'on' に設定しなければなりません)。

信頼領域法アルゴリズムの収束と必要条件

必要な付加的情報大規模問題に対して

f(x) の勾配を fun に与える必要があります。

  • fun にヘッセ行列のスパース性の構造体を与えるか、ヘッセ行列を計算します。

  • ヘッセ行列はスパースでなければなりません。

詳細

すべて展開する

アルゴリズム

信頼領域法アルゴリズム

fun で勾配を指定し、optimoptions を使用して GradObj'on' に設定した場合、fminunc は既定により trust-region アルゴリズムを選択します。このアルゴリズムはサブ空間の信頼領域法であり、[2][3] で説明する interior-reflective Newton 法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。「fminunc trust-region アルゴリズム」、「非線形最小化に対する信頼領域法」および「前処理付き共役勾配法」を参照してください。

準ニュートン アルゴリズム

quasi-newton アルゴリズムは 3 次ライン探索手法で BFGS 準ニュートン法を使用します。この準ニュートン法はヘッセ行列の近似を更新するために、BFGS ([1],[5],[8][9]) を使用します。HessUpdate オプションを 'dfp' に設定し、Algorithm オプションを 'quasi-newton' に設定することで、逆ヘッセ行列を近似する DFP ([4][6] および[7]) の公式を選択できます。HessUpdate'steepdesc' に、Algorithm'quasi-newton' に設定することで最急降下法を選択できますが、この方法は推奨できません。

参考文献

[1] Broyden, C.G., “The Convergence of a Class of Double-Rank Minimization Algorithms,” Journal Inst. Math. Applic., Vol. 6, pp. 76-90, 1970.

[2] Coleman, T.F. and Y. Li, “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds,” SIAM Journal on Optimization, Vol. 6, pp. 418-445, 1996.

[3] Coleman, T.F. and Y. Li, “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds,” Mathematical Programming, Vol. 67, Number 2, pp. 189-224, 1994.

[4] Davidon, W.C., “Variable Metric Method for Minimization,” A.E.C. Research and Development Report, ANL-5990, 1959.

[5] Fletcher, R., “A New Approach to Variable Metric Algorithms,” Computer Journal, Vol. 13, pp. 317-322, 1970.

[6] Fletcher, R., “Practical Methods of Optimization,” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.

[7] Fletcher, R. and M.J.D. Powell, “A Rapidly Convergent Descent Method for Minimization,” Computer Journal, Vol. 6, pp. 163-168, 1963.

[8] Goldfarb, D., “A Family of Variable Metric Updates Derived by Variational Means,” Mathematics of Computing, Vol. 24, pp. 23-26, 1970.

[9] Shanno, D.F., “Conditioning of Quasi-Newton Methods for Function Minimization,” Mathematics of Computing, Vol. 24, pp. 647-656, 1970.

参考

| |

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