ドキュメンテーション

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

fminimax

ミニマックス制約付き問題を解く

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

minxmaxiFi(x)  such that  {c(x)0ceq(x)=0AxbAeqx=beqlbxub

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

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

また、単位行列を使用して、fminimax で最大最小の問題を解くこともできます。

maxxminiFi(x)=minxmaxi(Fi(x)).

以下の形式の問題を解くことができます。

minxmaxi|Fi(x)|

この問題を解くには AbsoluteMaxObjectiveCount オプションを使用します。メモ:を参照してください。

構文

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

説明

fminimax は多変数の関数の集合で最悪の場合 (最大) の値を初期推定を使って最小化します。これを通常、"ミニマックス問題" と呼びます。

x = fminimax(fun,x0) は、x0 を開始値として fun に記述する関数のミニマックス解 x を求めます。

x = fminimax(fun,x0,A,b) は線形等式 A*x ≤ b を制約とするミニマックス問題を解きます。

x = fminimax(fun,x0,A,b,Aeq,beq) は線形等式 Aeq*x = beq を制約とするミニマックス問題も解きます。不等式が存在しない場合は A = [] および b = [] と設定してください。

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub) は、解が常に lb  x  ub の範囲に存在するように、設計変数 x に上限と下限を定義します。

x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) は、非線形不等式制約 c(x)、または nonlcon に定義する等式制約 ceq(x) をミニマックス問題に課します。fminimaxc(x) ≤ 0 および ceq(x) = 0 のもとで最適化します。範囲が存在しない場合には lb = [] および ub = [] またはこれらのいずれかを設定してください。

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

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

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

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

[x,fval,maxfval] = fminimax(...) は、解 x で計算された目的関数の最大値を入力 fun に返します。

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

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

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

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

入力引数

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

fun

最小化される関数。fun はベクトル x を受け、x で計算される目的関数であるベクトル F を返す関数です。関数 fun はファイルの関数ハンドルとして指定することができます。

x = fminimax(@myfun,x0)

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

function F = myfun(x)
F = ...            % Compute function values at x

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

x = fminimax(@(x)sin(x.*x),x0);

xF のユーザー定義の値が行列の場合、「線形インデックス」を使用してベクトルに変換されます。

ベクトル F(x) の任意の要素の最悪の場合の絶対値を最小化するには (すなわち min{max abs{F(x)} })、これらの目的関数を F のはじめの要素に設定し、optimoptions を使って AbsoluteMaxObjectiveCount オプションにこの目的関数の数を設定してください。

また目的関数の勾配を計算することもでき、さらに次のように SpecifyObjectiveGradient オプションが true である場合、

options = optimoptions('fminimax','SpecifyObjectiveGradient',true)

関数 fun は 2 番目の出力引数に x での勾配値行列 G を返さなければなりません。勾配は点 x における各 F の偏導関数 dF/dx です。F が長さ m のベクトルであり、x の長さが n で、nx0 の長さである場合、F(x) の勾配 Gnm 列の行列です。ここで G(i,j)F(j)x(i) に関する偏導関数です (すなわち、G の第 j 番目の目的関数 F(j)j 番目の勾配です)。

nargout の値を確認することで、1 つの出力引数のみの場合 (最適化アルゴリズムが G ではなく F の値のみを必要とする場合)、myfun が呼び出されるときに G の演算を避けることができます。

function [F,G] = myfun(x)
F = ...          % Compute the function values at x
if nargout > 1   % Two output arguments
   G = ...       % Gradients evaluated at x
end

    メモ:   SpecifyObjectiveGradienttrue に設定することは、非線形制約がない場合と非線形制約の SpecifyConstraintGradienttrue の場合のみ有効です。これは内部的に目的関数が制約に含まれるためです。このためソルバーは、勾配推定を避けるために与えられた両方の勾配 (目的関数と制約) を必要とします。

nonlcon

非線形不等式制約 c(x) ≤ 0 および非線形等式制約 ceq(x) = 0 を演算する関数です。関数 nonlcon はベクトル x を使ってベクトル c および ceq を返します。ベクトル cx で評価された非線形不等式を含み、ベクトル ceqx で評価された非線形等式を含んでいます。関数 nonlcon は関数ハンドルとして指定することができます。

x = fminimax(@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

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

options = optimoptions('fminimax','SpecifyConstraintGradient',true)

関数 nonlcon は 3 番目および 4 番目の出力引数に c(x) の勾配 GC および ceq(x) の勾配 GCeq を返さなければなりません。非線形制約は与えられた勾配を受け付けないソルバーに使用する勾配を条件付ける方法と、勾配の構文を説明します。

    メモ:   SpecifyConstraintGradienttrue の設定は SpecifyObjectiveGradienttrue に設定されている場合のみ効果的です。これは内部的に目的関数が制約に含まれるためです。このためソルバーは、勾配推定を避けるために与えられた両方の勾配 (目的関数と制約) を必要とします。

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

 
 
problem

objective

目的関数 

x0

x の初期点 

Aineq

線形不等式制約の行列 

bineq

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

Aeq

線形等式制約の行列 

beq

線形等式制約のベクトル 

lb

下限のベクトル 

ub

上限のベクトル 

nonlcon

非線形制約関数 

solver

'fminimax' 

options

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

出力引数

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

exitflag

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

1

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

4

探索方向の大きさが指定した許容誤差より小さく、制約違反が options.ConstraintTolerance より小さいことを示します。

5

方向微分の大きさが指定した許容誤差より小さく、制約違反が options.ConstraintTolerance より小さいことを示します。

0

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

-1

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

-2

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

lambda

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

lower

下限 lb

upper

上限 ub

ineqlin

線形不等式

eqlin

線形等式

ineqnonlin

非線形不等式

eqnonlin

非線形等式

maxfval

x において評価された関数の値の最大値、すなわち、maxfval = max{fun(x)} です。

output

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

iterations

実行した反復回数

funcCount

関数評価の回数

lssteplength

探索方向に対するライン探索ステップ サイズ

stepsize

x の最終変位

algorithm

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

firstorderopt

1 次の最適性の尺度

constrviolation

制約関数の最大値

message

終了メッセージ

オプション

fminimax により使用される最適化オプションです。options を設定または変更するには optimoptions を使用します。詳細は、最適化オプション リファレンスを参照してください。

一部のオプションは、optimoptions に表示されません。このようなオプションはイタリックで記載されています。詳細は、表示オプションを参照してください。

AbsoluteMaxObjectiveCount

Fi の最大絶対値を最小にする Fi(x) の要素の数です。詳細は、メモ:を参照してください。既定値は 0 です。

Diagnostics

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

DiffMaxChange

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

DiffMinChange

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

Display

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

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

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

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

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

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

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

  • 'final-detailed' — 最終出力のみを表示し、技術的な終了メッセージを与える。

ConstraintTolerance

制約違反に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

FiniteDifferenceStepSize

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

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

ここで、sign′(0) = 1 を除き sign′(x) = sign(x) です。中央有限差分法では

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

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

FiniteDifferenceType

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

アルゴリズムは有限差分の両方のタイプを推定するとき、範囲に注意深く従います。そのためたとえば、forward ではなく、backward を選択すると、範囲外の点を計算しないようにすることができます。

FunctionTolerance

関数値に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

FunValCheck

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

MaxFunctionEvaluations

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

MaxIterations

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

MaxSQPIter

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

MeritFunction

'multiobj' と設定すると、ゴール到達/ミニマックス メリット関数を使用します (既定の設定)。'singleobj' と設定すると、fmincon メリット関数を使用します。

OptimalityTolerance

1 次の最適性に関する終了許容誤差 (正のスカラー)。既定の設定は 1e-6 です。詳細は、1 次の最適性の尺度を参照してください。

OutputFcn

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

PlotFcn

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

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

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

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

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

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

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

RelLineSrchBnd

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

RelLineSrchBndDuration

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

SpecifyConstraintGradient

ユーザー定義の制約の勾配です。入力引数nonlcon で説明するように、fminimax は、true に設定されると、制約関数が 4 つの出力をもつことを期待します。既定の false に設定すると、fminimax は有限差分の非線形制約の勾配を推定します。

SpecifyObjectiveGradient

ユーザー定義の目的関数の勾配です。fun の勾配の定義方法については、上述の fun の説明を参照してください。true に設定すると、fminimax は目的関数のユーザー定義の勾配を使用します。既定の false の場合、fminimax は有限差分を使用して勾配を推定します。

StepTolerance

x に関する許容誤差 (正のスカラー)。既定値は 1e-6 です。詳細は、許容誤差と停止条件を参照してください。

TolConSQP

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

TypicalX

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

UseParallel

true の場合、並列で勾配を推定します。既定の false に設定すると、無効になります。詳細は、「並列計算」を参照してください。

次の最大値を最小化する x の値を求めます。

[f1(x), f2(x), f3(x), f4(x), f5(x)]

ここで、

f1(x)=2x12+x2248x140x2+304,f2(x)=x123x22,f3(x)=x1+3x218,f4(x)=x1x2,f5(x)=x1+x28.

まず、x における 5 つの関数値を計算するファイルを記述します。

function f = myfun(x)
f(1)= 2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304;     % Objectives
f(2)= -x(1)^2 - 3*x(2)^2;
f(3)= x(1) + 3*x(2) -18;
f(4)= -x(1)- x(2);
f(5)= x(1) + x(2) - 8;

次に最適化ルーチンを呼び出します。

x0 = [0.1; 0.1];       % Make a starting guess at solution
[x,fval] = fminimax(@myfun,x0);

7 回の反復後、解は以下になります。

x,fval

x = 
     4.0000
     4.0000
fval =
     0.0000  -64.0000  -2.0000  -8.0000  -0.0000

メモ:

以下の形式の問題を解くことができます。

minxmaxiGi(x),

ここで、

Gi(x)={|Fi(x)|1imFi(x)i>m.

ここで、m は AbsoluteMaxObjectiveCount オプションの値です。この形式の利点は、絶対値関数は滑らかでないにもかかわらず、F の一部の要素の絶対値を最小化できることです。

このオプションを使用するには、必要に応じて F の要素を並べ替え、絶対値を最小にする要素が最初に並ぶようにします。

たとえばの問題を考察します。問題を修正して、すべての fi(x) の最大絶対値の最小値を求めます。次のコマンドを使って fminimax を呼び出し、この問題を解きます。

x0 = [0.1; 0.1]; % Make a starting guess at the solution
options = optimoptions('fminimax','AbsoluteMaxObjectiveCount',5); % Minimize abs. values
[x,fval] = fminimax(@myfun,x0,...
                    [],[],[],[],[],[],[],options);

7 回の反復後、解は以下になります。

x = 
     4.9256
     2.0796
fval = 
    37.2356 -37.2356 -6.8357 -7.0052 -0.9948

制限

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

詳細

すべて折りたたむ

アルゴリズム

fminimax は、 で与えた制約に Fi(x) ≤ γ の形式の制約をさらに付加 (再定式化) することで、ミニマックス問題を内部的に等価な非線形線形計画法に再定式化します。次に、x 上で γ を最小化します。fminimax は逐次二次計画法 (SQP) [1] を使用してこの問題を解きます。

ライン探索およびヘッシアンの算出に変更を行います。ライン探索では、正確なメリット関数 ([2][4] を参照) を [3][5] が提唱するメリット関数と共に使用します。いずれかのメリット関数が改善を示すときに、ライン探索を終了します。この関数は、この問題の特殊な構造を利用する変更されたヘッシアンを使用します。optimoptions を使用して MeritFunction オプションを 'singleobj' に設定すると、メリット関数と fmincon で使用されるヘッシアンが使われます。

使用アルゴリズムの詳細は SQP 法の実装 を参照してください。Display オプションの 'iter' の設定については、Procedures の見出しの下にある表示タイプを参照してください。

参考文献

[1] Brayton, R. K., S. W. Director, G. D. Hachtel, and L. Vidigal, “A New Algorithm for Statistical Circuit Design Based on Quasi-Newton Methods and Function Splitting,” IEEE Trans. Circuits and Systems, Vol. CAS-26, pp. 784-794, Sept. 1979.

[2] Grace, A. C. W., “Computer-Aided Control System Design Using Optimization Techniques,” Ph.D. Thesis, University of Wales, Bangor, Gwynedd, UK, 1989.

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

[4] Madsen, K. and H. Schjaer-Jacobsen, “Algorithms for Worst Case Tolerance Optimization,” IEEE Trans. of Circuits and Systems, Vol. CAS-26, Sept. 1979.

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

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