Main Content

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) は、x0 から始まり、線形不等式 A*x ≤ b を制約として、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 を設定してください。

メモ

問題の指定された入力範囲が矛盾する場合、fmincon はエラーをスローします。この場合、出力 xx0 で、fval[] です。

既定の 'interior-point' アルゴリズムの場合、fmincon は、範囲 lb ≤ x ≤ ub に違反する、または範囲に等しい x0 の成分を範囲領域内に設定します。'trust-region-reflective' アルゴリズムの場合、fmincon は違反する成分を範囲領域内に設定します。他のアルゴリズムの場合、fmincon は違反する成分を最も近い範囲に設定します。範囲内の要素は変更されません。詳細については、反復は制約に違反する可能性ありを参照してください。

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 の最小値を求めます。

[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)1 を満たすように制約された最小値を求めます。形式 Ax <= b のこの制約を A = [1,2] および b = 1 で表します。この制約は、解が制約なしの解 (1,1) にならないことを意味するので注意してください。この点では x(1)+2x(2)=3>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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

    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)1 および 2x(1)+x(2)=1 を満たすように制約された最小値を求めます。

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

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

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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

    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 = [];

領域中央の初期点を試します。

x0 = (lb + ub)/2;

問題を解きます。

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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

    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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2
10-6 ×

    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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.


x =

    0.5000    0.2500

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

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

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

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

type unitdisk.m
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)
 Iter  Func-count            Fval   Feasibility   Step Length       Norm of   First-order  
                                                                       step    optimality
    0           3    1.000000e+00     0.000e+00     1.000e+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.172e+00  
    4          31    2.733703e-01     0.000e+00     1.000e+00     5.254e-02     5.705e-01  
    5          34    2.397111e-01     0.000e+00     1.000e+00     7.498e-02     3.164e+00  
    6          37    2.036002e-01     0.000e+00     1.000e+00     5.960e-02     3.106e+00  
    7          40    1.164353e-01     0.000e+00     1.000e+00     1.459e-01     1.059e+00  
    8          43    1.161753e-01     0.000e+00     1.000e+00     1.754e-01     7.383e+00  
    9          46    5.901602e-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.386e-12     1.000e+00     2.095e-06     1.502e-05  
   13          58    4.567481e-02     0.000e+00     1.000e+00     2.193e-12     1.406e-05  

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    0.7864    0.6177

反復表示の詳細については、反復表示を参照してください。

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

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

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

ここで勾配は

$$\nabla f(x) = \left[ {\begin{array}{*{20}{c}}&#10;{ - 400\left( {{x_2} - x_1^2} \right){x_1} - 2\left( {1 - {x_1}} \right)}\\&#10;{200\left( {{x_2} - x_1^2} \right)}&#10;\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 value of the optimality tolerance,
and constraints are satisfied to within the 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];

非線形制約関数 unitdisk は、この例の終わりに掲載しています。非線形制約関数を problem に含めます。

problem.nonlcon = @unitdisk;

問題を解きます。

x = fmincon(problem)
 Iter  Func-count            Fval   Feasibility   Step Length       Norm of   First-order  
                                                                       step    optimality
    0           3    1.000000e+00     0.000e+00     1.000e+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.172e+00  
    4          31    2.733703e-01     0.000e+00     1.000e+00     5.254e-02     5.705e-01  
    5          34    2.397111e-01     0.000e+00     1.000e+00     7.498e-02     3.164e+00  
    6          37    2.036002e-01     0.000e+00     1.000e+00     5.960e-02     3.106e+00  
    7          40    1.164353e-01     0.000e+00     1.000e+00     1.459e-01     1.059e+00  
    8          43    1.161753e-01     0.000e+00     1.000e+00     1.754e-01     7.383e+00  
    9          46    5.901602e-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.386e-12     1.000e+00     2.095e-06     1.502e-05  
   13          58    4.567481e-02     0.000e+00     1.000e+00     2.193e-12     1.406e-05  

Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
x = 1×2

    0.7864    0.6177

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

次のコードは関数 unitdisk を作成します。

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

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 = (lb + ub)/2;
[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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x = 1×2

    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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
x2 = 1×2
10-6 ×

    0.4000    0.4000

fval2 = 1.0000

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

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

Rosenbrock 関数を単位円板 $||x||^2 \le 1$ 上で最小化する問題を設定します。まず、非線形制約を表す関数を作成します。これを 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];

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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.


x =

    0.7864    0.6177


fval =

    0.0457


exitflag =

     1


output = 

  struct with fields:

         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....'
       bestfeasible: [1x1 struct]

  • 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 value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.


x =

    0.7864    0.6177


fval =

    0.0457


exitflag =

     1


output = 

  struct with fields:

         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....'
       bestfeasible: [1x1 struct]


lambda = 

  struct with fields:

         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.2903 -314.5589
 -314.5589  200.2392

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

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

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

入力引数

すべて折りたたむ

最小化する関数。関数ハンドルまたは関数名として指定されます。fun は、ベクトルまたは配列 x を受け、x で評価される目的関数の実数スカラー f を返す関数です。

fmincon は、目的関数および任意の非線形制約関数に x0 引数の形式で x を渡します。たとえば、x0 が 5 行 3 列の配列の場合、fmincon は 5 行 3 列の配列として xfun に渡します。ただし、fmincon は、x を列ベクトル x(:) に変換してから、線形制約行列 A または Aeqx と乗算します。

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 | string

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

  • 'interior-point' アルゴリズム — HonorBounds オプションが true (既定) の場合 、fmincon は範囲 lb または ub の境界上または範囲外の x0 成分を、厳密に範囲内に収まる値にリセットします。

  • 'trust-region-reflective' アルゴリズム — fmincon は実行不可能な x0 成分を範囲または線形等式に関して実行可能となるようにリセットします。

  • 'sqp''sqp-legacy'、または 'active-set' アルゴリズム — fmincon は、範囲外の x0 成分を、対応する範囲内の値にリセットします。

例: 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(:) の列ベクトル、AeqMeN 列の行列です。

たとえば、次の等式を考えてみましょう。

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))

lb の要素数が x0 より少ない場合、ソルバーは警告を生成します。

例: 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))

ub の要素数が x0 より少ない場合、ソルバーは警告を生成します。

例: 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 | string

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

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

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

すべてのアルゴリズム
Algorithm

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

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

  • 'trust-region-reflective'

  • 'sqp'

  • 'sqp-legacy' (optimoptions のみ)

  • 'active-set'

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

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

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

  • SpecifyObjectiveGradient を次の値に設定。 true

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

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

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

CheckGradients

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

optimset の場合、名前は DerivativeCheck で、値は 'on' または 'off' です。詳細については、新旧のオプション名を参照してください。

CheckGradients オプションは将来のリリースで削除される予定です。導関数を確認するには、関数 checkGradients を使用します。

ConstraintTolerance

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

optimset の場合、名前は TolCon です。詳細については、新旧のオプション名を参照してください。

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

optimset の場合、名前は FinDiffRelStep です。詳細については、新旧のオプション名を参照してください。

FiniteDifferenceType

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

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

optimset の場合、名前は FinDiffType です。詳細については、新旧のオプション名を参照してください。

FunValCheck

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

MaxFunctionEvaluations

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

optimset の場合、名前は MaxFunEvals です。詳細については、新旧のオプション名を参照してください。

MaxIterations

反復の最大許容回数 (非負の整数)。interior-point 以外のすべてのアルゴリズムの既定値は 400 です。interior-point アルゴリズムの既定値は 1000 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

optimset の場合、名前は MaxIter です。詳細については、新旧のオプション名を参照してください。

OptimalityTolerance

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

optimset の場合、名前は TolFun です。詳細については、新旧のオプション名を参照してください。

OutputFcn

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

PlotFcn

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

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

  • 'optimplotfunccount' — 関数カウントをプロット

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

  • 'optimplotfvalconstr' — ライン プロットとして検出された実行可能な最良の目的関数値をプロット。このプロットでは、実行可能性の許容誤差を 1e-6 として、実行不可能点をある色で、実行可能点を別の色で示します。

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

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

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

カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数出力関数とプロット関数の構文を参照してください。

optimset の場合、名前は PlotFcns です。詳細については、新旧のオプション名を参照してください。

SpecifyConstraintGradient

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

optimset の場合、名前は GradConstr で、値は 'on' または 'off' です。詳細については、新旧のオプション名を参照してください。

SpecifyObjectiveGradient

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

optimset の場合、名前は GradObj で、値は 'on' または 'off' です。詳細については、新旧のオプション名を参照してください。

StepTolerance

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

optimset の場合、名前は TolX です。詳細については、新旧のオプション名を参照してください。

TypicalX

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

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

UseParallel

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

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

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

optimset の場合、名前は TolFun です。詳細については、新旧のオプション名を参照してください。

HessianFcn

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

optimset の場合、名前は HessFcn です。詳細については、新旧のオプション名を参照してください。

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' (既定の設定) に設定しなければなりません。

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

optimset の場合、名前は HessMult です。詳細については、新旧のオプション名を参照してください。

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)) で、等式制約付き問題の場合は numberOfVariables です。詳細については、前処理付き共役勾配法を参照してください。

PrecondBandWidth

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

SubproblemAlgorithm

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

optimset の場合、既定以外の値を設定できません。'factorization' を使用するには、optimoptions を使用してオプションを設定します。

TolPCG

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

有効制約法アルゴリズム
FunctionTolerance

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

optimset の場合、名前は TolFun です。詳細については、新旧のオプション名を参照してください。

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

内点法アルゴリズム
BarrierParamUpdate

fmincon による範囲パラメーターの更新方法を指定します (fmincon の内点法アルゴリズムを参照)。以下のオプションがあります。

  • 'monotone' (既定の設定)

  • 'predictor-corrector'

このオプションは、ソルバーの速度と収束性に影響が及びますが、その影響の予測は困難です。

EnableFeasibilityMode

true の場合、fmincon は、実行可能性を実現するために別のアルゴリズムを使用します。この設定は、fmincon が実行可能解に到達するのに役立つ場合があります。既定値は false です。

実行可能性モードは通常、SubproblemAlgorithm'cg' の場合にパフォーマンスが向上します。詳細については、実行可能性モードを参照してください。例については、実行可能性モードを使用した解の取得を参照してください。

HessianApproximation

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

  • 'bfgs' (既定の設定)

  • 'finite-difference'

  • 'lbfgs'

  • {'lbfgs',Positive Integer}

メモ

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

optimset の場合、名前は Hessian で、値は 'user-supplied''bfgs''lbfgs''fin-diff-grads''on'、または 'off' です。詳細については、新旧のオプション名を参照してください。

HessianFcn

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

optimset の場合、名前は HessFcn です。詳細については、新旧のオプション名を参照してください。

HessianMultiplyFcn

ヘッシアンとベクトルの積を計算するためにユーザーが提供した関数 (ヘッセ乗算関数を参照)。関数ハンドルを渡します。

メモ:

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

optimset の場合、名前は HessMult です。詳細については、新旧のオプション名を参照してください。

HonorBounds

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

optimset の場合、名前は AlwaysHonorConstraints で、値は 'bounds' または 'none' です。詳細については、新旧のオプション名を参照してください。

InitBarrierParam

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

InitTrustRegionRadius

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

MaxProjCGIter

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

ObjectiveLimit

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

ScaleProblem

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

optimset の場合、値は 'obj-and-constr' または 'none' です。詳細については、新旧のオプション名を参照してください。

SubproblemAlgorithm

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

optimset の場合、値は 'cg' および 'ldl-factorization' です。詳細については、新旧のオプション名を参照してください。

TolProjCG

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

TolProjCGAbs

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

SQP および SQP レガシ アルゴリズム
ObjectiveLimit

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

ScaleProblem

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

optimset の場合、値は 'obj-and-constr' または 'none' です。詳細については、新旧のオプション名を参照してください。

単精度コード生成
Algorithm

'sqp' または 'sqp-legacy' でなければなりません。

ConstraintTolerance

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

FiniteDifferenceStepSize

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

delta = v.*sign′(x).*max(abs(x),TypicalX);(1)
ここで、sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分は次のようになります。
delta = v.*max(abs(x),TypicalX);(2)
スカラー FiniteDifferenceStepSize はベクトルに展開されます。既定値は、前進有限差分では sqrt(eps('single'))、中心有限差分では eps('single')^(1/3) です。

FiniteDifferenceType

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

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

MaxFunctionEvaluations

関数評価の最大許容回数 (非負の整数)。既定値は 100*numberOfVariables です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

MaxIterations

反復の最大許容回数 (非負の整数)。既定値は 400 です。詳細については、許容誤差と停止条件反復と関数カウントを参照してください。

ObjectiveLimit

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

OptimalityTolerance

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

ScaleProblem

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

SpecifyConstraintGradient

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

SpecifyObjectiveGradient

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

StepTolerance

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

TypicalX

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

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

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

フィールド名エントリ

objective

目的関数

x0

x の初期点

Aineq

線形不等式制約の行列

bineq

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

Aeq

線形等式制約の行列

beq

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

nonlcon

非線形制約関数

solver

'fmincon'

options

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

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

データ型: struct

出力引数

すべて折りたたむ

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

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

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

すべてのアルゴリズム:

1

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

0

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

-1

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

-2

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

active-set 以外のすべてのアルゴリズム:

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-legacy および sqp アルゴリズム:

-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 次の最適性の尺度

bestfeasible

検出された最適 (最小目的関数) 実行可能点。次のフィールドで構成される構造体:

  • x

  • fval

  • firstorderopt

  • constrviolation

実行可能点が見つからなかった場合は、bestfeasible フィールドが空になります。そのため、制約関数の最大値が options.ConstraintTolerance を超えなければ、点は実行可能になります。

bestfeasible の点は、さまざまな理由で、返された解の点 x とは異なる可能性があります。例については、最良実行可能点の取得を参照してください。

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 次導関数の行列です (式 1 を参照)。

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).(3)

ヘッシアンを 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 アルゴリズムを参照してください。アルゴリズムを設定するには、optimoptions を使用して options を作成し、名前と値のペア 'Algorithm' を使用します。

このセクションの後半では、各アルゴリズムの概要を説明するか、詳細へのポインターを示します。

内点法の最適化

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

SQP および SQP レガシ最適化

fmincon 'sqp' および 'sqp-legacy' アルゴリズムは、有効制約法の最適化に記述されている '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 法アルゴリズム にある信頼領域法および前処理付き共役勾配法の説明を参照してください。

代替機能

アプリ

[最適化] ライブ エディター タスクが fmincon にビジュアル インターフェイスを提供します。

参照

[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 より前に導入

すべて展開する