ドキュメンテーション

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

fmincon

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

非線形計画法ソルバーです。

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

minxf(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 はベクトルまたは行列として渡すことができます。行列引数を参照してください。

構文

  • 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,output] = fmincon(___)
  • [x,fval,exitflag,output,lambda,grad,hessian] = 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,output] = fmincon(___) は上記に加え、fmincon の終了条件を記述する値 exitflag、および最適化プロセスに関する情報を含む構造体 output を返します。

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___) は、さらに次のものを返します。

  • lambda — 解 x におけるラグランジュ乗数をフィールドに含む構造体。

  • grad — 解 x での fun の勾配。

  • hessian — 解 x での fun のヘッシアン。詳細は、fmincon ヘッシアンを参照してください。

すべて折りたたむ

線形不等式制約がある場合の Rosenbrock 関数の最小値を求めます。

目的関数 fun が Rosenbrock 関数になるように設定します。Rosenbrock 関数は、最小化が難しいことがよく知られています。これは点 (1,1) で目的関数の最小値 0 になります。詳細は、「制約付き非線形問題の解法」を参照してください。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

[-1,2] から開始して、 $x(1) + 2x(2) \le 1$を満たすように制約された最小値を求めます。A = [1,2] および b = 1 として、この制約を形式 Ax <= b で表します。この制約は、解が制約なしの解 (1,1) にならないことを意味するので注意してください。この点では、 $x(1) + 2x(2) = 3 &amp;gt; 1$ になるためです。

x0 = [-1,2];
A = [1,2];
b = 1;
x = fmincon(fun,x0,A,b)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.




x =

    0.5022    0.2489

線形不等式制約と線形等式制約の両方がある場合の Rosenbrock 関数の最小値を求めます。

目的関数 fun が Rosenbrock 関数になるように設定します。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

[0.5,0] から開始して、 $x(1) + 2x(2) \le 1$ および $2x(1) + x(2) = 1$ を満たすように制約された最小値を求めます。

  • A = [1,2] および b = 1 として、線形不等式制約を形式 A*x <= b で表します。

  • Aeq = [2,1] および beq = 1 として、線形等式制約を形式 Aeq*x <= beq で表します。

x0 = [0.5,0];
A = [1,2];
b = 1;
Aeq = [2,1];
beq = 1;
x = fmincon(fun,x0,A,b,Aeq,beq)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.




x =

    0.4149    0.1701

範囲制約が存在する場合の目的関数の最小値を求めます。

目的関数は、2 変数の単純な代数関数です。

fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));

x が正の値 x(1) ≤ 1 および x(2) ≤ 2 である領域内を探索します。

lb = [0,0];
ub = [1,2];

線形制約がないため、これらの引数を [] に設定します。

A = [];
b = [];
Aeq = [];
beq = [];

領域中央の初期点を試します。範囲制約付きの fun の最小値を求めます。

x0 = [0.5,1];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
x =

    1.0000    2.0000

初期点を変えると異なる解が見つかる場合があります。

x0 = x0/5;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
x =

   1.0e-06 *

    0.4000    0.4000

より良い解を確認する方法については、目的関数値の取得 を参照してください。

非線形制約付きの関数の最小値を求めます。

Rosenbrock 関数が円内で最小化される点を範囲制約付きで求めます。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;

領域 $0 \le x(1) \le 0.5$ $0.2 \le x(2) \le 0.8$ 内を探索します。

lb = [0,0.2];
ub = [0.5,0.8];

[1/3,1/3] を中心とした半径 1/3 の円内も探索します。次のコードを MATLAB® パス上にある circlecon.m という名前のファイルにコピーします。


% Copyright 2015 The MathWorks, Inc.

function [c,ceq] = circlecon(x)
c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2;
ceq = [];

線形制約がないため、これらの引数を [] に設定します。

A = [];
b = [];
Aeq = [];
beq = [];

すべての制約を満たす初期点を選択します。

x0 = [1/4,1/4];

問題を解きます。

nonlcon = @circlecon;
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.




x =

    0.5000    0.2500

反復の発生時に反復を表示し、異なるアルゴリズムを使用するようにオプションを設定します。

fmincon 解法プロセスを確認するには、Display オプションを 'iter' に設定します。また、'sqp' アルゴリズムを試します。このアルゴリズムは、既定の 'interior-point' アルゴリズムより速いか正確である場合があります。

options = optimoptions('fmincon','Display','iter','Algorithm','sqp');

単位円板 $||x||^2 \le 1$ 上の Rosenbrock 関数の最小値を求めます。まず、非線形制約を表す関数を作成します。これを unitdisk.m という名前のファイルとして MATLAB® パス上に保存します。


% Copyright 2015 The MathWorks, Inc.

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];

残りの問題の仕様を作成します。その後、fmincon を実行します。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
nonlcon = @unitdisk;
x0 = [0,0];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
                                                          Norm of First-order
 Iter F-count            f(x) Feasibility  Steplength        step  optimality
    0       3    1.000000e+00   0.000e+00                           2.000e+00
    1      12    8.913011e-01   0.000e+00   1.176e-01   2.353e-01   1.107e+01
    2      22    8.047847e-01   0.000e+00   8.235e-02   1.900e-01   1.330e+01
    3      28    4.197517e-01   0.000e+00   3.430e-01   1.217e-01   6.153e+00
    4      31    2.733703e-01   0.000e+00   1.000e+00   5.254e-02   4.587e-01
    5      34    2.397111e-01   0.000e+00   1.000e+00   7.498e-02   3.029e+00
    6      37    2.036002e-01   0.000e+00   1.000e+00   5.960e-02   3.019e+00
    7      40    1.164353e-01   0.000e+00   1.000e+00   1.459e-01   1.058e+00
    8      43    1.161753e-01   0.000e+00   1.000e+00   1.754e-01   7.383e+00
    9      46    5.901601e-02   0.000e+00   1.000e+00   1.547e-02   7.278e-01
   10      49    4.533081e-02   2.898e-03   1.000e+00   5.393e-02   1.252e-01
   11      52    4.567454e-02   2.225e-06   1.000e+00   1.492e-03   1.679e-03
   12      55    4.567481e-02   4.406e-12   1.000e+00   2.095e-06   1.501e-05
   13      58    4.567481e-02   0.000e+00   1.000e+00   2.203e-12   1.406e-05

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the default value of the step size tolerance and constraints are 
satisfied to within the default value of the constraint tolerance.




x =

    0.7864    0.6177

目的関数に勾配評価を含めて計算の速度や信頼性を高めます。

目的関数ファイルに条件付きの出力として勾配評価を含めます。詳細は、「勾配とヘッシアンを含める」を参照してください。この目的関数は Rosenbrock 関数になります。

$$ f(x) = 100{\left( {{x_2} - x_1^2} \right)^2} +&amp;#xA;{(1 - {x_1})^2}$$

ここで勾配は

$$\nabla f(x) = \left[ {\begin{array}{*{20}{c}}&amp;#xA;{ - 400\left( {{x_2} - x_1^2} \right){x_1} - 2\left( {1 - {x_1}} \right)}\\&amp;#xA;{200\left( {{x_2} - x_1^2} \right)}&amp;#xA;\end{array}} \right]$$

function [f,g] = rosenbrockwithgrad(x)
% Calculate objective f
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;

if nargout > 1 % gradient required
    g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
        200*(x(2)-x(1)^2)];
end

このコードを rosenbrockwithgrad.m という名前のファイルとして MATLAB® パス上に保存します。

目的関数の勾配を使用するオプションを作成します。

options = optimoptions('fmincon','SpecifyObjectiveGradient',true);

問題のその他の入力を作成します。その後、fmincon を呼び出します。

fun = @rosenbrockwithgrad;
x0 = [-1,2];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [-2,-2];
ub = [2,2];
nonlcon = [];
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.




x =

    1.0000    1.0000

個別の引数の代わりに問題構造体を使用して既定ではないオプション と同じ問題を解きます。

オプションおよび問題構造体を作成します。フィールド名および必要なフィールドについては、problem を参照してください。

options = optimoptions('fmincon','Display','iter','Algorithm','sqp');
problem.options = options;
problem.solver = 'fmincon';
problem.objective = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
problem.x0 = [0,0];

norm(x)2 ≤ 1 を表す非線形制約関数の関数ファイルを作成します。

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];

これを unitdisk.m という名前のファイルとして MATLAB® パス上に保存します。

非線形制約関数を problem に含めます。

problem.nonlcon = @unitdisk;

問題を解きます。

x = fmincon(problem)
                                                          Norm of First-order
 Iter F-count            f(x) Feasibility  Steplength        step  optimality
    0       3    1.000000e+00   0.000e+00                           2.000e+00
    1      12    8.913011e-01   0.000e+00   1.176e-01   2.353e-01   1.107e+01
    2      22    8.047847e-01   0.000e+00   8.235e-02   1.900e-01   1.330e+01
    3      28    4.197517e-01   0.000e+00   3.430e-01   1.217e-01   6.153e+00
    4      31    2.733703e-01   0.000e+00   1.000e+00   5.254e-02   4.587e-01
    5      34    2.397111e-01   0.000e+00   1.000e+00   7.498e-02   3.029e+00
    6      37    2.036002e-01   0.000e+00   1.000e+00   5.960e-02   3.019e+00
    7      40    1.164353e-01   0.000e+00   1.000e+00   1.459e-01   1.058e+00
    8      43    1.161753e-01   0.000e+00   1.000e+00   1.754e-01   7.383e+00
    9      46    5.901601e-02   0.000e+00   1.000e+00   1.547e-02   7.278e-01
   10      49    4.533081e-02   2.898e-03   1.000e+00   5.393e-02   1.252e-01
   11      52    4.567454e-02   2.225e-06   1.000e+00   1.492e-03   1.679e-03
   12      55    4.567481e-02   4.406e-12   1.000e+00   2.095e-06   1.501e-05
   13      58    4.567481e-02   0.000e+00   1.000e+00   2.160e-09   1.511e-05

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the default value of the step size tolerance and constraints are 
satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
x =

    0.7864    0.6177

反復表示および解は、既定ではないオプション と同じになります。

fval 出力を指定して fmincon を呼び出し、解での目的関数の値を取得します。

範囲制約 の例では 2 つの解が示されます。どちらの解がより適切でしょうか。fval 出力と解を要求する例を実行します。

fun = @(x)1+x(1)./(1+x(2)) - 3*x(1).*x(2) + x(2).*(1+x(1));
lb = [0,0];
ub = [1,2];
A = [];
b = [];
Aeq = [];
beq = [];
x0 = [0.5,1];
[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
x =

    1.0000    2.0000


fval =

   -0.6667

別の初期点 x0 を使用して問題を実行します。

x0 = x0/5;
[x2,fval2] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>
x2 =

   1.0e-06 *

    0.4000    0.4000


fval2 =

    1.0000

この解は、目的関数値 fval2 = 1 をもちます。この値は、最初の値である fval = -0.6667 より大きくなります。最初の解 x では、目的関数の局所的最小値はより小さくなります。

解の質を簡単に検証するには、exitflag 出力および output 出力を要求します。

Rosenbrock 関数を単位円板 $||x||^2 \le 1$ 上で最小化する問題を設定します。まず、非線形制約を表す関数を作成します。これを unitdisk.m という名前のファイルとして MATLAB® パス上に保存します。


% Copyright 2015 The MathWorks, Inc.

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];

残りの問題の仕様を作成します。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
nonlcon = @unitdisk;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x0 = [0,0];

fval 出力、exitflag 出力、および output 出力を使用して、fmincon を呼び出します。

[x,fval,exitflag,output] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the optimality tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.




x =

    0.7864    0.6177


fval =

    0.0457


exitflag =

     1


output = 

         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: 'Local minimum found that satisfies the constraints....'

  • exitflag1 は、解が局所的最小値であることを示します。

  • output 構造体は、解法プロセスに関する各種の統計を報告します。具体的には、output.iterations は反復回数、output.funcCount は関数評価の回数、output.constrviolation は実行可能性を示します。

fmincon は、オプションで、報告された解の解析に使用できるいくつかの出力を返します。

Rosenbrock 関数を単位円板上で最小化する問題を設定します。まず、非線形制約を表す関数を作成します。これを unitdisk.m という名前のファイルとして MATLAB パス上に保存します。

function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [];

残りの問題の仕様を作成します。

fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
nonlcon = @unitdisk;
A = [];
b = [];
Aeq = [];
beq = [];
lb = [];
ub = [];
x0 = [0,0];

fmincon の出力をすべて要求します。

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the default value of the function tolerance,
and constraints are satisfied to within the default value of the constraint tolerance.

<stopping criteria details>


x =

    0.7864    0.6177


fval =

    0.0457


exitflag =

     1


output = 

         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9160e-06
          algorithm: 'interior-point'
      firstorderopt: 2.0624e-08
       cgiterations: 4
            message: 'Local minimum found that satisfies the constraints.

Optimizati...'


lambda = 

         eqlin: [0x1 double]
      eqnonlin: [0x1 double]
       ineqlin: [0x1 double]
         lower: [2x1 double]
         upper: [2x1 double]
    ineqnonlin: 0.1215


grad =

   -0.1911
   -0.1501


hessian =

  497.2871 -314.5574
 -314.5574  200.2378
  • lambda.ineqnonlin 出力は、解で非線形制約がアクティブになっていることを表し、関連付けられたラグランジュ乗数の値を示します。

  • grad 出力は、解 x での目的関数の勾配値を示します。

  • hessian 出力については、fmincon ヘッシアン で説明します。

関連する例

入力引数

すべて折りたたむ

最小化する関数。関数ハンドルまたは関数名として指定されます。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 の勾配を計算することができ、"さらに" 次のように SpecifyObjectiveGradient オプションが true に設定されている場合、

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

ヘッセ行列を計算することもでき、"さらに" HessianFcn オプションが optimoptions によって 'objective' に設定されており、"かつ" Algorithm オプションが 'trust-region-reflective' である場合、fun は、3 番目の出力引数に対称行列であるヘッセ値 H(x) を返さなければなりません。fun はスパース ヘッシアンを返すことができます。詳細は、fminunc の信頼領域法アルゴリズムまたは fmincon の信頼領域 Reflective 法アルゴリズムのヘッシアン を参照してください。

ヘッセ行列を計算することもでき、Algorithm オプションが 'interior-point' に設定されている場合は、別の方法でヘッシアンを fmincon に渡すことができます。詳細は、fmincon の内点法アルゴリズムのヘッシアンを参照してください。Symbolic Math Toolbox™ を使用して勾配およびヘッシアンを計算する例は、Symbolic Math Toolbox による勾配とヘッシアンの計算 を参照してください。

interior-point アルゴリズムと trust-region-reflective アルゴリズムではヘッセ乗算関数を指定できます。この関数はヘッシアンを直接計算せずに、ベクトルとヘッシアンの積を返します。これによってメモリを節約できます。詳細は、ヘッセ乗算関数を参照してください。

例: fun = @(x)sin(x(1))*cos(x(2))

データ型: char | function_handle

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

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

データ型: double

実数行列として指定される線形不等式制約です。AMN 列の行列で、M は不等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、A をスパース行列として渡します。

AM 個の線形不等式を符号化します。

A*x <= b

ここで、xN 個の変数 x(:) の列ベクトル、bM 個の要素をもつ列ベクトルです。

たとえば、次を指定します。

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

次の制約を与えます。

A = [1,2;3,4;5,6];
b = [10;20;30];

例: x 成分の和が 1 以下になるように指定するため、A = ones(1,N) および b = 1 とします。

データ型: double

実数ベクトルで指定される線形不等式制約です。b は、行列 A に関連する M 要素ベクトルです。b を行ベクトルとして渡す場合、ソルバーは b を列ベクトル b(:) に内部的に変換します。大規模な問題の場合は、b をスパース ベクトルとして渡します。

bM 個の線形不等式を符号化します。

A*x <= b

ここで、xN 個の変数 x(:) の列ベクトル、AMN 列の行列です。

たとえば、次を指定します。

x1 + 2x2 ≤ 10
3x1 + 4x2 ≤ 20
5x1 + 6x2 ≤ 30,

次の制約を与えます。

A = [1,2;3,4;5,6];
b = [10;20;30];

例: x 成分の和が 1 以下になるように指定するため、A = ones(1,N) および b = 1 とします。

データ型: double

実数行列として指定される線形等式制約です。AeqMeN 列の行列で、Me は等式の数、N は変数の数 (x0 の要素数) です。大規模な問題の場合は、Aeq をスパース行列として渡します。

AeqMe 個の線形等式を符号化します。

Aeq*x = beq

ここで、xN 個の変数 x(:) の列ベクトル、beqMe 個の要素をもつ列ベクトルです。

たとえば、次を指定します。

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

次の制約を与えます。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: x 成分の和が 1 になるように指定するため、Aeq = ones(1,N) および beq = 1 とします。

データ型: double

実数ベクトルで指定される線形等式制約です。beq は、行列 Aeq に関連する Me 要素ベクトルです。beq を行ベクトルとして渡す場合、ソルバーは beq を列ベクトル beq(:) に内部的に変換します。大規模な問題の場合は、beq をスパース ベクトルとして渡します。

beqMe 個の線形等式を符号化します。

Aeq*x = beq

ここで、xN 個の変数 x(:) の列ベクトル、AeqMeqN 列の行列です。

たとえば、次を指定します。

x1 + 2x2 + 3x3 = 10
2x1 + 4x2 + x3 = 20,

次の制約を与えます。

Aeq = [1,2,3;2,4,1];
beq = [10;20];

例: x 成分の和が 1 になるように指定するため、Aeq = ones(1,N) および beq = 1 とします。

データ型: double

下限。実数ベクトルまたは実数配列として指定されます。x0 の要素数が lb の要素数と等しい場合、lb は次を指定します。

x(i) >= lb(i) (すべての i について)

numel(lb) < numel(x0) の場合、lb は次を指定します。

x(i) >= lb(i) (1 <= i <= numel(lb))

この場合、ソルバーによって警告が発行されます。

例: すべての x 成分が正になるように指定するため、lb = zeros(size(x0)) とします。

データ型: double

実数ベクトルまたは実数配列として指定される上限です。x0 の要素数が ub の要素数と等しい場合、ub は次を指定します。

x(i) <= ub(i) (すべての i について)

numel(ub) < numel(x0) の場合、ub は次を指定します。

x(i) <= ub(i) (1 <= i <= numel(ub))

この場合、ソルバーによって警告が発行されます。

例: すべての x 成分が 1 未満になるように指定するため、ub = ones(size(x0)) とします。

データ型: double

非線形制約。関数ハンドルまたは関数名として指定されます。nonlcon は、ベクトルまたは配列 x を受け、2 つの配列 c(x) および ceq(x) を返す関数です。

  • c(x) は、x での非線形不等式制約の配列です。fmincon は次の条件を満たそうとします。

    c のすべてのエントリに対して c(x) <= 0

  • ceq(x) は、x での非線形等式制約の配列です。fmincon は次の条件を満たそうとします。

    ceq のすべてのエントリに対して ceq(x) = 0

たとえば、

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.
また制約関数の勾配を計算することができ、"さらに" 次のように SpecifyConstraintGradient オプションが true である場合、
options = optimoptions('fmincon','SpecifyConstraintGradient',true)
nonlcon は 3 番目および 4 番目の出力引数に c(x) の勾配 GC および ceq(x) の勾配 GCeq を返さなければなりません。GCGCeq はスパースか密である可能性があります。GCGCeq が大きく、比較的非零の項目が少ない場合は、それらをスパース行列として使用して、interior-point アルゴリズム内の実行時間とメモリを節約します。詳細は、非線形制約を参照してください。

データ型: char | function_handle

最適化オプション。optimoptions の出力、または optimset などによって返される構造体として指定されます。

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

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

すべてのアルゴリズム
Algorithm

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

  • 'interior-point' (既定の設定)

  • 'trust-region-reflective'

  • 'sqp'

  • 'active-set'

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

trust-region-reflective アルゴリズムには、以下が必要になります。

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

  • SpecifyObjectiveGradient を次の値に設定。 true

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

'trust-region-reflective' アルゴリズムを選択し、これらの条件の一部が満たされていない場合、fmincon はエラーを発行します。

'active-set' および 'sqp' は、大規模なアルゴリズムではありません。詳細は、大規模アルゴリズムと中規模アルゴリズムを参照してください。

CheckGradients

ユーザー設定の微分値 (目的関数または制約の勾配) と有限差分による微分値とを比較します。選択肢は、false (既定の設定) または true です。

ConstraintTolerance

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

Diagnostics

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

DiffMaxChange

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

DiffMinChange

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

Display

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

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

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

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

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

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

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

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

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 倍の関数評価が必要になりますが、正確性が増します。信頼領域 Reflective 法アルゴリズムでは、CheckGradientstrue に設定されている場合にのみ FiniteDifferenceType が使用されます。

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

FunctionTolerance

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

FunValCheck

目的関数値が正しいかどうかチェックします。既定の設定 'off' ではチェックが実行されません。'on' に設定すると、目的関数が complexInf、または NaN の値を返すとエラーが表示されます。

MaxFunctionEvaluations

可能な関数評価の最大回数 (正の整数)。interior-point 以外のすべてのアルゴリズムの既定値は 100*numberOfVariables です。interior-point アルゴリズムの既定値は 3000 です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

MaxIterations

可能な反復の最大数 (正の整数)。interior-point 以外のすべてのアルゴリズムの既定値は 400 です。interior-point アルゴリズムの既定値は 1000 です。詳細は、許容誤差と停止条件反復と関数計算回数を参照してください。

OptimalityTolerance

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

OutputFcn

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

PlotFcn

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

  • @optimplotx — 現在の点をプロット

  • @optimplotfunccount — 関数計算をプロット

  • @optimplotfval — 関数値をプロット

  • @optimplotconstrviolation — 最大制約違反をプロット

  • @optimplotstepsize — ステップ サイズをプロット

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

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

SpecifyConstraintGradient

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

SpecifyObjectiveGradient

ユーザーが定義する目的関数の勾配。fun の勾配の定義方法については、fun の説明を参照してください。既定の false の場合、fmincon は有限差分を使用して勾配を推定します。true に設定すると、fmincon は目的関数のユーザー定義の勾配を使用します。'trust-region-reflective' アルゴリズムを使用するには、勾配を与え、SpecifyObjectiveGradienttrue に設定しなければなりません。

StepTolerance

x に関する許容誤差 (正のスカラー)。'interior-point' 以外のすべてのアルゴリズムの既定値は 1e-6 です。'interior-point' アルゴリズムの既定値は 1e-10 です。詳細は、許容誤差と停止条件を参照してください。

TypicalX

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

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

UseParallel

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

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

[] (既定の設定) の場合、fmincon は有限差分を使用してヘッシアンを近似するか、ヘッセ乗算関数を (オプション HessianMultiplyFcn と共に) 使用します。'objective' に設定すると、fmincon はユーザー定義のヘッシアン (fun で定義) を使用します。詳細は、入力としてのヘッシアンを参照してください。

HessianMultiplyFcn

ヘッセ乗算関数用の関数ハンドル。大規模構造問題に対して、この関数は実際に 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 が必要とする追加のパラメーターを与える方法については、追加パラメーターの受け渡し を参照してください。

    メモ:   HessianMultiplyFcn オプションを使用するには、HessianFcn[] に、SubproblemAlgorithm'cg' (既定の設定) に設定しなければなりません。

詳細は、ヘッセ乗算関数を参照してください。例については、密に構造化されたヘッシアンと線形等式を使用した最小化 を参照してください。

 
HessPattern

有限差分に対するヘッシアンのスパース パターン。∂2fun/∂x(i)x(j) ≠ 0 をもつことができる場合は、HessPattern(i,j) = 1 を設定します。それ以外の場合は、HessPattern(i,j) = 0 を設定します。

fun でヘッセ行列 H を計算するのが不便な場合は HessPattern を使用します。しかし fun の勾配の i 番目の成分が x(j) によって異なる場合は、見ただけで判断できます。H の "スパース構造" を HessPattern の値として提供できる場合は、fmincon は (勾配の) スパース有限差分を使って H を近似することができます。つまり、非ゼロの位置を指定します。

構造が不明であれば、HessPattern を設定しないでください。既定では、HessPattern は 1 からなる密行列のように動作します。その後 fmincon は、非スパース状態の有限差分近似を反復ごとに計算します。大規模な問題では、この計算には多大なリソースが必要となる場合があり、通常はスパース構造を決定するのが妥当です。

 
MaxPCGIter

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

 
PrecondBandWidth

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

 
SubproblemAlgorithm

反復ステップの計算方法を定義します。既定の設定である 'cg' のステップは 'factorization' より高速ですが、精度の点で劣ります。詳細は、「fmincon の信頼領域 Reflective 法アルゴリズム」を参照してください。

 
TolPCG

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

 
有効制約法アルゴリズム 
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 です。

 
内点法アルゴリズム 
HessianApproximation

どのように fmincon がヘッシアンを計算するかを選択してください (入力としてのヘッシアン を参照してください)。選択肢は以下になります。

  • 'bfgs' (既定の設定)

  • 'finite-difference'

  • 'lbfgs'

  • {'lbfgs',Positive Integer}

    メモ:   HessianApproximation を使用するには、HessianFcnHessianMultiplyFcn の両方が空 ([]) でなければなりません。

 
HessianFcn

[] (既定の設定) の場合、fmincon は有限差分を使用してヘッシアンを近似するか、指定された HessianMultiplyFcn を使用します。関数ハンドルの場合、fminconHessianFcn を使用してヘッシアンを計算します。詳細は、入力としてのヘッシアンを参照してください。

 
HessianMultiplyFcn

ヘッシアンとベクトルの乗算を計算するためにユーザーが提供した関数を処理します (ヘッセ乗算関数 を参照してください)。

    メモ:   HessianMultiplyFcn オプションを使用するには、HessianFcn[] に、SubproblemAlgorithm'cg' に設定しなければなりません。

 
HonorBounds

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

 
InitBarrierParam

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

 
InitTrustRegionRadius

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

 
MaxProjCGIter

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

 
ObjectiveLimit

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

 
ScaleProblem

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

 
SubproblemAlgorithm

反復ステップの計算方法を定義します。'cg' は密なヘッシアンをもつ大規模な問題より高速に解ける可能性がありますが、既定の 'factorization' は一般に 'cg' (共役勾配) より高速になります。詳細は、「fmincon の内点法アルゴリズム」を参照してください。

 
TolProjCG

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

 
TolProjCGAbs

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

 
SQP アルゴリズム 
ObjectiveLimit

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

 
ScaleProblem

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

 

例: options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true)

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

フィールド名エントリ

objective

目的関数

x0

x の初期点

Aineq

線形不等式制約の行列

bineq

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

Aeq

線形等式制約の行列

beq

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

nonlcon

非線形制約関数

solver

'fmincon'

options

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

problem 構造体では、少なくとも objectivex0solver、および options フィールドを指定しなければなりません。

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

データ型: struct

出力引数

すべて折りたたむ

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

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

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

すべてのアルゴリズム:

1

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

0

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

-1

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

-2

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

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

2

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

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

3

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

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

4

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

5

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

interior-pointsqp アルゴリズム:

-3

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

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

iterations

実行した反復回数

funcCount

関数評価の回数

lssteplength

探索方向に対するライン探索ステップ サイズ (active-set アルゴリズムおよび sqp アルゴリズムのみ)

constrviolation

制約関数の最大値

stepsize

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

algorithm

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

cgiterations

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

firstorderopt

1 次の最適性の尺度

message

終了メッセージ

解におけるラグランジュ乗数。次のフィールドをもつ構造体として返されます。

lower

lb に対応する下限

upper

ub に対応する上限

ineqlin

A および b に対応する線形不等式

eqlin

Aeq および beq に対応する線形等式

ineqnonlin

nonlconc に対応する非線形不等式

eqnonlin

nonlconceq に対応する非線形等式

解での勾配。実数ベクトルとして返されます。grad は、点 x(:) における fun の勾配を返します。

ヘッシアンの近似。実数行列として返されます。hessian の意味については、ヘッシアン を参照してください。

制限

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

  • 'trust-region-reflective' アルゴリズムの場合、fun に勾配を与え、'SpecifyObjectiveGradient' オプションを true に設定しなければなりません。

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

    Equal upper and lower bounds not permitted in trust-region-reflective algorithm. Use
    either interior-point or SQP algorithms instead.
  • ヘッシアンを渡す構文には 2 種類あります。また、関数 HessianMultiplyFcn を渡す構文も 2 種類あります。一方は trust-region-reflective であり、他方は interior-point に対するものです。詳細は、ヘッシアンを含めるを参照してください。

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

    • interior-point の場合、ラグランジュ関数のヘッシアンはラグランジュ乗数と非線形制約関数のヘッシアンを伴うものとなります。現在の点 x とラグランジュ乗数構造体 lambda の両方を考慮に入れた別の関数としてヘッシアンを渡すことができます。

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

詳細

すべて折りたたむ

入力としてのヘッシアン

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

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).(14-1)

ヘッシアンを trust-region-reflective アルゴリズムまたは interior-point アルゴリズムに指定する方法の詳細については、ヘッシアンを含めるを参照してください。

active-set アルゴリズムと sqp アルゴリズムは入力ヘッシアンを受け入れません。これらのアルゴリズムは、ラグランジュ関数のヘッシアンに対して準ニュートン近似を計算します。

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

  • 'bfgs'fmincon が密な準ニュートン近似によってヘッシアンを計算します。これは既定のヘッセ近似です。

  • 'lbfgs'fmincon が制限されたメモリの大規模の準ニュートン近似によってヘッシアンを計算します。既定のメモリでは 10 回の反復が使用されます。

  • {'lbfgs',positive integer}fmincon が制限されたメモリの大規模の準ニュートン近似によってヘッシアンを計算します。正の整数は前回の反復がいくつまで記憶されているかを指定します。

  • 'finite-difference'fmincon は勾配の有限差分によるヘッシアンとベクトルとの乗算を計算します。目的関数の勾配を与える必要があります。また非線形制約関数がある場合は、その勾配も与えなければなりません。'SpecifyObjectiveGradient' オプションを true に設定し、可能な場合は 'SpecifyConstraintGradient' オプションを true に設定します。'SubproblemAlgorithm''cg' に設定しなければなりません。

ヘッセ乗算関数

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

アルゴリズム

内点法の最適化

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

SQP 最適化

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

有効制約法の最適化

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

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

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

信頼領域 Reflective 法の最適化

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

参照

[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, 2000, pp. 149–185.

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

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

[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, 1994, pp. 189–224.

[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.” Journal of Optimization Theory and Applications, Vol. 22, 1977, pp. 297.

[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, 2006, pp. 391–408.

R2006a より前に導入

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