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

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

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

fmincon

制約付き非線形多変数関数の最小値を求める

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

b および beq はベクトル、A および Aeq は行列、c(x) および ceq(x) はベクトルを返す関数、f(x) はスカラーを返す関数です。f(x)、c(x)、ceq(x) を非線形関数にすることもできます。

x、lb および ub はベクトルまたは行列として渡すことができます。「行列引数」を参照してください。

構文

x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fmincon(problem)
[x,fval] = fmincon(...)
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
[x,fval,exitflag,output,lambda] = fmincon(...)
[x,fval,exitflag,output,lambda,grad] = fmincon(...)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(...)

説明

fmincon は複数変数のスカラー関数の制約付き最小を初期推定を使って探索します。これは通常、"制約付き非線形最適化" または "非線形計画法" と呼ばれます。

x = fmincon(fun,x0,A,b) は、x0 から始まり、線形不等式 A*x ≤ b を制約として、fun に記述されている fun で与えられた関数の値を最小にする x を求めようとします。x0 はスカラー、ベクトル、行列のいずれかです。

x = fmincon(fun,x0,A,b,Aeq,beq) は、線形等式 Aeq*x = beqA*x ≤ b を制約として、fun を最小化します。不等式が存在しない場合は A = [] および b = [] と設定してください。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) は、解が常に lb  x  ub の範囲に存在するように、設計変数 x に上限と下限を定義します。等式が存在しない場合には Aeq = []beq = [] を設定してください。x(i) の下に非有界の場合は lb(i) = -Inf を設定してください。x(i) の上に非有界の場合は ub(i) = Inf を設定してください。

    メモ:   問題の指定された入力範囲に矛盾がない場合、出力 xx0、出力 fval[] です。

    範囲 lb ≤ x ≤ ub に違反する x0 の要素は範囲で定義されたボックスの内部にリセットされます。範囲内の要素は変更されません。

    反復は制約に違反する可能性あり」を参照してください。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) は、nonlcon で定義された非線形不等式 c(x) または等式 ceq(x) を制約として最小化を行います。fmincon は、c(x) ≤ 0 および ceq(x) = 0. のもとで最適化を行います。範囲が存在しない場合は、lb = []ub = [] を設定します。

x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) は、options で指定された最適化オプションを使って最小化します。optimoptions を使用してこれらのオプションを設定してください。非線形不等式制約または非線形等式制約がない場合は nonlcon = [] を設定します。

x = fmincon(problem) は、problem の最小値を求めます。ここで、problem は「入力引数」に説明されている構造体です。「作業のエクスポート」で説明されているように、最適化アプリケーションから問題をエクスポートして problem 構造体を作成します。

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

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

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

[x,fval,exitflag,output,lambda] = fmincon(...) は、解 x. におけるラグランジュ乗数をフィールドに含む、構造体 lambda を返します。

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

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

入力引数

関数の引数fmincon に渡される引数の説明を含みます。オプションoptions 値の関数固有の詳細を説明します。この節では、funnonlconproblem の各関数に固有な詳細を示します。

fun

最小化される関数です。fun はベクトル x を使って x で計算した目的関数のスカラー f を返します。fun は関数ファイルの関数ハンドルとして指定されます。

x = fmincon(@myfun,x0,A,b)

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

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

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

x = fmincon(@(x)norm(x)^2,x0,A,b);

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

options = optimoptions('fmincon','GradObj','on')

fun は 2 番目の出力引数に勾配ベクトル g(x) を出力しなければなりません。

ヘッセ行列も計算でき、かつ Hessian オプションが options = optimoptions('fmincon','Hessian','user-supplied') によって 'on' となっており、かつ Algorithm オプションが trust-region-reflective である場合、fun は、対称行列であるヘッセ行列値 H(x) を 3 番目の出力引数に返さなければなりません。fun はスパース ヘッセ行列を返すことができます。詳細は、目的関数の記述 を参照してください。

ヘッセ行列が計算でき、Algorithm オプションが interior-point である場合、ヘッセ行列に fmincon を渡すいくつかの方法があります。詳細は、ヘッセ行列を参照してください。

A, b, Aeq, beq

線形制約行列 AAeq とそれらの対応したベクトル bbeq はスパースであるか、密である可能性があります。trust-region-reflectiveinterior-point アルゴリズムはスパース線形代数を使用します。AAeq が大きく、比較的非零の項目が少ない場合は、スパース行列を使用して、trust-region-reflectiveinterior-point アルゴリズム内の実行時間とメモリを節約します。

nonlcon

非線形不等式制約 c(x)≤ 0 と非線形等式制約 ceq(x) = 0 を計算する関数です。nonlcon はベクトル x を受け入れ、2 つのベクトル cceq を返します。cx で計算される非線形不等式を含むベクトルで、ceqx で計算される非線形等式を含むベクトルです。nonlcon はファイルへの関数ハンドルまたは無名関数 (たとえば mycon) への関数ハンドルとして指定する必要があります。

x = fmincon(@myfun,x0,A,b,Aeq,beq,lb,ub,@mycon)

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

function [c,ceq] = mycon(x)
c = ...     % Compute nonlinear inequalities at x.
ceq = ...   % Compute nonlinear equalities at x.

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

options = optimoptions('fmincon','GradConstr','on')

nonlcon は 3 番目および 4 番目の出力引数に c(x) の勾配 GC および ceq(x) の勾配 GCeq を返さなければなりません。GCGCeq はスパースか密である可能性があります。GCGCeq が大きく、比較的非零の項目が少ない場合は、それらをスパース行列として使用して、interior-point アルゴリズム内の実行時間とメモリを節約します。詳細は、非線形制約を参照してください。

    メモ:   Optimization Toolbox™ の関数がタイプ double の入力のみを受け入れるため、ユーザーが指定した目的関数と非線形制約関数はタイプ double の出力を返さなければなりません。

 
 
 
 
 
 
problem

objective

目的関数 

x0

x の初期点 

Aineq

線形不等式制約の行列 

bineq

線形不等式制約のベクトル 

Aeq

線形等式制約の行列 

beq

線形等式制約のベクトル 
lb下限のベクトル 
ub上限のベクトル 

nonlcon

非線形制約関数 

solver

'fmincon' 

options

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

出力引数

関数の引数fmincon を返す引数を説明します。この節では、exitflaglambdaoutput の各関数に固有な詳細を示します。

exitflag

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

すべてのアルゴリズム:

1

1 次の最適性の尺度が options.TolFun より小さく、最大制約違反が options.TolCon より小さいことを示します。

0

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

-1

出力関数またはプロット関数によって停止したことを示します。

-2

実行可能な点が見つかりません。

trust-region-reflectiveinterior-point および sqp アルゴリズム:

2

x 内の変更が options.TolX より小さく、最大制約違反が options.TolCon より小さいことを示します。

trust-region-reflective アルゴリズムのみ:

3

目的関数の値の変更が options.TolFun より小さく、最大制約違反が options.TolCon より小さいことを示します。

active-set アルゴリズムのみ:

4

探索方向の大きさが 2*options.TolX より小さく、最大制約違反が options.TolCon より小さいことを示します。

5

方向微分の大きさが 2*options.TolFun より小さく、制約違反が options.TolCon より小さいことを示します。

interior-pointsqp アルゴリズム:

-3

現在の反復の目的関数が options.ObjectiveLimit より小さく、最大制約違反が options.TolCon より小さいことを示します。

grad

x での勾配です。

 

hessian

x でのヘッセ行列です。

 

lambda

x でのラグランジュ乗数を含む構造体 (制約タイプにより分類) です。構造体のフィールドは、次のとおりです。

lower

下限 lb

upper

上限 ub

ineqlin

線形不等式

eqlin

線形等式

ineqnonlin

非線形不等式

eqnonlin

非線形等式

output

最適化に関する情報を含む構造体。構造体のフィールドは、次のとおりです。

iterations

実行した反復回数

funcCount

関数評価の回数

lssteplength

探索方向のライン探索ステップ サイズ (active-setアルゴリズムのみ)

constrviolation

制約関数の最大値

stepsize

x の最終ステップ サイズ (active-setinterior-point アルゴリズム)

algorithm

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

cgiterations

PCG 法での合計反復回数 (trust-region-reflectiveinterior-point アルゴリズム)

firstorderopt

1 次の最適性の尺度

message

終了メッセージ

ヘッセ行列

fmincon はオプションの入力としてヘッセ行列を使用します。このヘッセ行列は、次のようなラグランジュ行列の 2 次導関数です (「式 3-1」を参照)。

(10-1)

各種の fmincon アルゴリズムによって、入力ヘッセ行列の処理方法は異なります。

  • active-set アルゴリズムと sqp アルゴリズムはユーザー定義のヘッセ行列を受け入れません。これらのアルゴリズムは、ラグランジュ行列のヘッセ行列に対して準ニュートン近似を計算します。

  • trust-region-reflective アルゴリズムはユーザー指定のヘッセ行列を目的関数の最終出力として受け入れます。このアルゴリズムは範囲制約と線形制約をもつため、ラグランジュ行列のヘッセ行列は目的関数のヘッセ行列と同じです。ヘッセ行列を fmincon に渡す方法の詳細はスカラー目的関数の記述を参照してください。以下のようにヘッセ行列を渡します。

    options = optimoptions('fmincon','Algorithm','trust-region-reflective','Hessian','user-supplied');

    ヘッセ行列を渡さない場合、このアルゴリズムは有限差分近似を計算します。

  • interior-point アルゴリズムは、ユーザー定義のヘッセ行列を別々に定義された関数として受け入れます。すなわち、この行列は目的関数では計算されません。その構文は次のとおりです。

    hessian = hessianfcn(x, lambda)

    hessianは、n 行 n 列の行列でなければなりません。ここで、n は変数の数です。hessian が大きく、比較的非零の項目が少ない場合は、hessian をスパース行列として使用することにより、実行時間とメモリを節約します。lambda は、非線形制約に関連するラグランジュ乗数ベクトルをもつ構造体です。

    lambda.ineqnonlin
    lambda.eqnonlin

    fmincon は構造体 lambda を計算します。hessianfcn式 10-1の合計を計算しなければなりません。以下のようにヘッセ行列を渡します。

    options = optimoptions('fmincon','Algorithm','interior-point',...
        'Hessian','user-supplied','HessFcn',@hessianfcn);

    例は、「解析的ヘッセ行列を使用した fmincon の内点法アルゴリズム」を参照してください。

interior-point アルゴリズムには、ヘッセ行列に対してさらにいくつかのオプションがあります。「内点法 fmincon に対する入力ヘッセ行列の選択」を参照してください。

  • options = optimoptions('fmincon','Hessian','bfgs');

    fmincon は密な準ニュートン近似によってヘッセ行列を計算します。これは既定の設定です。

  • options = optimoptions('fmincon','Hessian','lbfgs');

    fmincon は制限されたメモリで大規模な準ニュートン近似により、ヘッセ行列を計算します。既定のメモリでは 10 回の反復が使用されます。

  • options = optimoptions('fmincon','Hessian',{'lbfgs',positive integer});

    fmincon は制限されたメモリで大規模な準ニュートン近似により、ヘッセ行列を計算します。正の整数は前回の反復がいくつまで記憶されているかを指定します。

  • options = optimoptions('fmincon','Hessian','fin-diff-grads',...
    'SubproblemAlgorithm','cg','GradObj','on',...
    'GradConstr','on');

    fmincon は勾配の有限差分によるベクトルとヘッセ行列との乗算を計算します。目的関数の勾配を与える必要があります。また非線形制約関数がある場合は、その勾配も与えなければなりません。

ヘッセの乗算関数

interior-point アルゴリズムと trust-region-reflective アルゴリズムではヘッセの乗算関数を指定できます。この関数はヘッセを直接計算せずに、ベクトルとヘッセとの乗算結果を与えます。これによってメモリを節約できます。

2 つのアルゴリズムの構文は以下のように異なっています。

  • interior-point アルゴリズムでは、構文は次のようになります。

    W = HessMultFcn(x,lambda,v);

    結果 W は積 H*v になります。ここで Hx でのラグランジュのヘッセ行列であり (「式 10-1」を参照)、lambdafmincon によって計算されるラグランジュ乗数です。また、v はサイズが n 行 1 列のベクトルです。以下のようにオプションを設定します。

    options = optimoptions('fmincon','Algorithm','interior-point','Hessian','user-supplied',... 
        'SubproblemAlgorithm','cg','HessMult',@HessMultFcn);

    n 行 1 列のベクトルを返す関数 HessMultFcn を指定します。ここで、n は x の次元数です。HessMult オプションはヘッセ行列を計算せずにヘッセ行列とベクトルの乗算結果を渡すことができます。

  • trust-region-reflective アルゴリズムには lambda が含まれません。

    W = HessMultFcn(H,v);

    結果 W は H*v に等しくなります (W = H*v)。fmincon は目的関数の 3 番目の出力で返される値として H を渡します (「スカラー目的関数の記述」を参照)。また fmincon は、n 行をもつベクトルまたは 列 v を渡します。v の列数は可変であるため、任意の列数を受け入れるよう HessMultFcn を記述します。H がヘッセ行列である必要はなく、W = H*v を計算できる任意のものを使用できます。

    以下のようにオプションを設定します。

    options = optimoptions('fmincon','Algorithm','trust-region-reflective',... 
        'Hessian','user-supplied','HessMult',@HessMultFcn);

    ヘッセ乗数関数を trust-region-reflective アルゴリズムとともに使用する例は、「密に構造化されたヘッセ行列と線形等式を使用した最小化」を参照してください。

オプション

fmincon により使用される最適化オプションです。いくつかのオプションはすべてのアルゴリズムに適用することができ、その他のオプションは特定のアルゴリズムに関連します。options の値を設定または変更するには optimoptions を使用します。詳細は 最適化オプション リファレンス を参照してください。

fmincon は次の 4 つのアルゴリズムのいずれかを使用します: active-setinterior-pointsqptrust-region-reflectiveoptimoptions を使用して、コマンド ラインからアルゴリズムを選択します。たとえば、次のようにします。

options = optimoptions('fmincon','Algorithm','active-set');

既定の trust-region-reflective は次のことを必要とします。

  • 目的関数に与えられる勾配

  • GradObj'on' に設定

  • 範囲制約と線形等式制約のいずれか (両方は使用できません)

これらの条件がすべて満たされていない場合は、active-set アルゴリズムが既定の設定になります。将来のリリースでは、既定のアルゴリズムは interior-point になります。

active-set アルゴリズムは大規模アルゴリズムではありません。「大規模と中規模のアルゴリズム」を参照してください。

すべてのアルゴリズム

4 つのアルゴリズムすべてが、これらのオプションを使用します。

Algorithm

最適化アルゴリズムを選択します。

  • 'trust-region-reflective' (現在の既定値)

  • 'active-set'

  • 'interior-point' (将来のリリースでの既定値)

  • 'sqp'

アルゴリズムの選択についての詳細は、「アルゴリズムの選択」を参照してください。

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) です。

FinDiffType

勾配推定に使用される有限差分は 'forward' (既定の設定) または 'central' (中央) のいずれかです。'central' では 2 倍の関数評価が必要になりますが、正確性が増します。

fmincon は有限差分の両方のタイプを推定するとき、範囲に注意深く従います。そのためたとえば、forward ではなく、backward を選択すると、範囲外の点を計算しないようにすることができます。ただし、interior-point アルゴリズムに対しては、AlwaysHonorConstraints オプションが 'none' に設定されている場合、'central' の差分は計算中に範囲に違反する可能性があります。

FunValCheck

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

GradConstr

ユーザーにより定義される非線形制約関数に対する勾配。入力引数 節の nonlcon で説明するように、fmincon'on' に設定すると、制約関数が 4 つの出力をもつことが予測されます。非線形制約の勾配を既定の 'off' に設定すると、有限差分が推定されます。trust-region-reflective アルゴリズムは、非線形制約を受け付けません。

GradObj

ユーザーが定義する目的関数の勾配。fun の勾配の定義方法については、上述の fun の説明を参照してください。'on' に設定すると、fmincon は目的関数のユーザー定義の勾配を使用します。既定の 'off' の場合、fmincon は有限差分を使用して勾配を推定します。信頼領域 Reflective 法を使用するには、勾配を与え、GradObj'on' に設定しなければなりません。

MaxFunEvals

可能な関数評価の最大回数 (正の整数)。interior-point 以外のすべてのアルゴリズムの既定値は 100*numberOfVariables です。interior-point アルゴリズムの既定値は 3000 です。

MaxIter

可能な反復の最大数 (正の整数)。interior-point 以外のすべてのアルゴリズムの既定値は 400 です。interior-point アルゴリズムの既定値は 1000 です。

OutputFcn

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

PlotFcns

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

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

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

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

  • @optimplotconstrviolation は最大制約違反をプロットします

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

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

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

TolCon

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

TolFun

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

TolX

x に関する許容誤差 (正のスカラー)。interior-point 以外のすべてのアルゴリズムの既定値は 1e-6 です。interior-point アルゴリズムの既定値は 1e-10 です。

TypicalX

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

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

UseParallel

'always' の場合、並列で勾配を推定します。既定の 'never' に設定すると、無効になります。trust-region-reflective は目的関数に勾配を必要とするので、UseParallel は適用されません。「並列計算」を参照してください。

信頼領域 Reflective 法アルゴリズム

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

Hessian

'on' または 'user-supplied' の場合、fmincon では目的関数にユーザー定義のヘッセ (fun で定義)、またはヘッセの情報 (HessMult を使用する場合) を使用します。'off' (既定の設定) の場合、fmincon は有限差分を使用してヘッセ行列を近似します。

HessMult

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

W = hmfun(Hinfo,Y)

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

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

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

Y は問題の次元と同じ行数をもつ行列です。H が陽的な形式をしていない場合でも W = H*Y を満たします。fmincon は前提条件子を計算するために Hinfo を使用します。hmfun が必要とする追加のパラメーターを与える方法については 追加パラメーターの受け渡し を参照してください。

    メモ:   fmincon によって Hinfofun から hmfun に渡されるため、Hessian'on' または 'user-supplied' に設定しなければなりません。

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

 
HessPattern

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

 
MaxPCGIter

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

 
PrecondBandWidth

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

 
TolPCG

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

 

有効制約法

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

MaxSQPIter

SQP 反復の最大数 (正の整数)。既定値は 10*max(numberOfVariables, numberOfInequalities + numberOfBounds) です。

RelLineSrchBnd

x の変位合計のようなライン探索手順長さ上の相対的な境界 (実数の非負のスカラー値) は |Δx(i)| ≤ relLineSrchBnd· max(|x(i)|,|typicalx(i)|) を満たします。このオプションはソルバーが大きすぎる手順をとった場合に、x の変位の大きさをコントロールします。既定の設定は範囲なし [] です。

RelLineSrchBndDuration

RelLineSrchBnd で指定された範囲の反復数は有効になります (既定値は 1 です)。

TolConSQP

内部反復 SQP 制約違反に関する終了許容誤差 (正のスカラー)。既定値は 1e-6 です。

Interior-Point アルゴリズム

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

AlwaysHonorConstraints

既定の 'bounds' は範囲制約が各反復で満たされているかを確認します。'none' に設定すると、この動作は無効になります。

HessFcn

ユーザーが与えたヘッセ行列 (ヘッセ行列 を参照してください) の関数ハンドルです。Hessian オプションが 'user-supplied' に設定されている場合に、これが使用されます。

Hessian

どのように fmincon がヘッセ行列を計算するかを選択してください (ヘッセ行列 を参照してください)。選択肢は以下になります。

  • 'bfgs' (既定の設定)

  • 'fin-diff-grads'

  • 'lbfgs'

  • {'lbfgs',Positive Integer}

  • 'user-supplied'

HessMult

ヘッセ行列とベクトルの乗算を計算するためにユーザーが提供した関数を処理します (ヘッセ行列 を参照してください)。Hessian オプションが 'user-supplied' に設定されている場合に、これが使用されます。

InitBarrierParam

初期境界値 (正のスカラー)。既定の 0.1 より大きい値を試すのに役立つ場合があります。特に、目的関数や制約関数が大きい場合役立ちます。

InitTrustRegionRadius

信頼領域の初期半径です (正のスカラー)。適切にスケール化されていない問題では既定の より小さな値を選択すると役立つ場合があります。ここで n は変数の数です。

MaxProjCGIter

計画された共役勾配の反復回数の許容誤差 (停止条件) です。これは内部反復であり、アルゴリズムの反復数ではありません。この正の整数は 2*(numberOfVariables - numberOfEqualities) の既定値をもちます。

ObjectiveLimit

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

ScaleProblem

'obj-and-constr' を設定すると、アルゴリズムがすべての制約関数とこの目的関数を正規化します。既定の 'none' に設定すると、無効になります。

SubproblemAlgorithm

反復手順の計算方法を定義します。'cg' は密なヘッセ行列をもつ大規模な問題より高速に解ける可能性がありますが、既定の 'ldl-factorization' は一般に 'cg' (共役勾配) より高速になります。

TolProjCG

計画された共役勾配アルゴリズムの相対許容誤差 (停止条件) です。これは内部の反復に対してであり、アルゴリズムの反復に対してではありません。この正のスカラーは 0.01 の既定値をもちます。

TolProjCGAbs

計画された共役勾配アルゴリズムの絶対許容誤差 (停止条件) です。これは内部の反復に対してであり、アルゴリズムの反復に対してではありません。この正のスカラーは 1e-10 の既定値をもちます。

SQP アルゴリズム

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

ObjectiveLimit

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

ScaleProblem

'obj-and-constr' を設定すると、アルゴリズムがすべての制約関数とこの目的関数を正規化します。既定の 'none' に設定すると、無効になります。

f(x) = –x1x2x3 を最小にする x の値を求めます。x = [10;10;10] を開始値とし、制約条件を以下とします。

0 ≤ x1 + 2x2 + 2x3 ≤ 72.

  1. x で評価される目的関数のスカラー値 f を返すファイルを記述します。

    function f = myfun(x)
    f = -x(1) * x(2) * x(3);
  2. 両方の制約をある定数より小さいか、または等しい型で表します。

    –x1–2x2–2x3 ≤ 0
    x1 + 2x2 + 2x3≤ 72

  3. 両方の制約は線形であるため、これらを行列不等式 A·x ≤ b として定式化します。ここで以下のようになります。

    A = [-1 -2 -2; ...
          1  2  2];
    b = [0;72];
  4. 開始値を設定して、最適化ルーチンを呼び出します。

    x0 = [10;10;10];    % Starting guess at the solution
    [x,fval] = fmincon(@myfun,x0,A,b);
  5. 11 回の反復後、解は以下のようになります。

    x
    x =
        24.0000
        12.0000
        12.0000

    このとき関数値は以下になります。

    fval
    fval =
        -3.4560e+03

    そして線形不等式制約は 0 以下となるように計算を行います。

    A*x-b
    ans =
        -72
          0

メモ:

信頼領域 Reflective 法の最適化

信頼領域 Reflective 法アルゴリズムを使用するには、以下を行わなければなりません。

  • 目的関数 fun に勾配を与える

  • optionsGradObj'on' に設定する

  • 次のタイプの制約の (両方ではなく) いずれか 1 つを使用して実行可能領域を指定します。

    • 上限および下限の制約

    • 等式制約行列 Aeq が列よりも多くの行をもつことができない、線形等式制約。

信頼領域 Reflective 法アルゴリズムでは不等式制約を使用することはできません。上記の条件が満たされていない場合、fmincon は有効制約法になります。

fmincon は勾配が与えられず、Algorithm オプションが trust-region-reflective の場合、警告を出力します。fmincon に近似勾配を与えることができますが、このオプションは推奨されません。大部分の最適化手法の数値的な挙動は、真の勾配が使用される場合非常にロバストになるからです。

fmincon の信頼領域 Reflective 法は 2 次導関数行列、すなわちヘッセ行列 H(x) を計算するときに最も効果的になります。しかし、正しいヘッセ行列の計算は必要ありません。たとえば、(optionsHessPattern オプションを使用して) ヘッセ行列スパース構造を用意することができる場合、fminconH(x) のスパース有限差分近似を計算します。

x0 が厳密な意味で実行可能でない場合、fmincon は新たに厳密な意味で実行可能な点を (中央の) 開始値とします。

x の構成要素に上限 (または下限) がない場合、fmincon では ub (または lb) の対応する要素に非常に大きい任意の正の値 (下限に対しては負の値) を設定するよりも、inf (下限に対しては -inf) を設定してください。

線形制約付き最小化には以下の特性があることに注意してください。

  • 行列 Aeq の密な (または比較的密な) 列は、結果として非スパース性が高く、計算コストが高くなります。

  • fminconAeq の (数値的に) 線形従属行を取り除きます。しかし、この処理は反復行列の因子分解を行うため、従属性が強い場合コストも大きくなる可能性があります。

  • 各反復は、次の行列によるスパース最小二乗の解を伴います。

    ここで RT は前提条件子のコレスキー因子です。そのため、効率的な前提条件の選択と の非スパース性を最小にすることの間には、潜在的な矛盾があります。

有効制約法の最適化

等式制約があり、二次部分問題内で従属の関係にある等式を検出し取り除くと、'dependent'Procedures の見出しの下に表示されます (Display オプションを 'iter') に設定した場合)。従属関係にある方程式を取り除くのは、等式が矛盾するときのみです。等式に矛盾がある場合、部分問題が実行不可能となり、Procedures の見出しの下に 'infeasible' を出力します。

制限

fmincon は勾配ベースの方法です。この方法は目的関数と制約関数が両方とも連続で、1 次導関数をもつ問題に対して動作するように設計されています。

問題が実行不可能である場合、fmincon は最大制約値を最小化にしようと試みます。

trust-region-reflective アルゴリズムは上限と下限を同じ値に設定できません。たとえば、lb(2)==ub(2) の場合、fmincon はエラーを出力します。

Equal upper and lower bounds not permitted in this
large-scale method.
Use equality constraints and the medium-scale
method instead.

ヘッセ行列を渡す構文には 2 種類あります。また、関数 HessMult を渡す構文も 2 種類あります。一方は trust-region-reflective であり、他方は interior-point に対するものです。

trust-region-reflective の場合、ラグランジュ行列のハッセ行列は目的関数のハッセ行列と同じです。ヘッセ行列は目的関数の 3 番目の出力として渡すことができます。

interior-point の場合、ラグランジュ行列のヘッセ行列はラグランジュ乗数と非線形制約関数のヘッセ行列を含みます。位置 x とラグランジュ乗数構造体 lambda の両方を考慮に入れた別の関数としてヘッセ行列を渡すことができます。

信頼領域 Reflective 法問題の収束と必要条件

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

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

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

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

  • Aeq はスパース行列になります。

詳細

すべて展開する

アルゴリズム

信頼領域 Reflective 法の最適化

このアルゴリズムはサブ空間の信頼領域 Reflective 法であり、[3][4] で説明する interior-reflective Newton 法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。fmincon の信頼領域 Reflective 法アルゴリズム にある信頼領域法および前処理付き共役勾配法の説明を参照してください。

有効制約法の最適化

fmincon逐次二次計画法 (SQP) 法を使用します。この方法では、関数は各反復で二次計画法 (QP) の部分問題を解きます。fmincon はラグランジュ行列のヘッセ行列の計算を BFGS 式 (fminunc および参考文献 [7][8] を参照) を使用して、反復ごとに更新します。

fmincon は、[6][7][8] で推奨されるものと同様なメリット関数を使用してライン探索を実行します。QP 部分問題を解くには、[5] での説明と同様の有効制約法を使用します。アルゴリズムの詳細は、「fmincon 有効制約法アルゴリズム」を参照してください。

使用されるアルゴリズムの詳細は SQP 法の実装 を参照してください。

内点法の最適化

このアルゴリズムは、fmincon の内点法アルゴリズム で説明します。この方法は [1][41]、および、[9] で詳しく説明します。

SQP 最適化

fmincon 'sqp' アルゴリズムは、「有効制約法の最適化」に記述されている 'active-set' アルゴリズムと同様です。「fmincon SQP アルゴリズム」に主な相違点が示されています。相違点の概要は以下のとおりです。

参考文献

[1] Byrd, R.H., J. C. Gilbert, and J. Nocedal, “A Trust Region Method Based on Interior Point Techniques for Nonlinear Programming,” Mathematical Programming, Vol 89, No. 1, pp. 149–185, 2000.

[2] Byrd, R.H., Mary E. Hribar, and Jorge Nocedal, “An Interior Point Algorithm for Large-Scale Nonlinear Programming, SIAM Journal on Optimization,” SIAM Journal on Optimization, Vol 9, No. 4, pp. 877–900, 1999.

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

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

[5] Gill, P.E., W. Murray, and M.H. Wright, Practical Optimization, London, Academic Press, 1981.

[6] Han, S.P., “A Globally Convergent Method for Nonlinear Programming,” Vol. 22, Journal of Optimization Theory and Applications, p. 297, 1977.

[7] Powell, M.J.D., “A Fast Algorithm for Nonlinearly Constrained Optimization Calculations,” Numerical Analysis, ed. G.A. Watson, Lecture Notes in Mathematics, Springer Verlag, Vol. 630, 1978.

[8] Powell, M.J.D., “The Convergence of Variable Metric Methods For Nonlinearly Constrained Optimization Calculations,” Nonlinear Programming 3 (O.L. Mangasarian, R.R. Meyer, and S.M. Robinson, eds.), Academic Press, 1978.

[9] Waltz, R. A., J. L. Morales, J. Nocedal, and D. Orban, “An interior algorithm for nonlinear optimization that combines line search and trust region steps,” Mathematical Programming, Vol 107, No. 3, pp. 391–408, 2006.

参考

| | | |

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