問題ベースの錐計画法の制約の記述
solve
または prob2struct
で 2 次錐問題のために coneprog
を呼び出すようにするには、2 次錐制約を次のいずれかのタイプとして指定します。
norm(linear expression) + constant <= linear expression
sqrt(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) + constant
linear expression >= norm(linear expression) + constant
const*norm(linear expression) + constant <= linear expression
ただしconst > 0
sqrt(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.ConeprogOptions
optsumsq = optimoptions(probsumsq); class(optsumsq)
ans = 'optim.options.ConeprogOptions
2 次制約を異なる記述にした場合 (数学的に等価な 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