問題ベースの錐計画法の制約の記述
solve または prob2struct で 2 次錐問題のために coneprog を呼び出すようにするには、2 次錐制約を次のいずれかのタイプとして指定します。
norm(linear expression) + constant <= linear expressionsqrt(sum of squares) + constant <= linear expression
ここで、linear expression は最適化変数の線形式を意味し、sum of squares は最適化変数の明示的な二乗和 (sum(x.^2) など) を意味します。coneprog の目的関数は最適化変数において線形でなければなりません。二乗和形式の詳細については、問題ベースの最小二乗法の目的関数の記述を参照してください。
solve と prob2struct は、制約のタイプが次の 2 つと等しい形式だった場合は coneprog も呼び出します。
linear expression >= sqrt(sum of squares) + constantlinear expression >= norm(linear expression) + constantconst*norm(linear expression) + constant <= linear expressionただしconst > 0sqrt(sum of squares)ではなく(sum of squares)^0.5
たとえば、solve を呼び出したときに次の 2 つの等価な問題の定式化において coneprog が既定のソルバーとなります。
x = optimvar('x',3,... 'LowerBound',[-Inf,-Inf,0],... 'UpperBound',[Inf,Inf,2]); A = diag([1,1/2,0]); d = [0;0;1]; f = [-1,-2,0]; probnorm = optimproblem('Objective',f*x); probsumsq = optimproblem('Objective',f*x); consnorm = norm(A*x) <= d'*x; probnorm.Constraints.consnorm = consnorm; conssumsq = sqrt(sum((A*x).^2)) <= dot(d,x); probsumsq.Constraints.conssumsq = conssumsq; optnorm = optimoptions(probnorm); class(optnorm)
ans =
'optim.options.ConeprogOptionsoptsumsq = optimoptions(probsumsq); class(optsumsq)
ans =
'optim.options.ConeprogOptions2 次制約を異なる記述にした場合 (数学的に等価な sqrt(x'*x) など)、solve は別のソルバー (fmincon など) を呼び出します。この場合、solve に初期点を指定する必要があります。また、解法プロセスが異なり (多くの場合は非効率的)、次の例のようになる場合があります。
x = optimvar('x',3,... 'LowerBound',[-Inf,-Inf,0],... 'UpperBound',[Inf,Inf,2]); A = diag([1,1/2,0]); d = [0;0;1]; f = [-1,-2,0]; prob = optimproblem('Objective',f*x); cons = sqrt(x'*A'*A*x) <= d'*x; prob.Constraints.cons = cons; opt = optimoptions(prob); class(opt)
ans =
'optim.options.Fmincon'参考
coneprog | solve | prob2struct