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,Aeq,beq,lb,ub)lb ≤ x ≤ ub の範囲に存在するように、設計変数 x に上限と下限を定義します。等式が存在しない場合には Aeq = [] と beq = [] を設定してください。x(i) の下に非有界の場合は lb(i) = -Inf を設定してください。x(i) の上に非有界の場合は ub(i) = Inf を設定してください。
メモ
問題の指定された入力範囲が矛盾する場合、fmincon はエラーをスローします。この場合、出力 x は x0 で、fval は [] です。
既定の 'interior-point' アルゴリズムの場合、fmincon は、範囲 lb ≤ x ≤ ub に違反する、または範囲に等しい x0 の成分を範囲領域内に設定します。'trust-region-reflective' アルゴリズムの場合、fmincon は違反する成分を範囲領域内に設定します。他のアルゴリズムの場合、fmincon は違反する成分を最も近い範囲に設定します。範囲内の要素は変更されません。反復は制約に違反する可能性ありを参照してください。
例
線形不等式制約がある場合の Rosenbrock 関数の最小値を求めます。
目的関数 fun が Rosenbrock 関数になるように設定します。Rosenbrock 関数は、最小化が難しいことがよく知られています。これは点 (1,1) で目的関数の最小値 0 になります。詳細については、[最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題を参照してください。
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
点 [-1,2] から開始して、 を満たすように制約された最小値を求めます。形式 Ax <= b のこの制約を A = [1,2] および b = 1 で表します。この制約は、解が制約なしの解 (1,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. <stopping criteria details>
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] から開始して、 および を満たすように制約された最小値を求めます。
形式
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. <stopping criteria details>
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));
が正の値 および である領域内を探索します。
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. <stopping criteria details>
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. <stopping criteria details>
x = 1×2
10-6 ×
0.4000 0.4000
どの解が優れているかを判断するには、目的関数値の取得を参照してください。
非線形制約付きの関数の最小値を求めます。
Rosenbrock 関数が円内で最小化される点を範囲制約付きで求めます。
fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
領域 、 内を探索します。
lb = [0,0.2]; ub = [0.5,0.8];
[1/3,1/3] を中心とした半径 1/3 の円内も探索します。次のコードを非線形制約関数に使用します。
function [c,ceq] = circlecon(x) c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1/3)^2; ceq = []; end
線形制約がないため、これらの引数を [] に設定します。
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. <stopping criteria details>
x = 1×2
0.5000 0.2500
反復の発生時に反復を表示し、異なるアルゴリズムを使用するようにオプションを設定します。
fmincon 解法プロセスを確認するには、Display オプションを 'iter' に設定します。また、'sqp' アルゴリズムを試します。このアルゴリズムは、既定の 'interior-point' アルゴリズムより速いか正確である場合があります。
options = optimoptions('fmincon','Display','iter','Algorithm','sqp');
単位円板 上の Rosenbrock 関数の最小値を求めます。まず、非線形制約を表す関数を作成します。これを unitdisk.m という名前のファイルとして MATLAB® パス上に保存します。
type unitdisk.mfunction [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.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.159e-09 1.511e-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.
<stopping criteria details>
x = 1×2
0.7864 0.6177
反復表示の詳細については、反復表示を参照してください。
目的関数に勾配評価を含めて計算の速度や信頼性を高めます。
目的関数ファイルに条件付きの出力として勾配評価を含めます。詳細については、勾配とヘッシアンを含めるを参照してください。この目的関数は Rosenbrock 関数になります。
ここで勾配は
次のコードは rosenbrockwithgrad 関数を作成します。この関数は、勾配のある目的関数を実装します。
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 end
目的関数の勾配を使用するオプションを作成します。
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. <stopping criteria details>
x = 1×2
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.
<stopping criteria details>
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. <stopping criteria details>
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. <stopping criteria details>
x2 = 1×2
10-6 ×
0.4000 0.4000
fval2 = 1.0000
この解は、目的関数値 fval2 = 1 をもちます。この値は、最初の値である fval = –0.6667 より大きくなります。最初の解 x では、目的関数の局所的最小値はより小さくなります。
解の質を簡単に検証するには、exitflag 出力および output 出力を要求します。
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];
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.↵↵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.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 2.437331e-08,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.'
bestfeasible: [1×1 struct]
exitflag値1は、解が局所的最小値であることを示します。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.↵↵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.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 2.437331e-08,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.'
bestfeasible: [1×1 struct]
lambda =
struct with fields:
eqlin: [0×1 double]
eqnonlin: [0×1 double]
ineqlin: [0×1 double]
lower: [2×1 double]
upper: [2×1 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 列の配列として x を fun に渡します。ただし、fmincon は、x を列ベクトル x(:) に変換してから、線形制約行列 A または Aeq を x と乗算します。
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
データ型: double
実数行列として指定される線形不等式制約です。A は M 行 N 列の行列で、M は不等式の数、N は変数の数 (x0 の要素数) です。スパース データをサポートするアルゴリズムを使用する大規模な問題の場合は、A をスパース行列として渡します。最適化アルゴリズムのスパース性を参照してください。
A は M 個の線形不等式を符号化します。
A*x <= b,
ここで、x は N 個の変数 x(:) の列ベクトル、b は M 個の要素をもつ列ベクトルです。
たとえば、次の不等式を考えてみましょう。
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 を使用します。
データ型: single | double
実数ベクトルで指定される線形不等式制約です。b は、行列 A に関連する M 要素ベクトルです。b を行ベクトルとして渡す場合、ソルバーは b を列ベクトル b(:) に内部的に変換します。
b は M 個の線形不等式を符号化します。
A*x <= b,
ここで、x は N 個の変数 x(:) の列ベクトル、A は M 行 N 列の行列です。
たとえば、次の不等式を考えてみましょう。
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 を使用します。
データ型: single | double
実数行列として指定される線形等式制約です。Aeq は Me 行 N 列の行列で、Me は等式の数、N は変数の数 (x0 の要素数) です。スパース データをサポートするアルゴリズムを使用する大規模な問題の場合は、A をスパース行列として渡します。最適化アルゴリズムのスパース性を参照してください。
Aeq は Me 個の線形等式を符号化します。
Aeq*x = beq,
ここで、x は N 個の変数 x(:) の列ベクトル、beq は Me 個の要素をもつ列ベクトルです。
たとえば、次の不等式を考えてみましょう。
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 を使用します。
データ型: single | double
実数ベクトルで指定される線形等式制約です。beq は、行列 Aeq に関連する Me 要素ベクトルです。beq を行ベクトルとして渡す場合、ソルバーは beq を列ベクトル beq(:) に内部的に変換します。
beq は Me 個の線形等式を符号化します。
Aeq*x = beq,
ここで、x は N 個の変数 x(:) の列ベクトル、Aeq は Me 行 N 列の行列です。
たとえば、次の等式を考えてみましょう。
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 を使用します。
データ型: single | 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)) を使用します。
データ型: single | 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)) を使用します。
データ型: single | 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 を返さなければなりません。GC と GCeq はスパースか密である可能性があります。GC か GCeq が大きく、比較的非零の項目が少ない場合は、それらをスパース行列として使用して、interior-point アルゴリズム内の実行時間とメモリを節約します。詳細については、非線形制約を参照してください。メモ
SpecifyConstraintGradient の true への設定は SpecifyObjectiveGradient が true に設定されている場合のみ効果的です。内部的に目的関数が制約に含まれるため、ソルバーは、勾配推定を避けるために両方の勾配 (目的関数と制約) が指定されていることを必要とします。
メモ:
Optimization Toolbox™ の関数が double 型の入力のみを受け入れるため、ユーザーが指定した目的関数と非線形制約関数は double 型の出力を返さなければなりません。
データ型: char | function_handle | string
最適化オプション。optimoptions の出力、または optimset などによって返される構造体として指定されます。
いくつかのオプションはすべてのアルゴリズムに適用することができ、その他のオプションは特定のアルゴリズムに関連します。詳細については、最適化オプション リファレンスを参照してください。
一部のオプションは、optimoptions に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細については、最適化オプションの表示を参照してください。
| すべてのアルゴリズム | |||||
Algorithm | 最適化アルゴリズムを選択します。
アルゴリズムの選択の詳細については、アルゴリズムの選択を参照してください。
| ||||
| CheckGradients | ユーザー設定の導関数 (目的関数または制約の勾配) と有限差分による導関数とを比較します。選択肢は、
| ||||
ConstraintTolerance | 制約違反に関する許容誤差 (非負のスカラー)。既定値は
| ||||
| Diagnostics | 最小化または計算する関数に関する情報を表示します。選択肢は、 | ||||
| DiffMaxChange | 有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は | ||||
| DiffMinChange | 有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は | ||||
Display | 表示レベル (反復表示を参照):
| ||||
FiniteDifferenceStepSize | 有限差分のスカラーまたはベクトルのステップ サイズ ファクター。
sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分は次のようになります。
FiniteDifferenceStepSize はベクトルに展開されます。既定値は、前進有限差分法では sqrt(eps)、中心有限差分法では eps^(1/3) です。
| ||||
FiniteDifferenceType | 勾配推定に使用される有限差分は
| ||||
| FunValCheck | 目的関数値が正しいかどうかチェックします。既定の設定 | ||||
MaxFunctionEvaluations | 関数評価の最大許容回数 (非負の整数)。
| ||||
MaxIterations | 反復の最大許容回数 (非負の整数)。
| ||||
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は
| ||||
OutputFcn | 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ( | ||||
PlotFcn | アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。組み込みプロット関数名、関数ハンドル、または組み込みプロット関数名か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし (
カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数および出力関数とプロット関数の構文を参照してください。
| ||||
SpecifyConstraintGradient | ユーザーにより定義される非線形制約関数に対する勾配。既定の
| ||||
SpecifyObjectiveGradient | ユーザーが定義する目的関数の勾配。
| ||||
StepTolerance |
| ||||
TypicalX | 典型的な
| ||||
UseParallel |
| ||||
| 信頼領域 Reflective 法アルゴリズム | |||||
FunctionTolerance | 関数値に関する終了許容誤差 (非負のスカラー)。既定値は
| ||||
HessianFcn |
| ||||
HessianMultiplyFcn | ヘッセ乗算関数。関数ハンドルとして指定されます。大規模構造問題に対して、この関数は実際に W = hmfun(Hinfo,Y) ここで 最初の引数は目的関数 [f,g,Hinfo] = fun(x)
メモ:
ヘッセ乗算関数を参照してください。例については、密に構造化されたヘッシアンと線形等式を使用した最小化 を参照してください。
| ||||
| HessPattern | 有限差分に対するヘッシアンのスパース パターン。∂2
構造が不明であれば、 | ||||
| MaxPCGIter | 前処理付き共役勾配法 (PCG) の反復の最大回数 (正のスカラー)。既定は、範囲制約付き問題の場合は | ||||
| PrecondBandWidth | PCG に対する前提条件子の帯域幅の上限 (非負の整数)。既定では、対角型の前提条件を使用します (帯域幅の上限 0)。一部の問題では、帯域幅を上げることで、PCG 法の反復回数を減らします。 | ||||
SubproblemAlgorithm | 反復ステップの計算方法を定義します。既定の設定である
| ||||
| TolPCG | PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は | ||||
| 有効制約法アルゴリズム | |||||
FunctionTolerance | 関数値に関する終了許容誤差 (非負のスカラー)。既定値は
| ||||
| MaxSQPIter | SQP 反復の最大数 (正の整数)。既定値は | ||||
| RelLineSrchBnd | 直線探索ステップ長の相対範囲 (非負の実数スカラー値)。x の合計変位は、|Δx(i)| ≤ relLineSrchBnd· max(|x(i)|,|typicalx(i)|) を満たします。このオプションはソルバーが大きすぎるステップをとった場合に、x の変位の大きさをコントロールします。既定の設定は範囲なし | ||||
| RelLineSrchBndDuration |
| ||||
| TolConSQP | 内部反復 SQP 制約違反に関する終了許容誤差 (正のスカラー)。既定値は | ||||
| 内点法アルゴリズム | |||||
BarrierParamUpdate |
このオプションは、ソルバーの速度と収束性に影響が及びますが、その影響の予測は困難です。 | ||||
EnableFeasibilityMode |
実行可能性モードは通常、 | ||||
HessianApproximation | どのように
メモ
| ||||
HessianFcn |
| ||||
HessianMultiplyFcn | ヘッシアンとベクトルの積を計算するためにユーザーが提供した関数 (ヘッセ乗算関数を参照)。関数ハンドルを渡します。 メモ:
| ||||
HonorBounds | 既定の
| ||||
| InitBarrierParam | 初期境界値 (正のスカラー)。既定の | ||||
| InitTrustRegionRadius | 信頼領域の初期半径です (正のスカラー)。適切にスケール化されていない問題では既定の より小さな値を選択すると役立つ場合があります。ここで n は変数の数です。 | ||||
| MaxProjCGIter | 計画された共役勾配の反復回数の許容誤差 (停止条件) です。これは内部反復であり、アルゴリズムの反復数ではありません。この正の整数は | ||||
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。目的関数値が | ||||
ScaleProblem |
| ||||
SubproblemAlgorithm | 反復ステップの計算方法を定義します。
| ||||
| TolProjCG | 計画された共役勾配アルゴリズムの相対許容誤差 (停止条件) です。これは内部の反復に対してであり、アルゴリズムの反復に対してではありません。この正のスカラーは | ||||
| TolProjCGAbs | 計画された共役勾配アルゴリズムの絶対許容誤差 (停止条件) です。これは内部の反復に対してであり、アルゴリズムの反復に対してではありません。この正のスカラーは | ||||
| SQP および SQP レガシ アルゴリズム | |||||
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。目的関数値が | ||||
ScaleProblem |
| ||||
UseCodegenSolver | ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。 | ||||
| 単精度コード生成 | |||||
Algorithm |
| ||||
ConstraintTolerance | 制約違反に関する許容誤差 (非負のスカラー)。既定値は | ||||
FiniteDifferenceStepSize | 有限差分のスカラーまたはベクトルのステップ サイズ ファクター。
sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分は次のようになります。
FiniteDifferenceStepSize はベクトルに展開されます。既定値は、前進有限差分法では sqrt(eps('single'))、中心有限差分法では eps('single')^(1/3) です。 | ||||
FiniteDifferenceType | 勾配推定に使用される有限差分は
| ||||
MaxFunctionEvaluations | 関数評価の最大許容回数 (非負の整数)。既定値は | ||||
MaxIterations | 反復の最大許容回数 (非負の整数)。既定値は | ||||
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。目的関数値が | ||||
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (非負のスカラー)。既定値は | ||||
ScaleProblem |
| ||||
SpecifyConstraintGradient | ユーザーにより定義される非線形制約関数に対する勾配。既定の | ||||
SpecifyObjectiveGradient | ユーザーが定義する目的関数の勾配。 | ||||
StepTolerance |
| ||||
TypicalX | 典型的な | ||||
UseCodegenSolver | ターゲット ハードウェアで実行されているバージョンのソフトウェアを使用するための指定。 | ||||
例: options = optimoptions('fmincon','SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true)
次のフィールドをもつ構造体として指定される問題構造体です。
| フィールド名 | エントリ |
|---|---|
| 目的関数 |
| x の初期点 |
| 線形不等式制約の行列 |
| 線形不等式制約のベクトル |
| 線形等式制約の行列 |
| 線形等式制約のベクトル |
lb | 下限のベクトル |
ub | 上限のベクトル |
| 非線形制約関数 |
| 'fmincon' |
| optimoptions で作成されたオプション |
problem 構造体では、少なくとも objective、x0、solver、および options フィールドを指定しなければなりません。
データ型: struct
出力引数
実数ベクトルまたは実数配列として返される解です。x のサイズは、x0 のサイズと同じです。通常、exitflag が正の場合、x は問題に対する局所的な解になります。解の質の詳細については、ソルバーが成功する場合を参照してください。
解での目的関数値。実数として返されます。一般的に、fval = fun(x) になります。
fmincon の停止理由。整数として返されます。
すべてのアルゴリズム: | |
| 1 次の最適性の尺度が |
| 反復回数が |
| 出力関数またはプロット関数によって停止したことを示します。 |
| 実行可能な点が見つかりません。 |
| |
|
|
| |
| 目的関数の値の変更が |
| |
| 探索方向の大きさが 2* |
| 方向導関数の大きさが 2* |
| |
| 現在の反復の目的関数が |
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
iterations | 実行した反復回数 |
funcCount | 関数評価の回数 |
lssteplength | 探索方向に対する直線探索ステップ サイズ ( |
constrviolation | 制約関数の最大値 |
stepsize |
|
algorithm | 使用される最適化アルゴリズム |
cgiterations | PCG 法での合計反復回数 ( |
firstorderopt | 1 次の最適性の尺度 |
bestfeasible | 反復の終了時に検出された最適 (最小目的関数) 実行可能点。次のフィールドで構成される構造体:
実行可能点が見つからなかった場合は、
|
message | 終了メッセージ |
解での勾配。実数ベクトルとして返されます。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 を参照)。
| (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 から表示される可能性がある、より詳細な終了メッセージをリストしたものです。より詳細な終了メッセージでは、詳細な情報のリンクがメッセージの最初の文として提供されます。
その点が実行可能 (ConstraintTolerance 許容誤差内で制約を満たす) で、1 次の最適性の尺度がOptimalityTolerance許容誤差より小さいため、局所的最小値と思われる点がソルバーで見つかりました。
作業の進め方については、ソルバーが成功する場合を参照してください。
初期点は、その点が実行可能 (ConstraintTolerance 許容誤差内で制約を満たす) で、1 次の最適性の尺度がOptimalityTolerance許容誤差より小さいため、局所的最小値と思われます。
作業の進め方については、最終点が初期点と等しいを参照してください。
ソルバーが局所的最小値に到達した可能性がありますが、1 次の最適性の尺度がOptimalityTolerance 許容誤差より小さくないため、確実ではありません。制約は、ConstraintTolerance制約許容誤差内で満たされています。
作業の進め方については、局所的最小値の可能性を参照してください。
fmincon が収束した点では、ConstraintToleranceと呼ばれる制約の許容誤差内で満たされていない制約がありました。fmincon が停止した理由は、最後のステップが小さすぎたためです。相対ステップ サイズがStepTolerance許容誤差を下回った時点で反復は終了します。
作業の進め方については、実行不可能な点に収束を参照してください。
目的関数が要求された "許容誤差" に最小化される前に、反復または関数評価の回数が上限に達したため、ソルバーは停止しました。
作業の進め方については、過剰な反復または関数評価を参照してください。
fmincon が、最終点より低い目的関数値を持つ実行可能点を検出しました。これには、最終目的関数値に関連性がないケースで、最終点が実行不可能な場合が含まれます。実行可能とは、最大実行不可能性が ConstraintTolerance オプションを下回っていることを意味します。
最良実行可能点は、output 構造体の bestfeasible フィールド内にあります。例については、最良実行可能点の取得を参照してください。
次のいくつかの項目は、fmincon の終了メッセージに含まれる用語の定義を示したものです。
関数の "局所的" 最小値は、近傍の点の中ではその関数値が最小であっても、離れた点よりも大きい可能性があります。
"大域的" 最小値は、その関数値が他のすべての実行可能点よりも小さい点です。

ソルバーは局所的最小値を探索しようとします。結果は大域的最小値となる可能性があります。詳細については、大域的最適解と局所的最適解を参照してください。
許容誤差は、一般的に、それを超えた場合にソルバーの反復を停止するしきい値です。許容誤差の詳細については、許容誤差と停止条件を参照してください。
ConstraintTolerance と呼ばれる制約の許容誤差は、現在の点でのすべての制約関数の最大値です。
ConstraintTolerance は他の許容誤差とは別に処理されます。ConstraintTolerance の条件が満たされない場合 (すなわち制約関数の大きさが ConstraintTolerance を超えた場合) は、他の理由で中止されない限りソルバーは計算を続行しようとします。ソルバーが単純に計算を中止しないのは、続行することで ConstraintTolerance の条件が満たされるためです。
制約違反は、現在の点でのすべての制約関数の最大値です。これは、ConstraintTolerance と呼ばれる許容誤差に対して測定されます。
ConstraintTolerance は他の許容誤差とは別に処理されます。ConstraintTolerance の条件が満たされない場合 (すなわち制約関数の大きさが ConstraintTolerance を超えた場合) は、他の理由で中止されない限りソルバーは計算を続行しようとします。ソルバーが単純に計算を中止しないのは、続行することで ConstraintTolerance の条件が満たされるためです。
実行可能な方向は、制約をローカルに満たす現在の点からのベクトルです。これらは、制約を満たす領域の内部を示すか、バインディング制約の境界に対する正接となります。
制約問題の 1 次の最適性の尺度は、次の 2 つの数量の最大値です。
制約なしの問題の場合に、勾配ベクトルの要素の最大絶対値 (無限大ノルムとも呼ばれる) となります。
これは最小化点ではゼロになります。
これらの方程式のすべての変数の定義など、詳細については1 次の最適性の尺度を参照してください。
OptimalityTolerance と呼ばれる許容誤差は 1 次の最適性の尺度に対応します。反復計算は、1 次の最適性の尺度が OptimalityTolerance 未満の場合に終了します。詳細については、1 次の最適性の尺度を参照してください。
目的関数での予測される変化とは、現在の点を探索方向に沿って移動した場合に、目的関数が減少することをソルバーが推定する量です。この推定される減少は、現在の点での目的関数の探索方向に沿った勾配とステップ長との内積です。Optimization Toolbox ソルバーは、制約付き非線形最適化アルゴリズム で説明されているように、さまざまなアルゴリズムを使用して探索方向を計算します。
出力関数 (またはプロット関数) は、ソルバーの反復ごとに 1 回評価されます。これは、ソルバーの進行の過程で多数の最適化量を報告できますが、ソルバーを停止する可能性もあります。
詳細については、Optimization Toolbox の出力関数またはプロット関数を参照してください。
MaxSQPIter は、ソルバーが実行する逐次二次計画法の部分問題の反復回数に関する許容誤差です。ソルバーが部分問題に対して MaxSQPIter 回の反復を実行すると、部分問題の反復は終了します。
詳細については、逐次二次計画法 (SQP)を参照してください。
x のすべての要素における相対的な変化は、正規化されたステップ ベクトルです。このベクトルは、現在の位置の無限大ノルムによって除算され、目的関数が評価された場所における変化です。この相対的ノルムの最大値がStepTolerance 許容誤差より小さくなると、反復は終了します。
現在のステップのサイズは、目的関数が評価された位置での変化のノルムです。この場合、fmincon は相対サイズである現在の位置の無限大ノルムによって除算されたステップのサイズを使用します。この相対ステップ サイズがStepTolerance 許容誤差を下回った時点で反復は終了します。
StepTolerance は、最後のステップのサイズの許容誤差、つまり、目的関数が評価された位置での変化のサイズを表します。

制約違反は、現在の点で条件が満たされていない制約関数です。これらの関数の勾配のノルムが小さすぎて、ソルバーが続行できませんでした。現在の点は実行可能ではありません (一部の制約違反がConstraintTolerance 許容誤差を超過しています)。
作業の進め方については、実行不可能な点に収束を参照してください。
探索方向は、ソルバーがそれに沿って改良点を探す現在の点からのベクトルです。この方向のノルムは、無限大ノルム、つまり、探索ベクトルの要素の最大絶対値です。
Optimization Toolbox ソルバーは、制約付き非線形最適化アルゴリズムで説明されているさまざまなアルゴリズムを使用して探究方向を計算します。
fmincon は、有限差分を取ることで目的関数と非線形制約関数の勾配を推定します。有限差分法の計算が、関数が適切に定義されている領域からステップ アウトしたため、Inf、NaN、または複雑な結果が返されています。
ソルバーが勾配を計算し使用する方法については、制約付き非線形最適化アルゴリズムを参照してください。作業の進め方については、6.勾配またはヤコビアンの指定を参照してください。
fmincon "interior-point" アルゴリズムは、特殊なアルゴリズムを使用して実行可能点を検索できます。optimoptions を使用して EnableFeasibilityMode オプションを true に設定し、この検索を有効にします。難しい問題について効率を上げる場合は、SubproblemAlgorithm オプションを "cg" に設定します。
options = optimoptions("fmincon",... Algorithm="interior-point",... EnableFeasibilityMode=true,... SubproblemAlgorithm="cg");
EnableFeasibilityMode アルゴリズムの詳細については、実行可能性モードを参照してください。
アルゴリズム
アルゴリズムの選択に関するヘルプについては、fmincon アルゴリズムを参照してください。アルゴリズムを設定するには、optimoptions を使用して options を作成し、名前と値のペア 'Algorithm' を使用します。
このセクションの後半では、各アルゴリズムの概要を説明するか、詳細へのポインターを示します。
このアルゴリズムは、fmincon の内点法アルゴリズム で説明します。この方法は [1]、[41]、および、[9] で詳しく説明します。
fmincon 'sqp' および 'sqp-legacy' アルゴリズムは、有効制約法の最適化に記述されている 'active-set' アルゴリズムと同様です。fmincon SQP アルゴリズムに主な相違点が示されています。相違点の概要は以下のとおりです。
fmincon は逐次二次計画法 (SQP) 法を使用します。この方法では、関数は各反復で二次計画法 (QP) の部分問題を解きます。fmincon は BFGS 式を使用して、ラグランジュ関数のヘッシアンの推定を反復ごとに更新します (fminunc および参考文献 [7]、[8] を参照)。
fmincon は、[6]、[7]、[8] で推奨されるものと同様なメリット関数を使用して直線探索を実行します。QP 部分問題を解くには、[5]での説明と同様の有効制約法を使用します。アルゴリズムの詳細については、fmincon アクティブ セット アルゴリズムを参照してください。
使用されるアルゴリズムの詳細については、SQP 法の実装を参照してください。
'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.
拡張機能
使用上の注意および制限:
fminconは、関数codegen(MATLAB Coder) または MATLAB Coder™ アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算または標準的な単精度浮動小数点計算をサポートしていなければなりません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
コードを生成する前に MATLAB でコードをテストするには、
UseCodegenSolverオプションをtrueに設定します。これにより、ソルバーがコード生成で作成されるものと同じコードを使用するようになります。生成用のコードはすべて、MATLAB コードでなければなりません。特に、カスタム ブラックボックス関数を
fminconの目的関数として使用することはできません。coder.cevalを使用して、C または C++ でコード化されたカスタム関数を評価することはできます。ただし、そのカスタム関数は MATLAB 関数内で呼び出さなければなりません。コード生成の場合、
fminconはproblem引数をサポートしていません。[x,fval] = fmincon(problem) % Not supportedstring や文字名ではなく、関数ハンドルを使用して、目的関数と非線形制約関数を指定しなければなりません。
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported % Not supported: fmincon('fun',...) or fmincon("fun",...)
fminconの入力行列 (A、Aeq、lb、ubなど) はすべて完全 (非スパース) でなければなりません。関数fullを使用することで、スパース行列を完全な行列に変換できます。lb引数とub引数は、x0引数と同じ数のエントリを持つか、空の[]でなければなりません。ターゲット ハードウェアが無限境界をサポートしていない場合は、
optim.coder.infboundを使用します。組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
fminconのオプションを含め、関数optimoptionsを使用して指定しなければなりません。オプションにはAlgorithmオプションを含め、'sqp'または'sqp-legacy'に設定しなければなりません。options = optimoptions("fmincon",Algorithm="sqp"); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
コード生成では次のオプションをサポートしています。
Algorithm—'sqp'または'sqp-legacy'でなければなりませんConstraintToleranceFiniteDifferenceStepSizeFiniteDifferenceTypeMaxFunctionEvaluationsMaxIterationsObjectiveLimitOptimalityToleranceScaleProblemSpecifyConstraintGradientSpecifyObjectiveGradientStepToleranceTypicalXUseCodegenSolver
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、
optimoptionsを使用することを推奨します。opts = optimoptions('fmincon','Algorithm','sqp'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。
通常、サポートされていないオプションを指定すると、コード生成の際にそのオプションは暗黙的に無視されます。ただし、ドット表記を使用してプロット関数や出力関数を指定すると、コード生成でエラーが発生することがあります。信頼性を確保するために、サポートされているオプションのみを指定してください。
出力関数とプロット関数はサポートされていないため、
fminconは終了フラグ –1 を返しません。fminconから生成されたコードでは、返されたoutput構造体内にbestfeasibleフィールドがありません。
例については、最適化のためのコード生成の基本を参照してください。
並列実行するには、'UseParallel' オプションを true に設定します。
options = optimoptions('solvername','UseParallel',true)
詳細については、Optimization Toolbox での並列計算の使用を参照してください。
バージョン履歴
R2006a より前に導入新しい UseCodegenSolver オプションを true に設定すると、fmincon は、コード生成で作成されるものと同じバージョンのソフトウェアを使用します。このオプションを使用すると、コードを生成する前またはコードをハードウェアに展開する前に、ソルバーの動作を確認できます。単精度コード生成をサポートするソルバーの場合は、生成されたコードでも単精度ハードウェアをサポートできます。コード生成時にこのオプションを含めることができます。このオプションはコード生成には影響しませんが、オプションを含めたままにしておくと、削除する手間が省けます。生成されるコードは MATLAB コードと同じですが、リンクされている数学ライブラリが異なる可能性があるため、結果は若干異なる場合があります。
単精度浮動小数点ハードウェアに対する fmincon のコードを生成できます。手順については、単精度コード生成を参照してください。
CheckGradients オプションは将来のリリースで削除される予定です。目的関数または非線形制約関数の 1 次導関数を確認するには、関数 checkGradients を使用します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)