最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
最適化問題または方程式問題の求解
は、前の構文の入力引数に加え、1 つ以上の名前と値のペア引数を使用して求解プロセスを変更します。sol
= solve(___,Name,Value
)
最適化問題によって定義された線形計画問題を解きます。
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
の、領域 での最小値を求めます。これを行うには、関数 peaks
を最適化式に変換します。
prob = optimproblem; x = optimvar('x'); y = optimvar('y'); fun = fcn2optimexpr(@peaks,x,y); prob.Objective = fun;
制約を不等式として最適化変数に含めます。
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
初期実行可能点がある場合とない場合の両方について整数計画問題を解くためのステップ数を比較します。問題には 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 1.06 0 - - 18027 1.81 1 2.906000e+03 4.509804e+01 21859 2.26 2 2.073000e+03 2.270974e+01 23546 2.39 3 1.854000e+03 1.180593e+01 24121 2.44 3 1.854000e+03 1.563342e+00 24294 2.45 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.56 2 2.154000e+03 2.593968e+01 5844 0.72 3 1.854000e+03 1.180593e+01 6204 0.75 3 1.854000e+03 1.455526e+00 6400 0.77 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 24294 steps. With an initial point, solve took 6400 steps.
初期点を与えることが常に問題を改善するとは限りません。この問題の場合、初期点を使用すると、時間と計算ステップが節減されます。ただし、問題によっては、初期点によって solve
がより多くのステップを必要とする場合があります。
問題を解く
反復表示を使用しません。
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
intlinprog
を使用して線形計画法を解く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
向けであることを示しています。
次の非線形方程式系を解きます。
問題ベースのアプローチを使用する場合は、まず 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.4069e-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;
サポートされている関数の一覧については、最適化変数および式でサポートされる演算を参照してください。
prob
— 最適化問題または方程式問題OptimizationProblem
オブジェクト | EquationProblem
オブジェクト最適化問題または方程式問題。OptimizationProblem
オブジェクトまたは EquationProblem
オブジェクトとして指定します。最適化問題は optimproblem
を使用して作成し、方程式問題は eqnproblem
を使用して作成します。
警告
問題ベースのアプローチでは、目的関数、非線形等式、または非線形不等式における複素数値をサポートしていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。
例: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 =
cons1;
例: prob = eqnproblem; prob.Equations = eqs;
x0
— 初期点初期点。prob
の変数名に等しいフィールド名をもつ構造体として指定します。
名前付きインデックス変数と共に x0
を使用する例については、名前付きインデックス変数による最適化の初期点の作成を参照してください。
例: prob
に変数 x
と y
がある場合: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3]
データ型: struct
引数 Name,Value
のオプションのコンマ区切りペアを指定します。Name
は引数名、Value
は対応する値です。Name
は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN
のように、複数の名前と値のペアの引数を任意の順番で指定できます。
solve(prob,'options',opts)
'options'
— 最適化オプションoptimoptions
によって作成されたオブジェクト | オプション構造体最適化オプション。'options'
と、optimoptions
で作成したオブジェクト、またはオプション構造体 (optimset
で作成したものなど) から構成されるコンマ区切りのペアとして指定します。
'solver'
引数のリファレンスで詳しく述べているとおり、関数 solve
は内部的に、関連するソルバーを呼び出します。options
にソルバーとの互換性があることを確認します。たとえば、intlinprog
ではオプションを構造体にすることはできません。lsqnonneg
ではオプションをオブジェクトにすることはできません。
intlinprog
の解または解を求める速度を改善するためのオプション設定については、整数線形計画法の調整を参照してください。linprog
の場合、既定の 'dual-simplex'
アルゴリズムの方が、一般にメモリ効率が高く、迅速です。状況によっては、Algorithm
オプションが 'interior-point'
の場合に、linprog
が大規模な問題をより迅速に解くことがあります。非線形問題の解を改善するためのオプション設定については、一般的に使用されるオプション: 調整とトラブルシューティングおよび結果の向上を参照してください。
例: options =
optimoptions('intlinprog','Display','none')
'solver'
— 最適化ソルバー'intlinprog'
| 'linprog'
| 'lsqlin'
| 'lsqcurvefit'
| 'lsqnonlin'
| 'lsqnonneg'
| 'quadprog'
| 'fminunc'
| 'fmincon'
| 'fzero'
| 'fsolve'
最適化ソルバー。'solver'
およびリストされているソルバーの名前で構成されるコンマ区切りのペアとして指定します。以下の表には、最適化問題について、問題のタイプごとに使用可能なソルバーが示されています。
問題のタイプ | 既定のソルバー | 他の可能なソルバー |
---|---|---|
線形目的関数、線形制約 | linprog | intlinprog 、quadprog 、fmincon 、fminunc (制約なしの線形計画法は定数または非有界であるため、fminunc は推奨されません) |
線形目的関数、線形制約および整数制約 | intlinprog | linprog (整数制約は無視) |
二次目的関数、線形制約 | quadprog | fmincon 、fminunc (制約なし) |
線形制約に従って ||C*x - d||^2 を最小化 | 線形式の二乗和に定数を加算した和が目的関数である場合は lsqlin | quadprog 、lsqnonneg (lsqnonneg では x >= 0 以外の制約を無視)、fmincon 、fminunc (制約なし) |
X >= 0 に従って ||C*x - d||^2 を最小化 | lsqlin | quadprog 、lsqnonneg |
sum(e(i).^2) を最小化 (e(i) は範囲制約のある最適化式) | 目的関数が問題ベースの最小二乗法の目的関数の記述で示した形式の場合は lsqnonlin | lsqcurvefit 、fmincon 、fminunc (制約なし) |
一般的な非線形関数 f(x) を最小化 | fminunc | fmincon |
いくつかの制約に従って一般的な非線形関数 f(x) を最小化、または非線形制約に従って任意の関数を最小化 | fmincon | (なし) |
メモ
最小二乗問題のソルバーとして lsqcurvefit
を選択した場合、solve
は lsqnonlin
を使用します。solve
に関して lsqcurvefit
ソルバーと lsqnonlin
ソルバーは同一です。
注意
最大化問題 (prob.ObjectiveSense
が "max"
または "maximize"
) の場合は、最小二乗ソルバー (名前が lsq
で始まるソルバー) を指定しないでください。これらのソルバーは最大化を実行できないので、指定すると solve
でエラーが発生します。
以下の表には、方程式の求解について、問題のタイプごとに使用可能なソルバーが示されています。以下の表では、
* は、その問題のタイプの既定のソルバーを示します。
Y は、使用可能なソルバーを示します。
N は、使用できないソルバーを示します。
方程式でサポートされているソルバー
方程式のタイプ | lsqlin | lsqnonneg | fzero | fsolve | lsqnonlin |
---|---|---|---|---|---|
線形 | * | N | Y (スカラーのみ) | Y | Y |
範囲付き線形 | * | Y | N | N | Y |
スカラー非線形 | N | N | * | Y | Y |
非線形方程式系 | N | N | N | * | Y |
範囲付き非線形方程式系 | N | N | N | N | * |
例: 'intlinprog'
データ型: char
| string
sol
— 解解。構造体として返されます。構造体のフィールドは、最適化変数の名前です。詳細は、optimvar
を参照してください。
fval
— 解での目的関数値解での目的関数値。実数として返されるか、方程式系の場合は実数ベクトルとして返されます。最小二乗問題の場合、fval
は解における残差の二乗和です。方程式を解く問題の場合、fval
は解における関数値です。つまり、方程式の左辺から右辺を引いた値です。
ヒント
最適化問題で fval
を要求しなかった場合は、次を使用してそれを計算できます。
fval = evaluate(prob.Objective,sol)
exitflag
— ソルバーの停止理由ソルバーの停止理由。列挙型変数として返されます。exitflag
は、double(exitflag)
を使用すると、相当する数字に変換できます。また、string(exitflag)
を使用すると、相当する string に変換できます。
この表は、intlinprog
ソルバーの終了フラグを説明しています。
intlinprog の終了フラグ | 相当する数字 | 意味 |
---|---|---|
OptimalWithPoorFeasibility | 3 | 解は、相対許容誤差 |
IntegerFeasible | 2 | intlinprog が途中で停止し、整数実行可能点が検出されました。 |
OptimalSolution |
| ソルバーが解 |
SolverLimitExceeded |
|
詳細は、許容誤差と停止条件を参照してください。 |
OutputFcnStop | -1 | intlinprog が出力関数またはプロット関数によって停止しました。 |
NoFeasiblePointFound |
| 実行可能点が検出されませんでした。 |
Unbounded |
| 問題が非有界です。 |
FeasibilityLost |
| ソルバーが実行可能性を失いました。 |
終了フラグ 3
と -9
は、実行可能性が大きい解に関連しています。これらは通常、条件数が大きい線形制約行列、または大きな解の成分を含む問題から生じます。これらの問題を修正するには、係数行列のスケーリング、冗長な線形制約の除去、または変数に対するより狭い範囲の指定を試します。
この表は、linprog
ソルバーの終了フラグを説明しています。
linprog の終了フラグ | 相当する数字 | 意味 |
---|---|---|
OptimalWithPoorFeasibility | 3 | 解は、相対許容誤差 |
OptimalSolution | 1 | ソルバーが解 |
SolverLimitExceeded | 0 | 反復数が |
NoFeasiblePointFound | -2 | 実行可能点が検出されませんでした。 |
Unbounded | -3 | 問題が非有界です。 |
FoundNaN | -4 | アルゴリズムの実行中に |
PrimalDualInfeasible | -5 | 主問題 および 双対問題とも実行不可能です。 |
DirectionTooSmall | -7 | 探索方向が小さすぎます。これ以上進むことができないことを示します。 |
FeasibilityLost | -9 | ソルバーが実行可能性を失いました。 |
終了フラグ 3
と -9
は、実行可能性が大きい解に関連しています。これらは通常、条件数が大きい線形制約行列、または大きな解の成分を含む問題から生じます。これらの問題を修正するには、係数行列のスケーリング、冗長な線形制約の除去、または変数に対するより狭い範囲の指定を試します。
この表は、lsqlin
ソルバーの終了フラグを説明しています。
lsqlin の終了フラグ | 相当する数字 | 意味 |
---|---|---|
FunctionChangeBelowTolerance | 3 | 残差の変化が、指定された許容誤差 |
StepSizeBelowTolerance |
| ステップ サイズが |
OptimalSolution | 1 | ソルバーが解 |
SolverLimitExceeded | 0 | 反復数が |
NoFeasiblePointFound | -2 | 最適化問題の場合は、問題が実行不可能です。また、 方程式問題の場合は、解がありません。 |
IllConditioned | -4 | 悪条件のため、さらに最適化を行うことができないことを示します。 |
NoDescentDirectionFound | -8 | 探索方向が小さすぎます。これ以上進むことができないことを示します ( |
この表は、quadprog
ソルバーの終了フラグを説明しています。
quadprog の終了フラグ | 相当する数字 | 意味 |
---|---|---|
LocalMinimumFound | 4 | 局所的最小値が見つかりました。最小値は一意ではありません。 |
FunctionChangeBelowTolerance | 3 | 目的関数の値の変化が、指定された許容誤差 |
StepSizeBelowTolerance |
| ステップ サイズが |
OptimalSolution | 1 | ソルバーが解 |
SolverLimitExceeded | 0 | 反復数が |
NoFeasiblePointFound | -2 | 問題が実行不可能。また、 |
IllConditioned | -4 | 悪条件のため、さらに最適化を行うことができないことを示します。 |
Nonconvex |
| 非凸問題が検出されました ( |
NoDescentDirectionFound | -8 | ステップ方向を計算できません ( |
この表は、lsqcurvefit
ソルバーまたは lsqnonlin
ソルバーの終了フラグを説明しています。
lsqnonlin の終了フラグ | 相当する数字 | 意味 |
---|---|---|
SearchDirectionTooSmall | 4 | 探索方向の大きさが |
FunctionChangeBelowTolerance | 3 | 残差の変化が |
StepSizeBelowTolerance |
| ステップ サイズが |
OptimalSolution | 1 | ソルバーが解 |
SolverLimitExceeded | 0 | 反復回数が |
OutputFcnStop | -1 | 出力関数またはプロット関数によって停止したことを示します。 |
NoFeasiblePointFound | -2 | 最適化問題の場合は、問題が実行不可能です。範囲 方程式問題の場合は、解がありません。 |
この表は、fminunc
ソルバーの終了フラグを説明しています。
fminunc の終了フラグ | 相当する数字 | 意味 |
---|---|---|
NoDecreaseAlongSearchDirection | 5 | 目的関数値の予測減少が |
FunctionChangeBelowTolerance | 3 | 目的関数値の変化が |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 勾配の大きさは、 |
SolverLimitExceeded | 0 | 反復回数が |
OutputFcnStop | -1 | 出力関数またはプロット関数によって停止したことを示します。 |
Unbounded | -3 | 現在の反復の目的関数が |
この表は、fmincon
ソルバーの終了フラグを説明しています。
fmincon の終了フラグ | 相当する数字 | 意味 |
---|---|---|
NoDecreaseAlongSearchDirection | 5 | 方向導関数の大きさが 2* |
SearchDirectionTooSmall | 4 | 探索方向の大きさが 2* |
FunctionChangeBelowTolerance | 3 | 目的関数値の変化が |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 1 次の最適性の尺度が |
SolverLimitExceeded | 0 | 反復回数が |
OutputFcnStop | -1 | 出力関数またはプロット関数によって停止したことを示します。 |
NoFeasiblePointFound | -2 | 実行可能点が検出されませんでした。 |
Unbounded | -3 | 現在の反復の目的関数が |
この表は、fsolve
ソルバーの終了フラグを説明しています。
fsolve の終了フラグ | 相当する数字 | 意味 |
---|---|---|
SearchDirectionTooSmall | 4 | 探索方向の大きさが |
FunctionChangeBelowTolerance | 3 | 目的関数値の変化が |
StepSizeBelowTolerance |
|
|
OptimalSolution | 1 | 1 次の最適性の尺度が |
SolverLimitExceeded | 0 | 反復回数が |
OutputFcnStop | -1 | 出力関数またはプロット関数によって停止したことを示します。 |
NoFeasiblePointFound | -2 | 根ではない点に収束したことを示します。 |
TrustRegionRadiusTooSmall | -3 | 方程式が解けませんでした。信頼領域の半径が小さくなりすぎています ( |
この表は、fzero
ソルバーの終了フラグを説明しています。
fzero の終了フラグ | 相当する数字 | 意味 |
---|---|---|
OptimalSolution | 1 | 方程式が解けました。 |
OutputFcnStop | -1 | 出力関数またはプロット関数によって停止したことを示します。 |
FoundNaNInfOrComplex | -4 | 符号変化を含む区間に対する探索中に |
SingularPoint | -5 | 特異点に収束した可能性があることを示します。 |
CannotDetectSignChange | -6 | 関数値の符号が反転した 2 つの点が見つからなかったことを示します。 |
output
— 最適化プロセスに関する情報最適化プロセスに関する情報。構造体として返されます。出力構造体に含まれるフィールドには、solve
がどのソルバーを呼び出したかに応じて、関連する基となるソルバーの出力フィールドが含まれます。
solve
は、使用したソルバー ('intlinprog'
など) を示す追加フィールド Solver
を構造体 output
に含めます。
lambda
— 解におけるラグランジュ乗数解におけるラグランジュ乗数。構造体として返されます。
メモ
方程式を解く問題の場合、solve
は lambda
を返しません。
intlinprog
ソルバーおよび fminunc
ソルバーの場合、lambda
は空 []
です。他のソルバーの場合、lambda
には次のフィールドがあります。
Variables
- 各問題変数のフィールドを含みます。各問題変数名は、次の 2 つのフィールドをもつ構造体です。
Lower
– 変数の LowerBound
プロパティに関連付けられたラグランジュ乗数。変数と同じサイズの配列として返されます。非ゼロのエントリは、解が下限であることを意味しています。これらの乗数は、構造体 lambda.Variables.
に含まれています。variablename
.Lower
Upper
– 変数の UpperBound
プロパティに関連付けられたラグランジュ乗数。変数と同じサイズの配列として返されます。非ゼロのエントリは、解が上限であることを意味しています。これらの乗数は、構造体 lambda.Variables.
に含まれています。variablename
.Upper
Constraints
- 各問題制約のフィールドを含みます。各問題制約は、制約名と同じ名前で、値が制約と同じサイズの数値配列である構造体に含まれています。非ゼロのエントリは、制約が解においてアクティブであることを意味しています。これらの乗数は、構造体 lambda.Constraints.
に含まれています。constraintname
メモ
制約配列のすべての要素で、比較 (<=
、==
、または >=
) およびタイプ (線形、二次、または非線形) が同じになります。
関数 solve
は、内部的に以下のソルバーを呼び出して最適化問題を解きます。
線形目的関数と線形制約の場合は linprog
線形目的関数と線形制約および整数制約の場合は intlinprog
二次目的関数と線形制約の場合は quadprog
範囲制約がある非線形最小二乗の場合は lsqcurvefit
または lsqnonlin
(変数範囲も含めて) 制約がなく一般的な非線形目的関数のある問題の場合は fminunc
非線形制約がある、または一般的な非線形目的関数と少なくとも 1 つの制約がある問題の場合は fmincon
スカラー非線形方程式の場合は fzero
範囲の有無にかかわらず、線形方程式系の場合は lsqlin
制約がない非線形方程式系の場合は fsolve
範囲がある非線形方程式系の場合は lsqnonlin
solve
がこれらの関数を呼び出せるためには、solve
か、他のいくつかの関連付けられている関数やオブジェクトが事前に問題をソルバー形式に変換しなければなりません。この変換には、たとえば、最適化変数式ではなく行列表現をもつ線形制約が必要になります。
最適化式を問題に含めると、アルゴリズムの最初のステップが発生します。OptimizationProblem
オブジェクトは、その式で使用される変数の内部リストを保持しています。変数ごとに、式の線形インデックスとサイズが 1 つずつあります。そのため、問題変数は暗黙的に行列形式となります。関数 prob2struct
は、問題形式からソルバー形式への変換を実行します。例については、問題の構造体への変換を参照してください。
問題の目的関数と制約に応じて solve
が呼び出す既定ソルバーおよび許容されるソルバーについては、'solver'
を参照してください。solve
を呼び出すときに、'solver'
の名前と値のペア引数を使用することで、この既定をオーバーライドできます。
intlinprog
が MILP 問題を解くために使用するアルゴリズムについては、intlinprog アルゴリズムを参照してください。linprog
が線形計画問題を解くために使用するアルゴリズムについては、線形計画法のアルゴリズムを参照してください。二次計画問題を解くために quadprog
が使用するアルゴリズムについては、二次計画法のアルゴリズムを参照してください。線形または非線形の最小二乗ソルバー アルゴリズムについては、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。非線形ソルバー アルゴリズムについては、制約なし非線形最適化アルゴリズムおよび制約付き非線形最適化アルゴリズムを参照してください。
非線形方程式を解く場合、solve
は内部的に、各方程式を左辺と右辺の差として表します。その後 solve
は、方程式の成分の二乗和を最小化しようと試みます。非線形方程式系を解くアルゴリズムについては、方程式を解くためのアルゴリズムを参照してください。問題に範囲もある場合、solve
は lsqnonlin
を呼び出して、方程式の成分の二乗和を最小化します。詳細は、最小二乗 (モデル当てはめ) アルゴリズムを参照してください。
メモ
目的関数が二乗和である場合に solve
にそのように認識させるには、expr'*expr
などの形式ではなく sum(expr.^2)
と記述します。内部パーサーは、明示的な二乗和のみを認識します。詳細は、問題ベースの最小二乗法の目的関数の記述を参照してください。例については、非負の線形最小二乗法、問題ベースを参照してください。
solve(prob,solver)
、solve(prob,options)
および solve(prob,solver,options)
構文の削除R2018b 以降はエラー
solve
のオプションおよび基礎となるソルバーを選択するには、名前と値のペアを使用します。たとえば、
sol = solve(prob,'options',opts,'solver','quadprog');
上記の構文は、名前と値のペアのような柔軟性、標準性、拡張性がありませんでした。
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
Select web siteYou can also select a web site from the following list:
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.