Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

solve

最適化問題または方程式問題の求解

説明

solve を使用して、最適化問題または方程式問題の解を求めます。

ヒント

完全なワークフローについては、問題ベースの最適化ワークフローまたは方程式を解くための問題ベースのワークフローを参照してください。

sol = solve(prob) は、最適化問題または方程式問題 prob を解きます。

sol = solve(prob,x0) は、点または値のセット x0 から開始して prob を解きます。

sol = solve(prob,x0,ms) は、ms 複数開始点ソルバーを使用して prob を解きます。ms 引数を使用しない場合に得られる解より適切な解を検索するには、この構文を使用します。

sol = solve(___,Name,Value) は、前の構文の入力引数に加え、1 つ以上の名前と値のペア引数を使用して求解プロセスを変更します。

また、[sol,fval] = solve(___) は、前の構文の入力引数のいずれかを使用して、解における目的関数の値を返します。

[sol,fval,exitflag,output,lambda] = solve(___) は、終了条件を説明する終了フラグ、解法プロセスに関する追加情報を含む output 構造体、および非整数最適化問題の場合はラグランジュ乗数構造体も返します。

すべて折りたたむ

最適化問題によって定義された線形計画問題を解きます。

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Solving problem using linprog.

Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

MATLAB® に含まれる関数 peaks の、領域 x2+y24 での最小値を求めます。これを行うために、最適化変数の xy を作成します。

x = optimvar('x');
y = optimvar('y');

peaks を目的関数とする最適化問題を作成します。

prob = optimproblem("Objective",peaks(x,y));

制約を不等式として最適化変数に含めます。

prob.Constraints = x^2 + y^2 <= 4;

x の初期点を 1、y を –1 に設定し、問題を解きます。

x0.x = 1;
x0.y = -1;
sol = solve(prob,x0)
Solving problem using fmincon.

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.
sol = struct with fields:
    x: 0.2283
    y: -1.6255

fcn2optimexpr を必要とするサポートされていない関数

目的関数または非線形制約関数が初等関数で構成されていない場合は、fcn2optimexprを使用して、その関数を最適化式に変換しなければなりません。詳細は、非線形関数から最適化式への変換最適化変数および式でサポートされる演算を参照してください。

現在の例を変換するには:

convpeaks = fcn2optimexpr(@peaks,x,y);
prob.Objective = convpeaks;
sol2 = solve(prob,x0)
Solving problem using fmincon.

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.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

Copyright 2018–2020 The MathWorks, Inc.

初期実行可能点がある場合とない場合の両方について整数計画問題を解くためのステップ数を比較します。問題には 8 つの整数変数と 4 つの線形等式制約があり、すべての変数が正になるように制限されています。

prob = optimproblem;
x = optimvar('x',8,1,'LowerBound',0,'Type','integer');

4 つの線形等式制約を作成し、問題に含めます。

Aeq = [22    13    26    33    21     3    14    26
    39    16    22    28    26    30    23    24
    18    14    29    27    30    38    26    26
    41    26    28    36    18    38    16    26];
beq = [ 7872
       10466
       11322
       12058];
cons = Aeq*x == beq;
prob.Constraints.cons = cons;

目的関数を作成し、問題に含めます。

f = [2    10    13    17     7     5     7     3];
prob.Objective = f*x;

初期点を使用せずに問題を解き、表示を調べて分枝限定ノードの数を確認します。

[x1,fval1,exitflag1,output1] = solve(prob);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
   10000      0.41         0              -              -                                          
   18025      0.68         1   2.906000e+03   4.509804e+01                                          
   21857      0.86         2   2.073000e+03   2.270974e+01                                          
   23544      0.93         3   1.854000e+03   1.180593e+01                                          
   24097      0.96         3   1.854000e+03   1.617251e+00                                          
   24293      0.97         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the
optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon
variables are integer within tolerance, options.IntegerTolerance = 1e-05 (the
default value).

比較するため、初期実行可能点を使用して解を求めます。

x0.x = [8 62 23 103 53 84 46 34]';
[x2,fval2,exitflag2,output2] = solve(prob,x0);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      
                   Relative gap is 59.20%.                                                         

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
    3627      0.20         2   2.154000e+03   2.593968e+01                                          
    5844      0.30         3   1.854000e+03   1.180593e+01                                          
    6204      0.31         3   1.854000e+03   1.455526e+00                                          
    6400      0.32         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the
optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon
variables are integer within tolerance, options.IntegerTolerance = 1e-05 (the
default value).
fprintf('Without an initial point, solve took %d steps.\nWith an initial point, solve took %d steps.',output1.numnodes,output2.numnodes)
Without an initial point, solve took 24293 steps.
With an initial point, solve took 6400 steps.

初期点を与えることが常に問題を改善するとは限りません。この問題の場合、初期点を使用すると、時間と計算ステップが節減されます。ただし、問題によっては、初期点によって solve がより多くのステップを必要とする場合があります。

一部のソルバーでは、目的関数値と制約関数値がある場合、それらの値を x0 引数の solve に渡すことができます。これによってソルバーの時間を短縮できます。OptimizationValues オブジェクトのベクトルを渡します。関数 optimvalues を使用して、これらのベクトルを作成します。

目的関数値を使用できるソルバーは次のとおりです。

  • ga

  • gamultiobj

  • paretosearch

  • surrogateopt

非線形制約関数値を使用できるソルバーは次のとおりです。

  • paretosearch

  • surrogateopt

たとえば、初期点のグリッドからの値で開始し、surrogateopt を使用して関数 peaks を最小化します。変数 x に -10 ~ 10 のグリッドを作成し、変数 y に間隔 1/2 で –5/25/2 のグリッドを作成します。初期点での目的関数値を計算します。

x = optimvar("x",LowerBound=-10,UpperBound=10);
y = optimvar("y",LowerBound=-5/2,UpperBound=5/2);
prob = optimproblem("Objective",peaks(x,y));
xval = -10:10;
yval = (-5:5)/2;
[x0x,x0y] = meshgrid(xval,yval);
peaksvals = peaks(x0x,x0y);

optimvalues を使用して x0 引数の値を渡します。これにより、solve が値を計算する必要がなくなり、solve の時間が短縮されます。行ベクトルとして値を渡します。

x0 = optimvalues(prob,'x',x0x(:)','y',x0y(:)',...
    "Objective",peaksvals(:)');

surrogateopt と初期値を使用して、問題を解きます。

[sol,fval,eflag,output] = solve(prob,x0,Solver="surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: -6.55112 contains an object of type line. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 0.2283
    y: -1.6246

fval = -6.5511
eflag = 
    SolverLimitExceeded

output = struct with fields:
        elapsedtime: 30.4454
          funccount: 200
    constrviolation: 0
               ineq: [1x1 struct]
           rngstate: [1x1 struct]
            message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
             solver: 'surrogateopt'

[–1,2] から開始して、範囲 -5x,y5 で関数 peaks の局所的最小値を求めます。

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
x0.x = -1;
x0.y = 2;
prob = optimproblem(Objective=peaks(x,y));
opts = optimoptions("fmincon",Display="none");
[sol,fval] = solve(prob,x0,Options=opts)
sol = struct with fields:
    x: -3.3867
    y: 3.6341

fval = 1.1224e-07

GlobalSearch ソルバーを使用して、より良い解を求めようとします。このソルバーは fmincon を複数回実行しますが、それによってより良い解が得られる可能性があります。

ms = GlobalSearch;
[sol2,fval2] = solve(prob,x0,ms)
Solving problem using GlobalSearch.

GlobalSearch stopped because it analyzed all the trial points.

All 15 local solver runs converged with a positive local solver exit flag.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

fval2 = -6.5511

GlobalSearch は、より良い (小さい) 目的関数値をもつ解を求めます。終了メッセージは、ローカル ソルバーの fmincon が 15 回実行されていることを示しています。返された解は、約 –6.5511 の目的関数値をもちます。この値は、最初の解における値である 1.1224e–07 より小さくなります。

問題を解く

minx(-3x1-2x2-x3)subjectto{x3binaryx1,x20x1+x2+x374x1+2x2+x3=12

反復表示を使用しません。

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

options = optimoptions('intlinprog','Display','off');

sol = solve(prob,'Options',options)
sol = struct with fields:
     x: [2x1 double]
    x3: 1

解を検証します。

sol.x
ans = 2×1

         0
    5.5000

sol.x3
ans = 1

solve に線形計画問題のソルバーとして intlinprog を使用するように強制します。

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob,'Solver', 'intlinprog')
Solving problem using intlinprog.
LP:                Optimal objective value is -1.111111.                                            


Optimal solution found.

No integer variables specified. Intlinprog solved the linear problem.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

既定ではないオプションによる整数計画問題を解くで説明されている混合整数線形計画問題を解いて、すべての出力データを検証します。

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

[sol,fval,exitflag,output] = solve(prob)
Solving problem using intlinprog.
LP:                Optimal objective value is -12.000000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
sol = struct with fields:
     x: [2x1 double]
    x3: 1

fval = -12
exitflag = 
    OptimalSolution

output = struct with fields:
        relativegap: 0
        absolutegap: 0
      numfeaspoints: 1
           numnodes: 0
    constrviolation: 0
            message: 'Optimal solution found....'
             solver: 'intlinprog'

整数制約のない問題の場合は、5 番目の出力として空でないラグランジュ乗数構造体も取得できます。

名前付きインデックス変数を使用して、最適化問題を作成して解きます。問題は、収益で重み付けされた、さまざまな空港へのフルーツのフローを最大化することです。これはそれぞれの重み付きフローへの制約に従います。

rng(0) % For reproducibility
p = optimproblem('ObjectiveSense', 'maximize');
flow = optimvar('flow', ...
    {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...
    'LowerBound',0,'Type','integer');
p.Objective = sum(sum(rand(4,3).*flow));
p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10;
p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12;
p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35;
sol = solve(p);
Solving problem using intlinprog.
LP:                Optimal objective value is -1027.472366.                                         

Heuristics:        Found 1 solution using ZI round.                                                 
                   Upper bound is -1027.233133.                                                     
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).

ニューヨークとロサンゼルスへのオレンジとベリーの最適フローを求めます。

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

         0  980.0000
   70.0000         0

この表示は、NYC 向けのオレンジは 0、70 のベリーが NYC 向け、980 のオレンジが LAX 向けで、LAX 向けのベリーは 0 であることを示しています。

次の最適なフローをリストします。

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

   70.0000   28.0000  980.0000

この表示は、70 のベリーが NYC 向け、28 のアップルが BOS 向けで、980 のオレンジが LAX 向けであることを示しています。

次の非線形方程式系を解きます。

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

問題ベースのアプローチを使用する場合は、まず x を 2 要素の最適化変数として定義します。

x = optimvar('x',2);

最初の方程式を最適化等式として作成します。

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

同様に、2 番目の方程式も最適化等式として作成します。

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

方程式問題を作成し、方程式を問題に配置します。

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

問題を確認します。

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

[0,0] から始めて問題を解きます。問題ベースのアプローチの場合、初期点を構造体として指定します。変数名は構造体のフィールドとします。この問題の変数は x の 1 つしかありません。

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

解の点を表示します。

disp(sol.x)
    0.3532
    0.6061

fcn2optimexpr を必要とするサポートされていない関数

方程式の関数が初等関数で構成されていない場合、fcn2optimexprを使用して、その関数を最適化式に変換しなければなりません。次に例を示します。

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

詳細は、最適化変数および式でサポートされる演算非線形関数から最適化式への変換を参照してください。

入力引数

すべて折りたたむ

最適化問題または方程式問題。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトとして指定します。最適化問題は optimproblem を使用して作成し、方程式問題は eqnproblem を使用して作成します。

警告

問題ベースのアプローチでは、目的関数、非線形等式、または非線形不等式における複素数値をサポートしていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

例: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

例: prob = eqnproblem; prob.Equations = eqs;

初期点。prob の変数名に等しいフィールド名をもつ構造体として指定します。

一部の Global Optimization Toolbox ソルバーでは、x0 を複数の初期点を表す OptimizationValues オブジェクトのベクトルにすることができます。関数 optimvalues を使用して、点を作成します。これらのソルバーには次のものがあります。

  • ga (Global Optimization Toolbox)gamultiobj (Global Optimization Toolbox)paretosearch (Global Optimization Toolbox)、および particleswarm (Global Optimization Toolbox)。これらのソルバーは、初期集団のメンバーとして複数の開始点を受け入れます。

  • MultiStart (Global Optimization Toolbox).このソルバーは、fmincon などのローカル ソルバーの複数の初期点を受け入れます。

  • surrogateopt (Global Optimization Toolbox).このソルバーは、初期代理の生成に有効な複数の初期点を受け入れます。

名前付きインデックス変数と共に x0 を使用する例については、名前付きインデックス変数による最適化の初期点の作成を参照してください。

例: prob に変数 xy がある場合: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3]

データ型: struct

複数開始点のソルバー。MultiStart (Global Optimization Toolbox) オブジェクトまたは GlobalSearch (Global Optimization Toolbox) オブジェクトとして指定します。MultiStart コマンドまたは GlobalSearch コマンドを使用して、ms を作成します。

現在、GlobalSearchfmincon ローカル ソルバーのみをサポートし、MultiStartfminconfminunc、および lsqnonlin の各ローカル ソルバーのみをサポートしています。

例: ms = MultiStart;

例: ms = GlobalSearch(FunctionTolerance=1e-4);

名前と値の引数

引数の任意のペアを Name1=Value1,...,NameN=ValueN のように指定します。Name は引数名、Value は対応する値です。名前と値の引数は、他の引数より後に指定されている必要があります。ただし、各ペアの順序は任意です。

R2021a 以前では、それぞれの名前と値をコンマで区切り、Name を引用符で囲みます。

例: solve(prob,'Options',opts)

MultiStart (Global Optimization Toolbox) の開始点の最小数。正の整数として指定します。この引数は、ms 引数を使用して solve を呼び出す場合にのみ適用されます。solvex0 のすべての値を開始点として使用します。MinNumStartPointsx0 の値の数より大きい場合、solve は問題の範囲内でランダムかつ一様に多くの開始点を生成します。成分が非有界の場合、solveMultiStart の既定の疑似境界を使用して点を生成します。

例: solve(prob,x0,ms,MinNumStartPoints=50)

データ型: double

最適化オプション。optimoptions で作成したオブジェクトまたはオプション構造体 (optimset で作成したものなど) として指定します。

'solver' 引数のリファレンスで詳しく述べているとおり、関数 solve は内部的に、関連するソルバーを呼び出します。options にソルバーとの互換性があることを確認します。たとえば、intlinprog ではオプションを構造体にすることはできません。lsqnonneg ではオプションをオブジェクトにすることはできません。

intlinprog の解または解を求める速度を改善するためのオプション設定については、整数線形計画法の調整を参照してください。linprog の場合、既定の 'dual-simplex' アルゴリズムの方が、一般にメモリ効率が高く、迅速です。状況によっては、Algorithm オプションが 'interior-point' の場合に、linprog が大規模な問題をより迅速に解くことがあります。非線形問題の解を改善するためのオプション設定については、一般的に使用されるオプション: 調整とトラブルシューティングおよび結果の向上を参照してください。

例: options = optimoptions('intlinprog','Display','none')

最適化ソルバー。リストされているソルバーの名前として指定します。以下の表には、最適化問題について、Global Optimization Toolbox のソルバーを含め、問題のタイプごとに使用可能なソルバーが示されています。方程式問題の詳細については、最適化ソルバーの詳細の後に示しています。

整数制約をもつ非線形問題を prob2struct で変換する場合、結果として得られる問題構造体は選択したソルバーに依存します。Global Optimization Toolbox ライセンスをお持ちでない場合は、このソルバーを指定する必要があります。詳細は、非線形問題ベースの最適化における整数制約を参照してください。

最適化問題のタイプごとに、既定のソルバーを以下の表に示します。

問題のタイプ既定のソルバー
線形計画法 (LP)linprog
混合整数線形計画法 (MILP)intlinprog
二次計画法 (QP)quadprog
2 次錐計画法 (SOCP)coneprog
線形最小二乗法lsqlin
非線形最小二乗法lsqnonlin
非線形計画法 (NLP)

fminunc (制約のない問題の場合)、fmincon (それ以外)

混合整数非線形計画法 (MINLP)ga (Global Optimization Toolbox)
多目的gamultiobj (Global Optimization Toolbox)

次の表で、Yes はその問題のタイプにソルバーを使用できることを表し、"x" はソルバーを使用できないことを表しています。

問題のタイプ

LPMILPQPSOCP線形最小二乗法非線形最小二乗法NLPMINLP
ソルバー
linprog

Yes

xxxxxxx
intlinprog

Yes

Yes

xxxxxx
quadprog

Yes

x

Yes

Yes

Yes

xxx
coneprog

Yes

xx

Yes

xxxx
lsqlinxxxx

Yes

xxx
lsqnonnegxxxx

Yes

xxx
lsqnonlinxxxx

Yes

Yes

xx
fminunc

Yes

x

Yes

x

Yes

Yes

Yes

x
fmincon

Yes

x

Yes

Yes

Yes

Yes

Yes

x
patternsearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x
ga (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

particleswarm (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
simulannealbnd (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
surrogateopt (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

gamultiobj (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

paretosearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x

メモ

最小二乗問題のソルバーとして lsqcurvefit を選択した場合、solvelsqnonlin を使用します。solve に関して lsqcurvefit ソルバーと lsqnonlin ソルバーは同一です。

注意

最大化問題 (prob.ObjectiveSense"max" または "maximize") の場合は、最小二乗ソルバー (名前が lsq で始まるソルバー) を指定しないでください。これらのソルバーは最大化を実行できないので、指定すると solve でエラーが発生します。

以下の表には、方程式の求解について、問題のタイプごとに使用可能なソルバーが示されています。以下の表では、

  • * は、その問題のタイプの既定のソルバーを示します。

  • Y は、使用可能なソルバーを示します。

  • N は、使用できないソルバーを示します。

方程式でサポートされているソルバー

方程式のタイプlsqlinlsqnonnegfzerofsolvelsqnonlin
線形*NY (スカラーのみ)YY
範囲付き線形*YNNY
スカラー非線形NN*YY
非線形方程式系NNN*Y
範囲付き非線形方程式系NNNN*

例: 'intlinprog'

データ型: char | string

非線形目的関数に対して自動微分 (AD) を使用するための指示。'auto' (可能な場合に AD を使用)、'auto-forward' (可能な場合にフォワード モードの AD を使用)、'auto-reverse' (可能な場合にリバース モードの AD を使用)、または 'finite-differences' (AD を使用しない) として指定します。最適化変数および式でサポートされる演算で説明されているように、目的関数がサポートされている場合は、auto などを選択すると、基礎となるソルバーが問題の求解時に勾配情報を使用するようになります。例については、問題ベースの最適化における自動微分の効果を参照してください。

ソルバーは既定で次のタイプの AD を選択します。

  • 一般的な非線形目的関数の場合、fmincon は既定で目的関数用のリバース モードの AD になります。fmincon は、非線形制約の数が変数の数よりも少ない場合に既定で非線形制約関数用のリバース モードの AD になります。それ以外の場合、fmincon は既定で非線形制約関数用のフォワード モードの AD になります。

  • 一般的な非線形目的関数の場合、fminunc は既定でリバース モードの AD になります。

  • 最小二乗目的関数の場合、fminconfminunc は既定で目的関数用のフォワード モードの AD になります。問題ベースの最小二乗目的関数の定義については、問題ベースの最小二乗法の目的関数の記述を参照してください。

  • lsqnonlin は、目的ベクトルに含まれる要素数が変数の数以上である場合に既定でフォワード モードの AD になります。それ以外の場合、lsqnonlin は既定でリバース モードの AD になります。

  • fsolve は、方程式の数が変数の数以上の場合に既定でフォワード モードの AD になります。それ以外の場合、fsolve は既定でリバース モードの AD になります。

例: 'finite-differences'

データ型: char | string

非線形制約関数に対して自動微分 (AD) を使用するための指示。'auto' (可能な場合に AD を使用)、'auto-forward' (可能な場合にフォワード モードの AD を使用)、'auto-reverse' (可能な場合にリバース モードの AD を使用)、または 'finite-differences' (AD を使用しない) として指定します。最適化変数および式でサポートされる演算で説明されているように、制約関数がサポートされている場合は、auto などを選択すると、基礎となるソルバーが問題の求解時に勾配情報を使用するようになります。例については、問題ベースの最適化における自動微分の効果を参照してください。

ソルバーは既定で次のタイプの AD を選択します。

  • 一般的な非線形目的関数の場合、fmincon は既定で目的関数用のリバース モードの AD になります。fmincon は、非線形制約の数が変数の数よりも少ない場合に既定で非線形制約関数用のリバース モードの AD になります。それ以外の場合、fmincon は既定で非線形制約関数用のフォワード モードの AD になります。

  • 一般的な非線形目的関数の場合、fminunc は既定でリバース モードの AD になります。

  • 最小二乗目的関数の場合、fminconfminunc は既定で目的関数用のフォワード モードの AD になります。問題ベースの最小二乗目的関数の定義については、問題ベースの最小二乗法の目的関数の記述を参照してください。

  • lsqnonlin は、目的ベクトルに含まれる要素数が変数の数以上である場合に既定でフォワード モードの AD になります。それ以外の場合、lsqnonlin は既定でリバース モードの AD になります。

  • fsolve は、方程式の数が変数の数以上の場合に既定でフォワード モードの AD になります。それ以外の場合、fsolve は既定でリバース モードの AD になります。

例: 'finite-differences'

データ型: char | string

非線形制約関数に対して自動微分 (AD) を使用するための指示。'auto' (可能な場合に AD を使用)、'auto-forward' (可能な場合にフォワード モードの AD を使用)、'auto-reverse' (可能な場合にリバース モードの AD を使用)、または 'finite-differences' (AD を使用しない) として指定します。最適化変数および式でサポートされる演算で説明されているように、方程式関数がサポートされている場合は、auto などを選択すると、基礎となるソルバーが問題の求解時に勾配情報を使用するようになります。例については、問題ベースの最適化における自動微分の効果を参照してください。

ソルバーは既定で次のタイプの AD を選択します。

  • 一般的な非線形目的関数の場合、fmincon は既定で目的関数用のリバース モードの AD になります。fmincon は、非線形制約の数が変数の数よりも少ない場合に既定で非線形制約関数用のリバース モードの AD になります。それ以外の場合、fmincon は既定で非線形制約関数用のフォワード モードの AD になります。

  • 一般的な非線形目的関数の場合、fminunc は既定でリバース モードの AD になります。

  • 最小二乗目的関数の場合、fminconfminunc は既定で目的関数用のフォワード モードの AD になります。問題ベースの最小二乗目的関数の定義については、問題ベースの最小二乗法の目的関数の記述を参照してください。

  • lsqnonlin は、目的ベクトルに含まれる要素数が変数の数以上である場合に既定でフォワード モードの AD になります。それ以外の場合、lsqnonlin は既定でリバース モードの AD になります。

  • fsolve は、方程式の数が変数の数以上の場合に既定でフォワード モードの AD になります。それ以外の場合、fsolve は既定でリバース モードの AD になります。

例: 'finite-differences'

データ型: char | string

出力引数

すべて折りたたむ

解。構造体または OptimizationValues ベクトルとして返されます。sol は、問題が多目的の場合は OptimizationValues ベクトルです。単一目的問題の場合、返された構造体のフィールドは、問題の最適化変数の名前です。詳細は、optimvar を参照してください。

解での目的関数値。次のいずれかとして返されます。

問題のタイプ戻り値
スカラー目的関数 f(x) の最適化実数 f(sol)
最小二乗法実数 (解における残差の二乗和)
方程式の解法prob.Equations が単一のエントリの場合: 解における関数値の実数ベクトル。つまり、方程式の左辺から右辺を引いた値
prob.Equations に複数の名前付きフィールドがある場合: prob.Equations と同じ名前の構造体。ここで、各フィールドの値は名前付き方程式の左辺から右辺を引いた値
多目的目的関数成分ごとに 1 行、解の点ごとに 1 列をもつ行列

ヒント

最適化式または等式として定義された目的関数で fval を要求しなかった場合は、次を使用してそれを計算できます。

fval = evaluate(prob.Objective,sol)

目的関数が 1 つのフィールドしかもたない構造体として定義されている場合は、次のようになります。

fval = evaluate(prob.Objective.ObjectiveName,sol)

目的関数が複数のフィールドをもつ構造体として定義されている場合は、ループを記述します。

fnames = fields(prob.Equations);
for i = 1:length(fnames)
    fval.(fnames{i}) = evaluate(prob.Equations.(fnames{i}),sol);
end

ソルバーの停止理由。列挙変数として返されます。exitflag は、double(exitflag) を使用すると、相当する数字に変換できます。また、string(exitflag) を使用すると、相当する string に変換できます。

この表は、intlinprog ソルバーの終了フラグを説明しています。

intlinprog の終了フラグ相当する数字意味
OptimalWithPoorFeasibility3

解は、相対許容誤差 ConstraintTolerance に関しては実行可能ですが、絶対許容誤差に関しては実行不可能です。

IntegerFeasible2intlinprog が途中で停止し、整数実行可能点が検出されました。
OptimalSolution

1

ソルバーが解 x に収束しました。

SolverLimitExceeded

0

intlinprog が次の許容誤差のいずれかを超過しています。

  • LPMaxIterations

  • MaxNodes

  • MaxTime

  • RootLPMaxIterations

詳細は、許容誤差と停止条件を参照してください。solve は、ルート ノードでメモリ不足となったときにもこの終了フラグを返します。

OutputFcnStop-1intlinprog が出力関数またはプロット関数によって停止しました。
NoFeasiblePointFound

-2

実行可能点が検出されませんでした。

Unbounded

-3

問題が非有界です。

FeasibilityLost

-9

ソルバーが実行可能性を失いました。

終了フラグ 3-9 は、実行可能性が大きい解に関連しています。これらは通常、条件数が大きい線形制約行列、または大きな解の成分を含む問題から生じます。これらの問題を修正するには、係数行列のスケーリング、冗長な線形制約の除去、または変数に対するより狭い範囲の指定を試します。

この表は、linprog ソルバーの終了フラグを説明しています。

linprog の終了フラグ相当する数字意味
OptimalWithPoorFeasibility3

解は、相対許容誤差 ConstraintTolerance に関しては実行可能ですが、絶対許容誤差に関しては実行不可能です。

OptimalSolution1

ソルバーが解 x に収束しました。

SolverLimitExceeded0

反復数が options.MaxIterations を超過しています。

NoFeasiblePointFound-2

実行可能点が検出されませんでした。

Unbounded-3

問題が非有界です。

FoundNaN-4

アルゴリズムの実行中に NaN の値があったことを示します。

PrimalDualInfeasible-5

主問題 および 双対問題とも実行不可能です。

DirectionTooSmall-7

探索方向が小さすぎます。これ以上進むことができないことを示します。

FeasibilityLost-9

ソルバーが実行可能性を失いました。

終了フラグ 3-9 は、実行可能性が大きい解に関連しています。これらは通常、条件数が大きい線形制約行列、または大きな解の成分を含む問題から生じます。これらの問題を修正するには、係数行列のスケーリング、冗長な線形制約の除去、または変数に対するより狭い範囲の指定を試します。

この表は、lsqlin ソルバーの終了フラグを説明しています。

lsqlin の終了フラグ相当する数字意味
FunctionChangeBelowTolerance3

残差の変化が、指定された許容誤差 options.FunctionTolerance より小さい値です (trust-region-reflective アルゴリズム)。

StepSizeBelowTolerance

2

ステップ サイズが options.StepTolerance より小さく、制約は満たされました (interior-point アルゴリズム)。

OptimalSolution1

ソルバーが解 x に収束しました。

SolverLimitExceeded0

反復数が options.MaxIterations を超過しています。

NoFeasiblePointFound-2

最適化問題の場合は、問題が実行不可能です。また、interior-point アルゴリズムの場合、ステップ サイズは options.StepTolerance より小さいが、制約は満たされません。

方程式問題の場合は、解がありません。

IllConditioned-4

悪条件のため、さらに最適化を行うことができないことを示します。

NoDescentDirectionFound-8

探索方向が小さすぎます。これ以上進むことができないことを示します (interior-point アルゴリズム)。

この表は、quadprog ソルバーの終了フラグを説明しています。

quadprog の終了フラグ相当する数字意味
LocalMinimumFound4

局所的最小値が見つかりました。最小値は一意ではありません。

FunctionChangeBelowTolerance3

目的関数の値の変化が、指定された許容誤差 options.FunctionTolerance より小さい値です (trust-region-reflective アルゴリズム)。

StepSizeBelowTolerance

2

ステップ サイズが options.StepTolerance より小さく、制約は満たされました (interior-point-convex アルゴリズム)。

OptimalSolution1

ソルバーが解 x に収束しました。

SolverLimitExceeded0

反復数が options.MaxIterations を超過しています。

NoFeasiblePointFound-2

問題が実行不可能。また、interior-point アルゴリズムの場合、ステップ サイズは options.StepTolerance より小さいが、制約は満たされません。

IllConditioned-4

悪条件のため、さらに最適化を行うことができないことを示します。

Nonconvex

-6

非凸問題が検出されました (interior-point-convex アルゴリズム)。

NoDescentDirectionFound-8

ステップ方向を計算できません (interior-point-convex アルゴリズム)。

この表は、coneprog ソルバーの終了フラグを説明しています。

coneprog の終了フラグ相当する数字意味
OptimalSolution1

ソルバーが解 x に収束しました。

SolverLimitExceeded0

反復回数が options.MaxIterations を超過したか、秒単位の求解時間が options.MaxTime を超過しました。

NoFeasiblePointFound-2

問題が実行不可能。

Unbounded-3

問題が非有界です。

DirectionTooSmall

-7

探索方向が小さくなりすぎ、これ以上進むことができないことを示します。

Unstable-10

問題が数値的に不安定です。

この表は、lsqcurvefit ソルバーまたは lsqnonlin ソルバーの終了フラグを説明しています。

lsqnonlin の終了フラグ相当する数字意味
SearchDirectionTooSmall 4

探索方向の大きさが options.StepTolerance より小さくなったことを示します。

FunctionChangeBelowTolerance3

残差の変化が options.FunctionTolerance より小さくなったことを示します。

StepSizeBelowTolerance

2

ステップ サイズが options.StepTolerance より小さいことを示します。

OptimalSolution1

ソルバーが解 x に収束しました。

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

最適化問題の場合は、問題が実行不可能です。範囲 lbub が適切ではありません。

方程式問題の場合は、解がありません。

この表は、fminunc ソルバーの終了フラグを説明しています。

fminunc の終了フラグ相当する数字意味
NoDecreaseAlongSearchDirection5

目的関数値の予測減少が options.FunctionTolerance 許容誤差より小さくなっていることを示します。

FunctionChangeBelowTolerance3

目的関数値の変化が options.FunctionTolerance 許容誤差より小さくなっていることを示します。

StepSizeBelowTolerance

2

x の変化が options.StepTolerance 許容誤差より小さくなっていることを示します。

OptimalSolution1

勾配の大きさは、options.OptimalityTolerance の許容誤差より小さくなります。

SolverLimitExceeded0

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

OutputFcnStop-1

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

Unbounded-3

現在の反復の目的関数が options.ObjectiveLimit 以下であることを示します。

この表は、fmincon ソルバーの終了フラグを説明しています。

fmincon の終了フラグ相当する数字意味
NoDecreaseAlongSearchDirection5

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

SearchDirectionTooSmall4

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

FunctionChangeBelowTolerance3

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

StepSizeBelowTolerance

2

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

OptimalSolution1

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

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

実行可能点が検出されませんでした。

Unbounded-3

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

この表は、fsolve ソルバーの終了フラグを説明しています。

fsolve の終了フラグ相当する数字意味
SearchDirectionTooSmall4

探索方向の大きさが options.StepTolerance より小さいことを示します。方程式は解かれました。

FunctionChangeBelowTolerance3

目的関数値の変化が options.FunctionTolerance より小さいことを示します。方程式は解かれました。

StepSizeBelowTolerance

2

x の変化が options.StepTolerance より小さいことを示します。方程式は解かれました。

OptimalSolution1

1 次の最適性の尺度が options.OptimalityTolerance より小さいことを示します。方程式は解かれました。

SolverLimitExceeded0

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

OutputFcnStop-1

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

NoFeasiblePointFound-2

根ではない点に収束したことを示します。

TrustRegionRadiusTooSmall-3

方程式が解けませんでした。信頼領域の半径が小さくなりすぎています (trust-region-dogleg アルゴリズム)。

この表は、fzero ソルバーの終了フラグを説明しています。

fzero の終了フラグ相当する数字意味
OptimalSolution1

方程式が解けました。

OutputFcnStop-1

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

FoundNaNInfOrComplex-4

符号変化を含む区間に対する探索中に NaNInf、または複素数値があったことを示します。

SingularPoint-5

特異点に収束した可能性があることを示します。

CannotDetectSignChange-6関数値の符号が反転した 2 つの点が見つからなかったことを示します。

この表は、patternsearch ソルバーの終了フラグを説明しています。

patternsearch の終了フラグ相当する数字意味
SearchDirectionTooSmall4

ステップの大きさがマシンの精度より小さく、制約違反が ConstraintTolerance より小さいことを示します。

FunctionChangeBelowTolerance3

fval の変化とメッシュ サイズがどちらも指定した許容誤差より小さく、制約違反が ConstraintTolerance より小さいことを示します。

StepSizeBelowTolerance

2

x の変化とメッシュ サイズがどちらも StepTolerance より小さく、制約違反が ConstraintTolerance より小さいことを示します。

SolverConvergedSuccessfully1

"非線形制約なし" — メッシュ サイズの大きさが指定した許容誤差より小さく、制約違反が ConstraintTolerance より小さいことを示します。

"非線形制約あり""相補性測度" (この表の後で定義) の大きさが sqrt(ConstraintTolerance) より小さく、部分問題を解くのに MeshTolerance より細かいメッシュが使用され、制約違反が ConstraintTolerance より小さいことを示します。

SolverLimitExceeded0

関数評価または反復の最大回数に到達していることを示します。

OutputFcnStop-1

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

NoFeasiblePointFound-2

実行可能点が検出されませんでした。

非線形制約ソルバーで、"相補性測度" は要素が ciλi であるベクトルのノルムです。ここで、ci は非線形不等式制約違反、λi は対応するラグランジュ乗数です。

この表は、ga ソルバーの終了フラグを説明しています。

ga の終了フラグ相当する数字意味
MinimumFitnessLimitReached5

適応度の下限 FitnessLimit に到達しており、制約違反が ConstraintTolerance より小さいことを示します。

SearchDirectionTooSmall4

ステップの大きさがマシンの精度より小さく、制約違反が ConstraintTolerance より小さいことを示します。

FunctionChangeBelowTolerance3

適応度関数の値が MaxStallGenerations 世代内で変化せず、制約違反が ConstraintTolerance より小さいことを示します。

SolverConvergedSuccessfully1

"非線形制約なし"MaxStallGenerations 世代にわたる適応度関数の値の平均累積変化が FunctionTolerance より小さく、制約違反が ConstraintTolerance より小さいことを示します。

"非線形制約あり" — 相補性測度 (Complementarity Measure (Global Optimization Toolbox)を参照) の大きさが sqrt(ConstraintTolerance) より小さく、部分問題を解くのに FunctionTolerance より小さい許容誤差が使用され、制約違反が ConstraintTolerance より小さいことを示します。

SolverLimitExceeded0

世代 MaxGenerations の最大数を超過していることを示します。

OutputFcnStop-1

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

NoFeasiblePointFound-2

実行可能点が検出されませんでした。

StallTimeLimitExceeded-4

停滞時間制限 MaxStallTime を超えていることを示します。

TimeLimitExceeded-5

制限時間 MaxTime を超えていることを示します。

この表は、particleswarm ソルバーの終了フラグを説明しています。

particleswarm の終了フラグ相当する数字意味
SolverConvergedSuccessfully1

前回の options.FunctionTolerance 回の反復で目的値の相対変化が options.MaxStallIterations より小さくなっていることを示します。

SolverLimitExceeded0

反復数が options.MaxIterations を超過しています。

OutputFcnStop-1

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

NoFeasiblePointFound-2

範囲に整合性がないことを示します。つまり、一部の i について、lb(i) > ub(i) です。

Unbounded-3

最良の目的関数値が options.ObjectiveLimit を下回っていることを示します。

StallTimeLimitExceeded-4

最良の目的関数値が options.MaxStallTime 秒以内に変化しなかったことを示します。

TimeLimitExceeded-5

実行時間が options.MaxTime 秒を超えたことを示します。

この表は、simulannealbnd ソルバーの終了フラグを説明しています。

simulannealbnd の終了フラグ相当する数字意味
ObjectiveValueBelowLimit5

目的関数値が options.ObjectiveLimit より小さくなっていることを示します。

SolverConvergedSuccessfully1

options.MaxStallIterations 回の反復で目的関数値の変化の平均が options.FunctionTolerance より小さくなっていることを示します。

SolverLimitExceeded0

世代 MaxGenerations の最大数を超過していることを示します。

OutputFcnStop-1

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

NoFeasiblePointFound-2

実行可能点が検出されませんでした。

TimeLimitExceeded-5

制限時間を超えたことを示します。

この表は、surrogateopt ソルバーの終了フラグを説明しています。

surrogateopt の終了フラグ相当する数字意味
BoundsEqual10

次のいずれかの理由により、問題に固有の実行可能解があることを示します。

  • すべての上限 ub (Global Optimization Toolbox) が下限 lb (Global Optimization Toolbox) に等しい。

  • 線形等式制約 Aeq*x = beq と範囲に固有の解の点がある。

surrogateopt は、最適化を実行することなく実行可能点と関数値を返します。

FeasiblePointFound3実行可能点が検出されたことを示します。検出された新しい実行可能点が少なすぎて続行不可能なため、ソルバーが停止しました。
ObjectiveLimitAttained1

目的関数値が options.ObjectiveLimit より小さくなっていることを示します。この終了フラグは終了フラグ 10 よりも優先されます (どちらも該当する場合)。

SolverLimitExceeded0

関数評価の回数が options.MaxFunctionEvaluations を超過、または経過時間が options.MaxTime を超過したことを示しています。問題に非線形不等式が含まれている場合、解は実行可能です。

OutputFcnStop-1

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

NoFeasiblePointFound-2

次のいずれかの理由により、実行可能点が検出されなかったことを示します。

  • 下限 lb(i) が対応する上限 ub(i) を超えている。または、1 つ以上の ceil(lb(i)) が、intcon (Global Optimization Toolbox) の i について、対応する floor(ub(i)) を超えている。この場合、solvex = [] および fval = [] を返します。

  • lb = ub および点 lb が実行不可能である。この場合、x = lb および fval = objconstr(x).Fval です。

  • 線形制約および整数制約 (存在する場合) が境界と共に実行不可能である。この場合、solvex = [] および fval = [] を返します。

  • 範囲制約、整数制約および線形制約が実行可能であるが、非線形制約で実行可能解が検出されない。この場合、x は非線形制約で最小の最大実行不可能点であり、fval = objconstr(x).Fval となります。

この表は、MultiStart ソルバーおよび GlobalSearch ソルバーの終了フラグを説明しています。

MultiStart または GlobalSearch の終了フラグ相当する数字意味
LocalMinimumFoundSomeConverged2少なくとも 1 つの局所的最小値が見つかりました。ローカル ソルバーの一部の実行が収束しました。
LocalMinimumFoundAllConverged1少なくとも 1 つの局所的最小値が見つかりました。ローカル ソルバーのすべての実行が収束しました。
SolverLimitExceeded0局所的最小値が見つかりませんでした。ローカル ソルバーが少なくとも 1 回は呼び出されましたが、少なくとも 1 つのローカル ソルバー呼び出しで反復不足が発生しました。
OutputFcnStop–1出力関数またはプロット関数によって停止したことを示します。
NoFeasibleLocalMinimumFound–2実行可能な局所的最小値が見つかりませんでした。
TimeLimitExceeded–5MaxTime 制限を超えました。
NoSolutionFound–8解が見つかりませんでした。すべての実行のローカル ソルバー終了フラグが –2 以下で、すべてが等しく –2 であるわけではありません。
FailureInSuppliedFcn–10目的関数または非線形制約関数でエラーが発生しました。

この表は、paretosearch ソルバーの終了フラグを説明しています。

paretosearch の終了フラグ相当する数字意味
SolverConvergedSuccessfully1

次のいずれかの条件が満たされています。

  • すべての重なり部分のメッシュ サイズが options.MeshTolerance より小さく、制約 (ある場合) が options.ConstraintTolerance 内で満たされている。

  • パレート セットの広がりの相対変化が options.ParetoSetChangeTolerance より小さく、制約 (ある場合) が options.ConstraintTolerance 内で満たされている。

  • パレート セットの容積の相対変化が options.ParetoSetChangeTolerance より小さく、制約 (ある場合) が options.ConstraintTolerance 内で満たされている。

SolverLimitExceeded0反復回数が options.MaxIterations を超過、または関数評価の回数が options.MaxFunctionEvaluations を超過しています。
OutputFcnStop–1出力関数またはプロット関数によって停止したことを示します。
NoFeasiblePointFound–2すべての制約を満たす点をソルバーが見つけられません。
TimeLimitExceeded–5最適化時間が options.MaxTime を超過しています。

この表は、gamultiobj ソルバーの終了フラグを説明しています。

paretosearch の終了フラグ相当する数字意味
SolverConvergedSuccessfully1options.MaxStallGenerations 世代にわたる広がりの値の相対変化の幾何平均が options.FunctionTolerance より小さく、最終的な広がりが過去 options.MaxStallGenerations 世代にわたる広がりの平均を下回ります。
SolverLimitExceeded0世代数が options.MaxGenerations を超過しています。
OutputFcnStop–1出力関数またはプロット関数によって停止したことを示します。
NoFeasiblePointFound–2すべての制約を満たす点をソルバーが見つけられません。
TimeLimitExceeded–5最適化時間が options.MaxTime を超過しています。

最適化プロセスに関する情報。構造体として返されます。出力構造体に含まれるフィールドには、solve がどのソルバーを呼び出したかに応じて、関連する基となるソルバーの出力フィールドが含まれます。

  • 'ga' output (Global Optimization Toolbox)

  • 'gamultiobj' output (Global Optimization Toolbox)

  • 'paretosearch' output (Global Optimization Toolbox)

  • 'particleswarm' output (Global Optimization Toolbox)

  • 'patternsearch' output (Global Optimization Toolbox)

  • 'simulannealbnd' output (Global Optimization Toolbox)

  • 'surrogateopt' output (Global Optimization Toolbox)

  • 'MultiStart' および 'GlobalSearch' はローカル ソルバーからの出力構造体を返します。また、出力構造体には次のフィールドが含まれます。

    • globalSolver'MultiStart' または 'GlobalSearch' のいずれかです。

    • objectiveDerivative — この節の終わりに記載されている値を取ります。

    • constraintDerivative — この節の終わりに記載されている値、または prob に非線形制約がない場合は "auto" を取ります。

    • solver'fmincon' などのローカル ソルバーです。

    • local — 最適化に関する追加情報を含む構造体です。

      • sol — 局所解。OptimizationValues オブジェクトのベクトルとして返されます。

      • x0 — ローカル ソルバーの初期点。cell 配列として返されます。

      • exitflag — 局所解の終了フラグ。整数ベクトルとして返されます。

      • output — 構造体配列で、局所解 1 つにつき 1 行です。各行は、1 つの局所解に対応するローカル出力構造体です。

solve は、使用したソルバー ('intlinprog' など) を示す追加フィールド Solver を構造体 output に含めます。

Solver が非線形 Optimization Toolbox™ ソルバーである場合、solve には、導関数推定タイプを示す追加フィールドが 1 つまたは 2 つ含まれます。objectivederivative フィールド、そして適切な場合 constraintderivative フィールドが取りうる値は次のとおりです。

  • "reverse-AD" (リバース モードの自動微分の場合)

  • "forward-AD" (フォワード モードの自動微分の場合)

  • "finite-differences" (有限差分の推定の場合)

  • "closed-form" (線形関数または 2 次関数の場合)

解におけるラグランジュ乗数。構造体として返されます。

メモ

方程式を解く問題の場合、solvelambda を返しません。

intlinprog ソルバーおよび fminunc ソルバーの場合、lambda は空 [] です。他のソルバーの場合、lambda には次のフィールドがあります。

  • Variables - 各問題変数のフィールドを含みます。各問題変数名は、次の 2 つのフィールドをもつ構造体です。

    • Lower – 変数の LowerBound プロパティに関連付けられたラグランジュ乗数。変数と同じサイズの配列として返されます。非ゼロのエントリは、解が下限であることを意味しています。これらの乗数は、構造体 lambda.Variables.variablename.Lower に含まれています。

    • Upper – 変数の UpperBound プロパティに関連付けられたラグランジュ乗数。変数と同じサイズの配列として返されます。非ゼロのエントリは、解が上限であることを意味しています。これらの乗数は、構造体 lambda.Variables.variablename.Upper に含まれています。

  • Constraints - 各問題制約のフィールドを含みます。各問題制約は、制約名と同じ名前で、値が制約と同じサイズの数値配列である構造体に含まれています。非ゼロのエントリは、制約が解においてアクティブであることを意味しています。これらの乗数は、構造体 lambda.Constraints.constraintname に含まれています。

    メモ

    制約配列のすべての要素で、比較 (<===、または >=) およびタイプ (線形、二次、または非線形) が同じになります。

アルゴリズム

すべて折りたたむ

ソルバー形式への変換

関数 solve は、内部的に以下のソルバーを呼び出して最適化問題を解きます。問題に対する既定のソルバーおよび問題でサポートされているソルバーについては、'solver' 引数を参照してください。

solve がソルバーを呼び出せるためには、solve か、他のいくつかの関連付けられている関数やオブジェクトが事前に問題をソルバー形式に変換しなければなりません。この変換には、たとえば、最適化変数式ではなく行列表現をもつ線形制約が必要になります。

最適化式を問題に含めると、アルゴリズムの最初のステップが発生します。OptimizationProblem オブジェクトは、その式で使用される変数の内部リストを保持しています。変数ごとに、式の線形インデックスとサイズが 1 つずつあります。そのため、問題変数は暗黙的に行列形式となります。関数 prob2struct は、問題形式からソルバー形式への変換を実行します。例については、問題の構造体への変換を参照してください。

非線形最適化問題では、solve"自動微分" を使用して、目的関数と非線形制約関数の勾配を計算します。これらの導関数は、目的関数と制約関数が 最適化変数および式でサポートされる演算 で構成され、fcn2optimexpr 関数を使用していない場合に適用されます。自動微分が適用されない場合は、ソルバーが有限差分を使用して導関数を推定します。自動微分の詳細については、自動微分の背景を参照してください。

問題の目的関数と制約に応じて solve が呼び出す既定ソルバーおよび許容されるソルバーについては、'solver' を参照してください。solve を呼び出すときに、'solver' の名前と値のペアの引数を使用することで、この既定をオーバーライドできます。

intlinprog が MILP 問題を解くために使用するアルゴリズムについては、intlinprog アルゴリズムを参照してください。linprog が線形計画問題を解くために使用するアルゴリズムについては、線形計画法のアルゴリズムを参照してください。二次計画問題を解くために quadprog が使用するアルゴリズムについては、二次計画法のアルゴリズムを参照してください。線形または非線形の最小二乗ソルバー アルゴリズムについては、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。非線形ソルバー アルゴリズムについては、制約なし非線形最適化アルゴリズムおよび制約付き非線形最適化アルゴリズムを参照してください。

非線形方程式を解く場合、solve は内部的に、各方程式を左辺と右辺の差として表します。その後 solve は、方程式の成分の二乗和を最小化しようと試みます。非線形方程式系を解くアルゴリズムについては、方程式を解くためのアルゴリズムを参照してください。問題に範囲もある場合、solvelsqnonlin を呼び出して、方程式の成分の二乗和を最小化します。詳細は、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。

メモ

目的関数が二乗和である場合に solve にそのように認識させるには、expr'*expr などの形式ではなく norm(expr)^2 または sum(expr.^2) と記述します。内部パーサーは、ノルムの二乗または明示的な二乗和として表された場合にのみ二乗和を認識します。詳細は、問題ベースの最小二乗法の目的関数の記述を参照してください。例については、非負の線形最小二乗法、問題ベースを参照してください。

自動微分

自動微分 (AD) は、以下の条件の下で、solve 関数と prob2struct 関数に適用されます。

  • 最適化変数および式でサポートされる演算で説明されているように、目的関数と制約関数がサポートされています。これらの関数は、fcn2optimexpr 関数を使用する必要がありません。

  • solve に呼び出されるソルバーは、fminconfminuncfsolvelsqnonlin のいずれかです。

  • 最適化問題では、solve または prob2struct'ObjectiveDerivative''ConstraintDerivative' の名前と値のペアの引数が 'auto' (既定)、'auto-forward'、または 'auto-reverse' に設定されます。

  • 方程式問題の場合、'EquationDerivative' オプションは 'auto' (既定)、'auto-forward'、または 'auto-reverse' に設定されます。

AD の適用時サポートされているすべての制約関数サポートされていない 1 つ以上の制約
サポートされている目的関数目的と制約に使用される AD目的のみに使用される AD
サポートされていない目的関数制約のみに使用される AD使用されない AD

これらの条件が満たされなかった場合は、solve が有限差分によって勾配を推定し、prob2struct が生成された関数ファイル内に勾配を作成しません。

ソルバーは既定で次のタイプの AD を選択します。

  • 一般的な非線形目的関数の場合、fmincon は既定で目的関数用のリバース モードの AD になります。fmincon は、非線形制約の数が変数の数よりも少ない場合に既定で非線形制約関数用のリバース モードの AD になります。それ以外の場合、fmincon は既定で非線形制約関数用のフォワード モードの AD になります。

  • 一般的な非線形目的関数の場合、fminunc は既定でリバース モードの AD になります。

  • 最小二乗目的関数の場合、fminconfminunc は既定で目的関数用のフォワード モードの AD になります。問題ベースの最小二乗目的関数の定義については、問題ベースの最小二乗法の目的関数の記述を参照してください。

  • lsqnonlin は、目的ベクトルに含まれる要素数が変数の数以上である場合に既定でフォワード モードの AD になります。それ以外の場合、lsqnonlin は既定でリバース モードの AD になります。

  • fsolve は、方程式の数が変数の数以上の場合に既定でフォワード モードの AD になります。それ以外の場合、fsolve は既定でリバース モードの AD になります。

メモ

prob2struct によって変換された問題内で自動導関数を使用するには、これらの導関数を指定するオプションを渡します。

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

現時点で、AD は、最初の導関数に対してのみ機能します。2 番目以降の導関数には適用されません。そのため、たとえば、解析的ヘッシアンを使用して最適化を高速化するには、solve を直接使用できず、代わりに、問題ベースのワークフローへの導関数の供給で説明されているアプローチを使用しなければなりません。

拡張機能

バージョン履歴

R2017b で導入

すべて展開する