ConicOptimization[f,cons,vars]
錐制約 cons に従って線形目的関数 f の値を最小にする変数 vars の値を求める.
ConicOptimization[…,"prop"]
どの解の特性"prop"を返すべきかを指定する.
ConicOptimization
ConicOptimization[f,cons,vars]
錐制約 cons に従って線形目的関数 f の値を最小にする変数 vars の値を求める.
ConicOptimization[…,"prop"]
どの解の特性"prop"を返すべきかを指定する.
詳細とオプション
- 錐最適化は,混合整数錐最適化,線形錐最適化あるいは線形錐計画法としても知られている.
- 錐最適化は,線形最適化,線形分数最適化,二次最適化,二次錐最適化,半正定値最適化,幾何最適化等を含む,他の数多くの最適化の形式を含む.
- 錐最適化は,実数,整数,複素数の変数で大域的に効率よく解くことができる凸最適化問題である.
- 錐最適化は主問題を解く
を求める. -
最小化 
制約条件 
ただし 
- 集合
は次元
の真凸錐でなければならない.次は,
についてよく使われる錐指定と
(VectorGreaterEqual[{x,0},κj]) に対応する集合である. -
{"NonNegativeCone", m} 
となる 
{"NormCone", m} 
となる 
{"SemidefiniteCone", m} 
対称半正定値行列 
"ExponentialCone" 
となる 
"DualExponentialCone" 
または
となる 
{"PowerCone",α} 
となる 
{"DualPowerCone",α} 
となる 
- 混合整数錐最適化は,問題を解く
と
を求める. -
最小化 
制約条件 
ただし 
- ConicOptimizationは,目的関数が実数値のときは内部的に実変数
に変換することで
の問題を解く.ただし,
で
である. - 変数指定 vars は,次のいずれかの形式で変数を与える要素のリストでなければならない.
-
v 名前が
で次元が推測される変数v∈Reals 実数のスカラー変数 v∈Integers 整数のスカラー変数 v∈Complexes 複素数のスカラー変数 v∈ℛ 幾何学領域
に制限されたベクトル変数v∈Vectors[n,dom]
または
のベクトル変数v∈Matrices[{m,n},dom]
または
の行列変数 - 制約条件 cons は以下で指定できる.
-
LessEqual 
スカラー不等式 GreaterEqual 
スカラー不等式 VectorLessEqual 
ベクトル不等式 VectorGreaterEqual 
ベクトル不等式 Equal 
スカラー等式またはベクトル等式 Element 
凸領域または領域要素 - ConicOptimization[f,cons,vars]のとき,parval(par は vars には含まれず,val は数値または数値配列)の形式のパラメータ方程式を制約条件に含めて,f あるいは cons で使われるパラメータを定義することができる. »
- 主最小化問題は,関連する最大化問題(ラグランジュの双対問題)を有する.双対の最大値は,常に主最小値以下であるので,下限を与える.双対マキシマイザは,最小値の制約条件の変化に対する感度を含む主問題についての情報を与える. »
- 錐最適化は次の双対問題を持つ. »
-
最大化 
制約条件 
ただし
および
は
の双対錐である - 次は,可能な解の特性"prop" である. »
-
"PrimalMinimizer" 
を最小化する変数値のリスト"PrimalMinimizerRules" 
を最小化する変数の値 vars={v1,…}"PrimalMinimizerVector" 
を最小化するベクトル"PrimalMinimumValue" 
最小値 
"DualMaximizer" 
を最大化するベクトル"DualMaximumValue" 
双対最大値 "DualityGap" 
双対最適値と主最適値の差 "Slack" 
不等式制約を等式に変換するベクトル "ConstraintSensitivity"
の制約の摂動に対する感度"ObjectiveVector" 
線形目的ベクトル "ConicConstraints" 
標準形式の錐制約のリスト "ConicConstraintConeSpecifications" 
錐体
についての指定のリスト"ConicConstraintConeDimensions" ![{TemplateBox[{Dimensions, paclet:ref/Dimensions}, RefLink, BaseStyle -> {3ColumnTableMod}][kappa_1],...} {TemplateBox[{Dimensions, paclet:ref/Dimensions}, RefLink, BaseStyle -> {3ColumnTableMod}][kappa_1],...}](Files/ConicOptimization.ja/3.png)
錐制約中の錐体の次元のリスト "ConicConstraintAffineLists" 
錐制約中のアフィン変換のための行列とベクトル対のリスト {"prop1","prop2",…} いくつかの解の特性 - 次は,使用可能なオプションである.
-
MaxIterations Automatic 使用する最大反復回数 Method Automatic 使用するメソッド PerformanceGoal $PerformanceGoal 最適化しようとするパフォーマンスの局面 Tolerance Automatic 内部比較に使用する許容度 - オプションMethod->method を使って使用するメソッドを指定することができる.以下は,使用可能なメソッドである.
-
Automatic メソッドを自動的に選択する "SCS" SCS(錐ソルバの分割)ライブラリ "CSDP" CSDP(COIN半定値計画)ライブラリ "DSDP" DSDP(半定値計画)ライブラリ "MOSEK" 商用MOSEK凸最適化ソルバ "Gurobi" 商用Gurobi線形・二次最適化ソルバ "Xpress" 商用Xpress線形・二次最適化ソルバ - 計算はMachinePrecisionに限られる.
例題
すべて開く すべて閉じる例 (3)
res = ConicOptimization[Subscript[x, 1] + 2Subscript[x, 2], {Subscript[x, 1], Subscript[x, 2]}Underscript[, {"NormCone", 2}]0, {Subscript[x, 1], Subscript[x, 2]}]最適点は,制約条件で定義された領域内で
が最小となる点である:
Show[Plot3D[Subscript[x, 1] + 2Subscript[x, 2], {Subscript[x, 1], Subscript[x, 2]}∈ImplicitRegion[Abs[Subscript[x, 1]] ≤ Subscript[x, 2], {Subscript[x, 1], Subscript[x, 2]}], ...], Graphics3D[{Blue, PointSize[0.04], Point[{Subscript[x, 1], Subscript[x, 2], Subscript[x, 1] + 2Subscript[x, 2]} /. res]}]]Subscript[x, min] = ConicOptimization[-(x + y), {x ≥ 0, y ≥ 0, x + 2 y ≤ 2, x^2 + y^2 ≤ 1}, {x, y}]RegionPlot[{x ≥ 0 && y ≥ 0 && x + 2 y ≤ 2, x ^ 2 + y ^ 2 ≤ 1}, ...]ConicOptimization[x + y, Norm[{x, y}] ≤ 1, {x∈Integers, y∈Reals}]スコープ (35)
基本的な用法 (11)
res = ConicOptimization[x + 2y, {x^2 + 2y^2 ≤ 3, x + y == 2, x ≥ 1}, {x, y}]線形不等式制約の中にはVectorGreaterEqualで表せるものがある:
ConicOptimization[x + y, VectorGreaterEqual[{{x + 2y, x}, {3, -1}}], {x, y}]
v>=
または \[VectorGreaterEqual]を使ってベクトル不等式記号 を入力する:
ConicOptimization[x + y, {x + 2y, x}{3, -1}, {x, y}]ConicOptimization[x + y, {x + 2y ≥ 3, x ≥ -1}, {x, y}]ConicOptimization[{1, 1}.v, {{1, 2}, {1, 0}}.v{3, -1}, v]
への縫込みがあるかもしれないので,不等式
は
とは等しくないかもしれない:
ConicOptimization[{1, 1}.x, {{1, 2}, {1, 0}}.x + {-3, 1}0, x]ConicOptimization[{1, 1}.x, {{1, 2}, {1, 0}}.x{3, -1}, x]
への意図しない縫込みを避けるためにInactive[Plus]を使う:
ConicOptimization[{1, 1}.x, {{1, 2}, {1, 0}}.x + {-3, 1}0, x]定数パラメトリック方程式を使って意図しない
への縫込みを避ける:
parEqs = {a == {{1, 2}, {1, 0}}, b == {3, -1}};ConicOptimization[{1, 1}.x, {parEqs, a.x + b0}, x]VectorGreaterEqualは"NonNegativeCone"についての錐不等式を表す:
constraint = VectorGreaterEqual[{{{1, 2}, {1, 0}}.v, {3, -1}}, "NonNegativeCone"]錐の次元を明示的に指定するために{"NonNegativeCone",n}を使う:
constraint = VectorGreaterEqual[{{{1, 2}, {1, 0}}.v, {3, -1}}, {"NonNegativeCone", 2}]ConicOptimization[{1, 1}.v, constraint, v]ConicOptimization[x + y, x^2 + y^2 ≤ 9, {x, y}]"NormCone"の錐不等式を使って制約条件
を指定する:
VectorGreaterEqual[{{x, y, 3}, 0}, {"NormCone", 3}]ConicOptimization[x + y, {x, y, 3}Underscript[, {"NormCone", 3}]0, {x, y}]constraint = VectorGreaterEqual[{{{x, 1}, {1, y}}, 0}, {"SemidefiniteCone", 2}]ConicOptimization[x + 2y, constraint, {x, y}]ベクトル変数
とIndexed[x,i]を使って個々の成分を指定する:
ConicOptimization[{1, 2}.x, (| | |
| --------------- | --------------- |
| Indexed[x, {1}] | 1 |
| 1 | Indexed[x, {2}] |)Underscript[, {"SemidefiniteCone", 2}]0, x]あいまいなときは,Vectors[n]を使ってベクトル変数の次元を指定する:
ConicOptimization[Indexed[x, {1}] + 2Indexed[x, {2}], (| | |
| --------------- | --------------- |
| Indexed[x, {1}] | 1 |
| 1 | Indexed[x, {2}] |)Underscript[, {"SemidefiniteCone", 2}]0, x]ConicOptimization[Indexed[x, {1}] + Indexed[2x, {2}], (| | |
| --------------- | --------------- |
| Indexed[x, {1}] | 1 |
| 1 | Indexed[x, {2}] |)Underscript[, {"SemidefiniteCone", 2}]0, x∈Vectors[2]]NonNegativeReals (
)を使って非負の制約条件を指定する:
ConicOptimization[{1, 1}.x, {Indexed[x, {1}], Indexed[x, {2}], 1}Underscript[, {"NormCone", 3}]0, x∈Vectors[2, NonNegativeReals]]ConicOptimization[{1, 1}.x, {{Indexed[x, {1}], Indexed[x, {2}], 1}Underscript[, {"NormCone", 3}]0, x0}, x]整数変数 (4)
Integersを使って整数領域制約を指定する:
ConicOptimization[x + y, {x + 2y ≥ 3, x ≥ -2}, {x∈Integers, y∈Integers}]Vectors[n,Integers]を使ってベクトル変数についての整数領域制約を指定する:
ConicOptimization[Total[x], {a == {{1, 2}, {1, 0}}, b == {3, -2},
a.xb}, {x∈Vectors[2, Integers]}]NonNegativeIntegers (
)を使って非負の整数領域制約を指定する:
ConicOptimization[x + 2y, {x^2 + 2y^2 ≤ 3, x + y == 2, x∈NonNegativeIntegers}, {x, y}]NonPositiveIntegers (
)を使って非正の整数領域制約を指定する:
ConicOptimization[-x + y, {x + 2y ≥ 3, x∈NonPositiveIntegers}, {x, y}]複素変数 (5)
Complexesを使って複素変数を指定する:
ConicOptimization[Re[z] + Im[z], Abs[z] ≤ 2, z∈ Complexes]constraints = VectorGreaterEqual[{(-1 + 2I) z, -3}] && VectorGreaterEqual[{z, I}]
であるとする.制約条件を実数成分に展開すると以下が与えられる:
VectorGreaterEqual /@ ComplexExpand[constraints[[All, 1]] /. z -> x + I y]realConstraints = -x - 2y ≥ -3 && 2 x - y ≥ 0 && x ≥ 0 && y ≥ 1;RegionPlot[realConstraints, {x, 0.5, 1}, {y, 1, 1.2}]ConicOptimization[Re[z], constraints, Element[z, Complexes]]ConicOptimization[x, realConstraints, {x, y}]二次制約
をエルミート行列
および実数値の変数と一緒に使う:
{q, c} = {{{2, 1 + I}, {1 - I, 1}}, {2, 3}};
ConicOptimization[{1, 2}.x, (1 / 2) * x.q.x + c.x1, x∈Vectors[2, Reals]]q = {{3, 1 + I}, {1 - I, 2}};
ConvexOptimization[{1, 2}.Re[x], {(1 / 2) * Inactive[Dot][Conjugate[x], q, x]5}, x∈Vectors[2, Complexes]]q = {{1, 1 + I}, {1 - I, 2}};
ConicOptimization[-{1, 2}.Re[x], {(1 / 2) * Inactive[Dot][Conjugate[x], q, x]0 , {1, I}.x-1 - I}, x∈Vectors[2, Complexes]]線形行列不等式制約条件
をエルミート行列または対称行列と一緒に使う:
Subscript[a, 0] = (| | |
| ----- | ----- |
| 0 | 1 + I |
| 1 - I | 0 |);Subscript[a, 1] = (| | |
| - | - |
| 1 | 0 |
| 0 | 0 |);Subscript[a, 2] = (| | |
| - | - |
| 0 | 0 |
| 0 | 1 |);和がエルミート行列のままであるためには,線形行列不等式の変数は実数でなければならない:
c = {1, 2};
ConicOptimization[c.v, {Subscript[a, 1], Subscript[a, 2]}.vUnderscript[, {"SemidefiniteCone", 2}]-Subscript[a, 0], v∈Vectors[2, Reals]]主モデルの特性 (4)
triangle = {x ≥ 0, y ≥ 0, x + 2y ≤ 2};
disk = x ^ 2 + y ^ 2 ≤ 1;sol = ConicOptimization[-(x + y), {triangle, disk}, {x, y}]{xmin, ymin} = ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "PrimalMinimizer"]minval = ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "PrimalMinimumValue"]RegionPlot[{x ≥ 0 && y ≥ 0 && x + 2 y ≤ 2, x ^ 2 + y ^ 2 ≤ 1}, {x, 0, 2}, {y, 0, 1}, AspectRatio -> Automatic, Epilog -> {Red, PointSize[0.025], Point[{x, y} /. sol]}]triangle = {x ≥ 0, y ≥ 0, x + 2y ≤ 2};
disk = x ^ 2 + y ^ 2 ≤ 1;c = ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "ObjectiveVector"]ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "ConicConstraints"]//NormalConicOptimization[-(x + y), {triangle, disk}, {x, y}, "ConicConstraintConeSpecifications"]ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "ConicConstraintConeDimensions"]ConicOptimization[-(x + y), {triangle, disk}, {x, y}, "ConicConstraintAffineLists"]//Normaltriangle = {Subscript[x, 1] ≥ 0, Subscript[x, 2] ≥ 0, Subscript[x, 1] + 2Subscript[x, 2] ≤ 2};
disk = Subscript[x, 1] ^ 2 + Subscript[x, 2] ^ 2 ≤ 1;s = ConicOptimization[-(Subscript[x, 1] + Subscript[x, 2]), {triangle, disk}, {Subscript[x, 1], Subscript[x, 2]}, "Slack"]{x^ * , afflists} = Normal[ConicOptimization[-(Subscript[x, 1] + Subscript[x, 2]), {triangle, disk}, {Subscript[x, 1], Subscript[x, 2]}, {"PrimalMinimizer", "ConicConstraintAffineLists"}]]スラックが aj.x*+bj-sj=0で s={s0,…,sk}を満足することを確認する:
{{Subscript[a, 1], Subscript[b, 1]}, {Subscript[a, 2], Subscript[b, 2]}} = afflists;{Subscript[a, 1].x^ * + Subscript[b, 1], Subscript[a, 2].x^ * + Subscript[b, 2]} - s標準形式の錐最適化問題は,
および
に従って
を最小化すると定義されることがある.標準形式に変換するために,各錐制約
について,変数
と対応する線形等式制約
を加える:
triangle = {Subscript[x, 1] ≥ 0, Subscript[x, 2] ≥ 0, Subscript[x, 1] + 2Subscript[x, 2] ≤ 2};
disk = Subscript[x, 1]^2 + Subscript[x, 2]^2 ≤ 1;{c, {{a[1], b[1]}, {a[2], b[2]}}, {κ[1], κ[2]}} = ConicOptimization[-(Subscript[x, 1] + Subscript[x, 2]), {triangle,
disk}, {Subscript[x, 1], Subscript[x, 2]}, {"ObjectiveVector", "ConicConstraintAffineLists", "ConicConstraintConeSpecifications"}];slackConstraints = Table[VectorGreaterEqual[{Subscript[s, i], 0}, κ[i]], {i, 2}]equalityConstraints = Table[Subscript[s, j] == a[j].{Subscript[x, 1], Subscript[x, 2]} + b[j], {j, 2}];ConicOptimization[c.{Subscript[x, 1], Subscript[x, 2]}, {equalityConstraints,
slackConstraints}, {Subscript[x, 1], Subscript[x, 2], Subscript[s, 1], Subscript[s, 2]}]"Slack"特性によって,実際の変換を行わずに
の値を得ることができる:
ConicOptimization[-(Subscript[x, 1] + Subscript[x, 2]), {triangle, disk}, {Subscript[x, 1], Subscript[x, 2]}, {"PrimalMinimizerVector", "Slack"}]双対モデルの特性 (3)
c = {1, 1};
Subscript[a, 0] = {{1., -1.}}; Subscript[b, 0] = {0};
Subscript[a, 1] = {{1., 0}, {0, 1}, {0, 0}};Subscript[b, 1] = {0, 0, 1};psol = ConicOptimization[c.x, {Subscript[a, 0].x + Subscript[b, 0] == 0, Subscript[a, 1].x + Subscript[b, 1]Underscript[, {"NormCone", 3}]0}, x]dsol = ConicOptimization[Subscript[b, 0].Subscript[λ, 0] + Subscript[b, 1].Subscript[λ, 1] , {Transpose[Subscript[a, 0]].Subscript[λ, 0] + Transpose[Subscript[a, 1]].Subscript[λ, 1] == c, Subscript[λ, 1]Underscript[, {"NormCone", 3}]0}, {Subscript[λ, 0], Subscript[λ, 1]}]{c.x /. psol, -Subscript[b, 0].Subscript[λ, 0] - Subscript[b, 1].Subscript[λ, 1] /. dsol}これは,0の双対性ギャップを持つことに等しい.一般に,最適点で
である:
ConicOptimization[c.x, {Subscript[a, 0].x + Subscript[b, 0] == 0, Subscript[a, 1].x + Subscript[b, 1]Underscript[, {"NormCone", 3}]0}, x, "DualityGap"]obj = Indexed[x, {1}] + Indexed[x, {2}];
constraints = {Indexed[x, {1}] == Indexed[x, {2}], Indexed[x, {1}]^2 + Indexed[x, {2}]^2 ≤ 1};ConicOptimization[obj, constraints, x∈Vectors[2]]{c, afflists} = ConicOptimization[obj, constraints, x∈Vectors[2], {"ObjectiveVector", "ConicConstraintAffineLists"}];{{Subscript[a, 0], Subscript[b, 0]}, {Subscript[a, 1], Subscript[b, 1]}} = afflists;ConicOptimization[Subscript[b, 0].Subscript[λ, 0] + Subscript[b, 1].Subscript[λ, 1], {Transpose[Subscript[a, 0]].Subscript[λ, 0] + Transpose[Subscript[a, 1]].Subscript[λ, 1] == c, Subscript[λ, 1]Underscript[, {"NormCone", 3}]0}, {Subscript[λ, 0], Subscript[λ, 1]}]ConicOptimization[Indexed[x, {1}] + Indexed[x, {2}], {Indexed[x, {1}] == Indexed[x, {2}], Indexed[x, {1}]^2 + Indexed[x, {2}]^2 ≤ 1}, {Indexed[x, {1}], Indexed[x, {2}]}, "DualMaximumValue"]dualMaximizer = ConicOptimization[Indexed[x, {1}] + Indexed[x, {2}], {Indexed[x, {1}] == Indexed[x, {2}], Indexed[x, {1}]^2 + Indexed[x, {2}]^2 ≤ 1}, {Indexed[x, {1}], Indexed[x, {2}]}, "DualMaximizer"]双対マキシマイザベクトル区分は双対錐の数と次元にマッチする:
{Subscript[λ, 0], Subscript[λ, 1]} = dualMaximizer感度特性 (3)
a = {{1, 0}, {0, 1}, {-1, -2}};b = {0, 0, 1};
disk = a.{x, y} + bUnderscript[, {"NormCone", 3}]0;minValue = ConicOptimization[-x - y, {disk}, {x, y}, "PrimalMinimumValue"]{s} = ConicOptimization[-x - y, {disk}, {x, y}, "ConstraintSensitivity"]δ = 0.01 * {1, 2, 3};minValue + δ.sConicOptimization[-x - y, {a.{x, y} + (b + δ) Underscript[, {"NormCone", 3}]0}, {x, y}, "PrimalMinimumValue"]a = {{1, 0}, {0, 1}, {-1, -2}};b = {0, 0, 1};
disk = a.{x, y} + bUnderscript[, {"NormCone", 3}]0;{p^ * , sens} = ConicOptimization[-x - y, {disk}, {x, y}, {"PrimalMinimumValue", "ConstraintSensitivity"}]p^ * > ConicOptimization[-x - y, a.{x, y} + (b + {0, 0, 1})Underscript[, {"NormCone", 3}]0, {x, y}, "PrimalMinimumValue"]p^ * < ConicOptimization[-x - y, a.{x, y} + (b + {1, 0, 0})Underscript[, {"NormCone", 3}]0, {x, y}, "PrimalMinimumValue"]制約条件の感度は双対マキシマイザの否定としても得ることができる:
-ConicOptimization[-{1, 1}.{x, y}, {{x, y, 1 - x - 2 y}Underscript[, {"NormCone", 3}]0}, {x, y},
"DualMaximizer"]ConicOptimization[-{1, 1}.{x, y}, {{x, y, 1 - x - 2 y}Underscript[, {"NormCone", 3}]0}, {x, y},
"ConstraintSensitivity"]サポートされる凸錐 (5)
"NonNegativeCone" (1)
{minval, {xmin, ymin}} = ConicOptimization[10x + 11 y, {x, y}∈RegularPolygon[9], {x, y}, {"PrimalMinimumValue", "PrimalMinimizer"}]Show[Plot3D[10x + 11y, {x, y}∈RegularPolygon[9], MeshFunctions -> {#3&}], Graphics3D[{Red, PointSize[0.05], Point[{xmin, ymin, minval}]}]]ConicOptimization[10x + 11 y, {x, y}∈RegularPolygon[9], {x, y}, "ConicConstraintConeSpecifications"]"NormCone" (1)
{minval, {xmin, ymin}} = ConicOptimization[10x + 11 y, {x, y}∈Disk[], {x, y}, {"PrimalMinimumValue", "PrimalMinimizer"}]Show[Plot3D[10x + 11y, {x, y}∈Disk[], MeshFunctions -> {#3&}], Graphics3D[{Red, PointSize[0.05], Point[{xmin, ymin, minval}]}]]ConicOptimization[10.x + 11. y, {x, y}∈Disk[], {x, y}, "ConicConstraintConeSpecifications"]"SemidefiniteCone" (1)
{minval, {xmin, ymin}} = ConicOptimization[10x + 11 y, (| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0, {x, y}, {"PrimalMinimumValue", "PrimalMinimizer"}]Show[Plot3D[10x + 11y, {x, y}∈ImplicitRegion[ x y ≥ 1, {{x, 0, 5}, {y, 0, 5}}], MeshFunctions -> {#3&}], Graphics3D[{Red, PointSize[0.05], Point[{xmin, ymin, minval}]}]]ConicOptimization[10x + 11y, (| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0, {x, y}, "ConicConstraintConeSpecifications"]"ExponentialCone" (1)
{minval, {xmin, ymin}} = ConicOptimization[10.x + 11.y, {x ≥ 0, y ≥ 0, -Log[x] - Log[y] ≤ 0}, {x, y}, {"PrimalMinimumValue", "PrimalMinimizer"}, Method -> {"SCS", Tolerance -> 10 ^ -7}]Show[Plot3D[10x + 11y, {x, 0, 10}, {y, 0, 10}, MeshFunctions -> {#3&}, RegionFunction -> Function[{x, y}, x ≥ 0 && y ≥ 0 && -Log[x] - Log[y] ≤ 0]], Graphics3D[{Red, PointSize[0.05], Point[{xmin, ymin, minval}]}]]ConicOptimization[10 x + 11 y, {x ≥ 0, y ≥ 0, -Log[x] - Log[y] ≤ 0}, {x, y}, "ConicConstraintConeSpecifications"]"PowerCone" (1)
{minval, {xmin, ymin}} = ConicOptimization[10.x + 11.y, Inactive[Norm][{x, y}, 4] ≤ 1, {x, y}, {"PrimalMinimumValue", "PrimalMinimizer"}]Show[Plot3D[10x + 11y, {x, y}∈ImplicitRegion[ x ^4 + y^4 ≤ 1, {{x, -1, 1}, {y, -1, 1}}], MeshFunctions -> {#3&}], Graphics3D[{Red, PointSize[0.05], Point[{xmin, ymin, minval}]}]]ConicOptimization[10 x + 11 y, Inactive[Norm][{x, y}, 4] ≤ 1, {x, y}, "ConicConstraintConeSpecifications"]オプション (11)
Method (8)
ConicOptimization[-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x^2 + y^2 ≤ 1}, {x, y}, Method -> "SCS"]ConicOptimization[-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x^2 + y^2 ≤ 1}, {x, y}, Method -> "CSDP"]ConicOptimization[-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x^2 + y^2 ≤ 1}, {x, y}, Method -> "DSDP"]ConicOptimization[-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x^2 + y^2 ≤ 1}, {x, y}, Method -> "IPOPT"]メソッドによってデフォルトの許容度が異なり,それが確度と精度に影響する:
{obj, cons, var} = {-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x ^ 2 + y ^ 2 ≤ 1}, {x, y}};
props = {"PrimalMinimumValue", "PrimalMinimizer"};{minval, argmin} = Minimize[obj, cons, var];
exact = {minval, var /. argmin};solSCS = ConicOptimization[obj, cons, var, props, Method -> "SCS"];solCSDP = ConicOptimization[obj, cons, var, props, Method -> "CSDP"];solDSDP = ConicOptimization[obj, cons, var, props, Method -> "DSDP"];solIPOPT = ConicOptimization[obj, cons, var, props, Method -> "IPOPT"];solSCS - exact"CSDP","DSDP","IPOPT"のデフォルトの許容度は
である:
solCSDP - exactsolDSDP - exactsolIPOPT - exact"SCS"法は,指定されるとSCSライブラリのデフォルト許容度である10-3で呼び出される:
ConicOptimization[x + y, {x^2 + y^2 ≤ 1}, {x, y}, Method -> "SCS"]デフォルトオプションだと,この問題は"SCS"法を使って許容度10-6で解かれる:
ConicOptimization[x + y, {x^2 + y^2 ≤ 1}, {x, y}]ConicOptimization[x + y, {x^2 + y^2 ≤ 1}, {x, y}, Method -> {"SCS", Tolerance -> 10 ^ -6}]"CSDP"法または"DSDP"法を半定値制約条件まで使う:
lin = {{1, 0}, {0, 1}, {-1, -2}}.x + {0, 0, 2}Underscript[, {"NonNegativeCone", 3}]0;norm = {{1, 0}, {0, 1}, {0, 0}}.x + {0, 0, 1}Underscript[, {"NormCone", 3}]0;semi = {{{-4, 0}, {0, 0}}, {{0, 0}, {0, -0.8}}}.x + {{5, 1}, {1, 1}}Underscript[, {"SemidefiniteCone", 2}]0;ConicOptimization[{-1, -1}.x, {lin, norm, semi}, x, Method -> "CSDP"]ConicOptimization[{-1, -1}.x, {lin, norm, semi}, x, Method -> "DSDP"]"CSDP"あるいは "DSDP"が適用できない場合は,"IPOPT"法を使って正確な解を得る.制約条件を指定する:
expConstraint = {{1, 0}, {0, 1}, {-1, -2}}.x + {0, 0, 2}Underscript[, "ExponentialCone"]0;powConstraint = {{1, 0}, {0, 1}, {-1, -2}}.x + {1, 0, 2}Underscript[, {"PowerCone", (1/3)}]0;"IPOPT"は,"SCS"より正確な結果を生成するが,速度は遅くなることが多い:
AbsoluteTiming[xmin = ConicOptimization[{1, 1}.x, {expConstraint, powConstraint}, x, Method -> "IPOPT"]]AbsoluteTiming[xmin = ConicOptimization[{1, 1}.x, {expConstraint, powConstraint}, x, Method -> "SCS"]]PerformanceGoal (1)
オプションPerformanceGoalのデフォルト値は$PerformanceGoalである:
$PerformanceGoalPerformanceGoal"Quality"を使ってより確度の高い結果を得る:
ConicOptimization[x + y, {Norm[{x, y}] ≤ Sqrt[2], {x, y}1}, {x, y},
"PrimalMinimumValue", PerformanceGoal -> "Quality"]ConicOptimization[x + y, {Norm[{x, y}] ≤ Sqrt[2], {x, y}1}, {x, y},
"PrimalMinimumValue", PerformanceGoal -> "Speed"]PerformanceGoal"Speed"を使って,品質を犠牲にして結果を速く得る:
n = 100000; {obj, const, vars} = {Total[x] / n, {Norm[x] ≤ Sqrt[n], x1}, x∈Vectors[n]};Timing[resSpeed = ConicOptimization[obj, const, vars,
"PrimalMinimumValue", PerformanceGoal -> "Speed"];]Timing[resQuality = ConicOptimization[obj, const, vars,
"PrimalMinimumValue", PerformanceGoal -> "Quality"];]{resSpeed, resQuality}Tolerance (2)
Toleranceの設定を小さくするとより正確な結果が与えられる:
{obj, cons, var} = {-x - y, {x ≥ 0, y ≥ 0, x + 2y ≤ 2, x ^ 2 + y ^ 2 ≤ 1}, {x, y}};Minimizeで厳密な最小値を計算する:
exact = Minimize[obj, cons, var][[1]]Toleranceの設定を変えて最小値における誤差を計算する:
err = Table[{tol, Abs[ConicOptimization[obj, cons, var, "PrimalMinimumValue", Tolerance -> tol] - exact]}, {tol, 10. ^ -Range[7]}]ListLogLogPlot[err, PlotRange -> All, Joined -> True, PlotMarkers -> Automatic]Toleranceの設定を小さくするとより正確な答が得られるが,計算時間が長くなるかもしれない:
n = 100000; {obj, const, vars} = {Total[x] / n, {Norm[x] ≤ Sqrt[n], x1}, x∈Vectors[n]};Timing[ptight = ConicOptimization[obj, const, vars,
"PrimalMinimumValue", Tolerance -> 10^-12];]Timing[ploose = ConicOptimization[obj, const, vars,
"PrimalMinimumValue", Tolerance -> 10^-2];]{ptight, ploose}アプリケーション (29)
基本的なモデリング変換 (13)
に従って
を最小化する.目的関数を否定することで最大化問題を解く:
ConicOptimization[-(x + y), {x + y == 3, x ≥ 0, y ≤ 2}, {x, y}]-ConicOptimization[-(x + y), {x + y == 3, x ≥ 0, y ≤ 2}, {x, y}, "PrimalMinimumValue"]
を中心とする半径
の円板上で
を最小化する.
に等しい追加的な制約
を加えて目的関数
を線形関数
に変換する:
ConicOptimization[t, {{x, y}∈Disk[{1, 1}, 1], -t ≤ x + y ≤ t}, {x, y, t}]円板制約もまたNormを使って表すことができる:
ConicOptimization[t, {Norm[{x - 1, y - 1}] ≤ 1, -t ≤ x + y ≤ t}, {x, y, t}]正五角形上で
を最小化する.
と追加的な制約条件
を使って目的関数を線形関数に変換する:
ConicOptimization[s1 + s2, {{x, y}∈RegularPolygon[5], -s1 ≤ x + 1 ≤ s1, -s2 ≤ x - y ≤ s2}, {x, y, s1, s2}]
を最小化する.補助変数
を使うと,目的は制約条件
に従って
を最小化することに変わる:
{a1, b1} = Block[{n = 10, m = 5}, SeedRandom[123];{RandomReal[{-1, 1}, {n, m}], Range[n]}];ConicOptimization[t, {a == a1, b == b1, Norm[a.x - b] ≤ t}, {t, x}]
に従って
を最小化する.2つの補助変数
と
を使って,
に従って
を最小化するように問題を変換する:
ConicOptimization[t1 + t2, {Norm[{x}] ≤ t1, Norm[{y}] ≤ t2, x + y ≤ 0, y ≥ 1}, {x, y, t1, t2}]
を最小化する.補助変数
を使い,
に従って
を最小化するように問題を変換する:
{a1, b1} = IconizedObject[«CompoundExpression»];ConicOptimization[t, {a == a1, b == b1, Norm[a.x - b] ≤ t}, {x, t}]
を最小化する代りに
に従って
を最小化する.ただし,
は非減少関数である.主ミニマイザ
はどちらの問題でも同じである.
に従って
を最小化することを考える:
f = Function[{s}, Sqrt[s]];{minval, Subscript[z, min]} = ConicOptimization[x + y, {(| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0, x + y ≥ 0}, {x, y}, {"PrimalMinimumValue", "PrimalMinimizerRules"}]f[minval]
を中心とする半径
の円板上で
を最小化する.補助変数
を使うと,目的は追加の制約
を持つ
を最小化することに変わる:
ConicOptimization[-t, {{x, y}∈Disk[{2, 2}], -Log[x + y] ≤ -t}, {x, y, t}]制約条件
は,
のときかつそのときに限り,指数錐制約
に等しい:
ConicOptimization[-t, {{x, y}∈Disk[{2, 2}], {t, 1, x + y}Underscript[, "ExponentialCone"]0}, {x, y, t}]
を中心とした半径
の円板上で
を最小化する.制約条件
に従って
を最小化するように補助変数
を使って問題を変換する:
ConicOptimization[t, {{x, y}∈Disk[{1, 1}], x + y^1.5 ≤ t}, {x, y, t}]制約条件
は
に等しい.これは,"PowerCone" を使った
で表すことができる:
ConicOptimization[t, {{x, y}∈Disk[{1, 1}], {t, 1, x + y}Underscript[, {"PowerCone", 1 / 1.5}]0}, {x, y, t}]{a, b} = IconizedObject[«BlockRandom»];補助変数
を使って,制約条件
に従って
を最小化するように問題を変換する:
ConicOptimization[t, {ap == a, bp == b, Norm[ap.x - bp, 1.5] ≤ t}, {x, t}]これは,"PowerCone"制約条件を使って表すことができる.
のときかつそのときに限り
なので,
を
の境界とする.ただし,
は
を与えるものとする:
sol = ConicOptimization[t, {{s1, t, a[[1]].x - b[[1]]}Underscript[, {"PowerCone", 1 / 1.5}]0, {s2, t, a[[2]].x - b[[2]]}Underscript[, {"PowerCone", 1 / 1.5}]0, s1 + s2 == t}, {x∈Vectors[2], t, s1, s2}]決定変数
,
に線形依存する対称行列の最大固有値を最小化する
を求める.
は
と等価なので,この問題は線形行列不等式として立式できる.ただし,
は
の
番目の固有値である.線形行列関数
を定義する:
A[x_, y_] := (| | |
| -- | -- |
| 2 | -3 |
| -3 | 4 |) + (| | |
| - | - |
| 1 | 2 |
| 2 | 3 |) x + (| | |
| - | - |
| 4 | 5 |
| 5 | 6 |) yA[x, y]//MatrixForm実対称行列
は直交行列
で対角化可能なので
.したがって,
のときかつそのときに限り
.任意の
は
を取って
.したがて,
のときかつそのときに限り
.数値的にシミュレーションを行なってこれらの式が等しいことを示す:
eigs = Eigenvalues[A[1., 2.]]data = Table[{λ, λ (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |) Underscript[, {"SemidefiniteCone", 2}]A[1., 2.]}, {λ, RandomReal[{0, 35}, 100]}];
{true, false} = {Cases[data, {λ_, True} :> λ], Cases[data, {λ_, False} :> λ]};NumberLinePlot[{eigs, true, false}, IconizedObject[«Rule»]]res = ConicOptimization[λ, λ (| | |
| - | - |
| 1 | 0 |
| 0 | 1 |) Underscript[, {"SemidefiniteCone", 2}]A[x, y], {λ, x, y}]モンテカルロシミュレーションを行なって結果の妥当性をチェックする:
Min[Table[Max[Eigenvalues[A@@RandomReal[{-10000, 10000}, 2]]], 10000]]
に従い,
のとき
を仮定して
を最小化する.補助変数
を使って
となるように
を最小化することが目的となる:
{α, β, γ, δ} = {{1, 2}, 1, {-3, 4}, 2};
{a, b} = {{{1, -2}, {-3, 4}}, {-5, -1}};Reduce[Implies[a.{Indexed[x, {1}], Indexed[x, {2}]} + b >= 0, γ.{Indexed[x, {1}], Indexed[x, {2}]} + δ > 0], Reals]シューアの補題における制約条件は,
のときかつそのときに限り,
であればブロック行列
であるとする.したがって,
のときかつそのときに限り
である.Inactive Plusを使って縫込みを回避するための条件を構築する:
ConicOptimization[t, {(| | |
| ------- | ------- |
| t | α.x + β |
| α.x + β | γ.x + δ |)Underscript[, {"SemidefiniteCone", 2}]0, a.x + b0}, {t, x∈Vectors[2]}]楕円体,二次錐,放物体を含む二次集合
について,
かどうかを判断する.ただし,
は対称行列,
はベクトル,
はスカラーである:
{a1, b1, c1} = {{{0.7, 0.68}, {0.68, 0.94}}, {0.35, .42}, 0.12};{a2, b2, c2} = {{{0.13, 0.2}, {0.2, 0.62}}, {.2, .4}, .01};With[{x = {x1, x2}}, RegionPlot[{x.a1.x + 2 b1.x + c1 ≤ 0, x.a2.x + 2 b2.x + c2 ≤ 0}, {x1, -2, 2}, {x2, -2, 2}, PlotLegends -> {Subscript[𝒬, 1], Subscript[𝒬, 2]}, ImageSize -> 100]]集合 iが全次元であると仮定すると,S-procedureは,
となるような非負の数
が存在するときかつそのときに限り
であるとする.非負の数
が存在することを視覚的に確かめる:
m1 = ArrayFlatten[{{a1, {b1}}, {{b1}, {{c1}}}}];
m2 = ArrayFlatten[{{a2, {b2}}, {{b2}, {{c2}}}}];
Plot[Boole[λm1Underscript[, {"SemidefiniteCone", 3}]m2], {λ, 0, 5}, ImageSize -> Small]ConicOptimization[0, λ(| | |
| -- | -- |
| a1 | b1 |
| b1 | c1 |)Underscript[, {"SemidefiniteCone", 3}](| | |
| -- | -- |
| a2 | b2 |
| b2 | c2 |), λ]データフィッティング問題 (5)
{a, b} = IconizedObject[«Block»];補助変数
を使うと,目的は,
に従って
を最小化することに変わる:
ConicOptimization[t, {Norm[Inactive[Plus][a.x, -b]] ≤ t, x1}, {t, x}]データの最初と最後の点が曲線上に来るように,三次曲線を離散データをフィットする:
data = IconizedObject[«Block»];DesignMatrixを使って行列を構築する:
a = DesignMatrix[data, {1, x, x^2, x^3}, x];
b = data[[All, 2]];pointConstraints = {a[[1]].λ == b[[1]], a[[-1]].λ == b[[-1]]};
を最小化して係数
を求める.補助変数
を使うと,目的は
に従って
を最小化することに変わる:
res = ConicOptimization[t, {Norm[Inactive[Plus][a.λ, -b]] ≤ t, pointConstraints}, {t, λ}]Show[Plot[Evaluate[{1, x, x^2, x^3}.λ /. res], {x, 0, 1}, Epilog -> {Red, PointSize[0.03], Point[data[[{1, -1}]]]}], ListPlot[data]]
を最小化することで,非線形離散データの強力なフィットを求める:
data = IconizedObject[«Block»];bases = Sqrt[1 + (x - #) ^ 2]& /@ Subdivide[-3, 3, 10];
input = DesignMatrix[data, bases, x, IncludeConstantBasis -> False];
output = data[[All, 2]];
なので,補助変数
を使う.問題は変形されて,制約条件
に従って
を最小化することになる:
res = ConicOptimization[Total[s], {a == input, b == output, -sa.λ - bs}, {λ, s}];Plot[Evaluate[bases.λ /. res], {x, -3, 3}, Epilog -> {PointSize[0.008], Point[data]}]Plot[{Sin[2x] + Cos[x ^ 2], Evaluate[bases.λ /. res]}, {x, -3, 3}, PlotLegends -> {"Reference", "SubscriptBox[L, 1]fit"}]poly = 2 + 4 x + 6 x^2 + 4 x^3 + x^4;目的は,
となるような
を求めることである.ただし,
は単項式のベクトルである:
v = {1, x, x^2};n = Length[v];
mat = Array[Indexed[q, {##}] &, {n, n}];
Q = UpperTriangularize[mat] + Transpose[UpperTriangularize[mat, 1]];coeffs = Map[# == 0&, DeleteCases[Flatten[CoefficientList[v.Q.v - poly, {x}]], 0]]res = ConicOptimization[0, {coeffs , qUnderscript[, {"SemidefiniteCone", n}]0}, q]二次の項
.ただし,
は
のコレスキー分解で得られた下三角行列である:
L = CholeskyDecomposition[(Q /. res)];
g = L.v;
Expand[Sum[g[[i]]^2, {i, Length[g]}]]Chop[Expand[Total[g ^ 2]] - poly, 10^-7]複素
について
を最小化することで複素データの
正規化フィットを求める:
data = Block[{z}, SeedRandom[1234];
Table[{z = RandomComplex[{-2 - 2I, 2 + 2I}], z ^ (3 / 2) + 0.02 RandomComplex[]}, {i, 100}]];DesignMatrixを使って基底
について行列
を構築する:
basis = {1, z, z ^ 2, z ^ 3};
a = DesignMatrix[data, basis, z];
b = data[[All, 2]];With[{σ = 0.2, m = Length[basis]}, res = ConicOptimization[t, Norm[Inactive[Plus][a.λ, -b]] + σ Norm[λ, 1] < t, {t, Element[λ, Vectors[m, Complexes]]}]]
が
の実成分と複素成分の関数として定義されたフィットであるとする:
f[x_, y_] := basis.λ /. res /. z -> x + I y;Show[Plot3D[Re[f[x, y]], {x, -2, 2}, {y, -2, 2}], Graphics3D[{PointSize[0.03], Blue, Point[MapThread[Append, {ReIm[data[[All, 1]]], Re[data[[All, 2]]]}]]}]]Show[Plot3D[Im[f[x, y]], {x, -2, 2}, {y, -2, 2}], Graphics3D[{PointSize[0.03], Red, Point[MapThread[Append, {ReIm[data[[All, 1]]], Im[data[[All, 2]]]}]]}]]幾何問題 (5)
と
を中心とする半径1の2枚の円板の最短距離を求める.
は円板1の上の点,
は円板2の上の点とする.目的は,
を最小化することである.補助変数
を使うと目的は
に従って
を最小化することに変わる:
res = ConicOptimization[t, {c2 == {2, 1}, Norm[p1] ≤ 1, Norm[p2 - c2] ≤ 1, Norm[p1 - p2] ≤ t}, {t, p1∈Vectors[2], p2∈Vectors[2]}]Graphics[{{Lighter[Blue], Disk[]}, {Lighter[Red], Disk[{2, 1}]}, {Green, PointSize[0.03], Point[{p1, p2} /. res]}}]{t, EuclideanDistance[p1, p2]} /. res指定された領域を囲い込んでいる,半径
で中心が
の最小の球を求める:
region = [image];constraints = Table[Norm[Inactive[Plus][pi, -c]] ≤ r, {pi, MeshCoordinates[region]}];res = ConicOptimization[r, constraints, {r, c∈Vectors[3]}]Show[Graphics3D[{Opacity[0.2], Red, Ball[c, r] /. res}], region]囲い込んでいる最小の球はBoundingRegionを使って効率的に求められる:
BoundingRegion[region, "MinBall"]{Subscript[Ω, 1], Subscript[Ω, 2]} = IconizedObject[«Block»];
は
上の点,
は
上の点だとする.目的は,
を最小にすることである.補助変数
を使うと,目的は
に従って
を最小にすることに変わる:
res = ConicOptimization[t, {p1∈Subscript[Ω, 1], p2∈Subscript[Ω, 2], Norm[p1 - p2] ≤ t}, {p1, p2, t}]分離超平面定理によると,制約条件
に関連付けられた双対は超平面の法線を与えるという:
{dual, cones} = ConicOptimization[t, {p1∈Subscript[Ω, 1], p2∈Subscript[Ω, 2], Norm[p1 - p2] ≤ t}, {p1, p2, t}, {"DualMaximizer", "ConicConstraintConeSpecifications"}];pos = Position[cones, {"NormCone", _}];
planeNormal = First@Extract[dual, pos]plane = Hyperplane[Most[planeNormal], (p1 + p2) / 2 /. res]Show[Subscript[Ω, 1], Subscript[Ω, 2], Graphics[{{Point[{p1, p2} /. res]}, {Red, plane}}]]凸多角形にフィットすることができる,
としてパラメータ化された最大面積の楕円を求める:
cmesh = ConvexHullMesh[IconizedObject[«With»]];凸多角形の各線分は半平面
の交点として表すことができる.線形不等式を抽出する:
segs = MeshPrimitives[cmesh, 1][[All, 1]];
a = segs /. {p_, q_} :> {-1, 1} * Reverse[p - q];
b = MapThread[#1.#2&, {a, segs[[All, 1]]}];半平面にパラメータ化を適用すると,
が与えられる.項は
である.したがって制約条件は
である:
constraints = Table[Norm[a[[i]].c] + a[[i]].d ≤ b[[i]], {i, Length[a]}];res = ConicOptimization[-Tr[c], constraints, {c∈Matrices[{2, 2}], d}]inscribedEllipse = Ellipsoid[d, Transpose[c].c] /. resShow[cmesh, Graphics[{LightRed, inscribedEllipse}]]凸多角形の解析的中心を求める.解析的中心は制約条件までの距離の積を最大にする点である:
cmesh = ConvexHullMesh[IconizedObject[«With»]];凸多角形の各線分は半平面
の交点として表すことができる.線形不等式を抽出する:
{a, b} = LinearOptimization[0, x∈cmesh, x, "LinearInequalityConstraints"];目的は
を最小化することである.
を取って目的関数を否定する.目的は
に変わる:
obj = Total[Table[-Log[a[[i]].x + b[[i]]], {i, Length[a]}]];補助変数
を使って変形された目的は,制約条件
に従って
を最小化することである:
res = ConicOptimization[t, obj ≤ t, {t, x}, Method -> {"SCS", Tolerance -> 10 ^ -7}]Show[cmesh, Graphics[{PointSize[0.02], Point[x /. res]}]]分類問題 (3)
{set1, set2} = IconizedObject[«Block»];分離するためには,集合1は
を,集合2は
を満足しなければならない:
constraints = {set1.a + b1, set2.a + b-1};目的は,
と
の間の厚みの2倍を与える
を最小化することである.補助変数
を使うと,目的は制約条件
に変わる:
res = ConicOptimization[t, {Norm[a] ≤ t, constraints}, {t, a, b}]line = a.{x, y} + b /. resShow[RegionPlot[line ≤ 0, {x, 0, 1}, {y, 0, 1}], ListPlot[{set1, set2}, PlotMarkers -> {Automatic, PointSize[0.025]}]]{set1, set2} = IconizedObject[«Block»];
dataplot = ListPointPlot3D[{set1, set2}, Sequence[...]]DesignMatrixを使って,2つの集合のための二次多項式データ行列を構築する:
{data1, data2} = DesignMatrix[#, {x, x^2, y, y^2, x y}, {x, y}]& /@ {set1, set2};分離するためには,集合1は
を,集合2は
を満足しなければならない:
constraints = {data1.a + b1, data2.a + b-1};
を最小化することで分離多項式を求める.補助変数
を使うと,変形された目的は追加的な制約条件
に従って
を最小化することになる:
res = ConicOptimization[t, {Norm[a] ≤ t, constraints}, {t, a, b}]poly = (a.{1, x, x^2, y, y^2, x y} + b) /. resShow[dataplot, ContourPlot3D[poly == 0, {x, -1.5, 1.5}, {y, -1.5, 1.5}, {z, -1, 1}, Sequence[...]]]与えられた点の集合
を別の集合に分割する.これは,
を最小化することで,各集合の中心
を求めることによってなされる.ただし,
は与えられたローカルカーネルであり
は与えられたペナルティパラメータである:
x = IconizedObject[«Block»];
{n, dim} = Dimensions[x];
centers = Array[c, n];カーネル
は,もし
ならば
,それ以外では
の
最近傍(
)関数である.この問題のために
最近傍が選ばれた:
kNN = Nearest[x -> Automatic][x, 10];
κ = SparseArray[Join@@Table[Thread[{i, kNN[[i]]}], {i, n}] -> 1, {n, n}];補助変数
を使うと,目的は制約条件
に従って
を最小化することに変わる:
c1 = Table[Norm[Inactive[Plus][x[[i]], -c[i]]], {i, n}];
c2 = Flatten[Table[κ[[i, j]]Norm[c[i] - c[j], 1], {i, 1, n}, {j, i + 1, n}]];
constraint = Total[c1 ^ 2] / 2 + 10 Total[c2] ≤ t;vars = Join[{t}, Table[c[i]∈Vectors[dim, Reals], {i, n}]];
res = ConicOptimization[t, constraint, vars, PerformanceGoal -> "Speed"];各データ点に対応する中心が存在する.同じ集合に属するデータは同じ中心を持つ:
allCenters = centers /. res;
cvals = Map[First, Gather[allCenters, Norm[#1 - #2] ≤ 0.001&]]gpts = Table[Pick[x, Map[Norm[# - ci] ≤ 0.001&, allCenters]], {ci, cvals}];
Show[ListPlot[gpts, PlotStyle -> PointSize[0.02]], ListPlot[allCenters, PlotStyle -> {PointSize[0.03], Magenta}]]最適制御問題 (1)
A = (| | |
| ---- | ---- |
| 2 | -0.5 |
| -0.3 | 2 |);
g[t_] := {Cos[t], Sin[t]};最小化関数積分は台形規則を使って近似できる.離散化された目的関数は,追加的な条件
に従って
になる:
{ti, wts} = 2Pi Most[IconizedObject[«NIntegrate`TrapezoidalRuleData»]];
W = DiagonalMatrix[SparseArray[wts]];
n = Length[ti];dTMat = IconizedObject[«NDSolve`FiniteDifferenceDerivative[1, ti, DifferenceOrder -> 2]»];
ode1 = dTMat.x1 == A[[1]].{x1, x2} + u1;
ode2 = dTMat.x2 == A[[2]].{x1, x2} + u2;初期条件の制約
はIndexedを使って指定できる:
ics = {Indexed[x1, 1] == 0, Indexed[x2, 1] == 0};補助変数
を使って,
に従って
を最小化するように目的変数が変換された:
{g1, g2} = g[ti];
res = ConicOptimization[t, {ode1, ode2, ics, y.W.y + z.W.zt, y == Inactive[Plus][g1, -x1], z == Inactive[Plus][g2, -x2], -2u12, -2u22}, {u1∈Vectors[n], u2∈Vectors[n], x1, x2, y, z, t}];離散化された結果をInterpolatingFunctionに変換する:
{u1sol, u2sol, x1sol, x2sol} = Map[ListInterpolation[#, ti]&, {u1, u2, x1, x2} /. res];Plot[{u1sol[t], u2sol[t]}, {t, 0, 2Pi}]状態変数をプロットする.状態変数は関数
を追跡しようとする:
{Plot[{x1sol[t], Cos[t]}, {t, 0, 2Pi}, ImageSize -> 200], Plot[{x2sol[t], Sin[t]}, {t, 0, 2Pi}, ImageSize -> 200]}施設配置問題 (1)
さまざまな携帯電話の基地局
の位置と
にいるクライアントにサービスを届けるために必要な範囲
を求める:
clientPos = {{0, 0}, {1, 0}, {3 / 2, 1}, {-1 / 2, 1}, {1 / 2, 3 / 2}, {1 / 2, 1 / 2}, {0, 3 / 2}, {1, 1}, {0, 1}, {3 / 2, 3 / 2}};
nTowers = 3;
nClients = Length[clientPos];各基地局は,
で与えられるその範囲に比例して電力を消費する.目的は電力消費を最小にすることである:
objective = Sum[r[i] ^ 1.5, {i, nTowers}];
を,基地局
でクライアント
がカバーされるならば
であることを示す決定変数とする:
decisionConstraint = 0z1;各基地局は,その範囲でクライアントのある部分をカバーする位置になければならない:
m = 20;
distConstraint = Table[Norm[Inactive[Plus][p[j], -clientPos[[i]]]] -
m * (1 - Indexed[z, {i, j}]) ≤ r[j], {i, nClients}, {j, nTowers}];coverageConstraint = Total[z, {2}]1;maxCoverageConstraint = Table[0 ≤ r[j] ≤ 1, {j, nTowers}];vars = Flatten[{Table[{p[j]∈Vectors[2], r[j]}, {j, nTowers}], z∈Matrices[{nClients, nTowers}, Integers]}];res = Quiet[ConicOptimization[t, {objective ≤ t, decisionConstraint,
distConstraint, coverageConstraint, maxCoverageConstraint}, Append[vars, t]]]towerPos = Table[p[i], {i, nTowers}] /. res;
towerRange = Table[r[i], {i, nTowers}] /. res;Graphics[{{Orange, PointSize[0.04], Point[towerPos]}, {Magenta, PointSize[0.02], Point[clientPos]}, {...}}, Frame -> True]ポートフォリオの最適化 (1)
リスクが最小でリターンか最大になるような,資本
の6つの株式への投資配分を求める:
{μ, Σ} = Block[...];リターンは
で与えられる.ただし,
は個別の株式の予想収益の値のベクトルである:
return = μ.w;リスクは
で与えられる.
はリスク回避パラメータであり,
である:
risk = w.Σ.w;
riskConstraint = risk ≤ s;目標は,指定されたリスク回避パラメータについてリスクを最小にしつつリターンを最大にすることである:
objective[α_ ? NumericQ] := -(return - α s);株式の売買による株式の市場価格は
でモデル化される.これは,エピグラフ変換を使ったPower Coneによってモデル化できる:
marketConstraints = Table[Abs[Indexed[w, i]] ^ 1.5 ≤ Indexed[t, i], {i, 6}];重み
はどれも0より大きくなければならず,重みに市場影響コストを加えたものは1でなければならない:
weightConstraints = {w0, Total[w] + 0.1Total[t] == 1};リスク回避パラメータの範囲について,利益と対応するリスクを計算する:
frontier = Table[res = Quiet@ConicOptimization[objective[α],
{riskConstraint, weightConstraints, marketConstraints}, {w, s, t∈Vectors[6]}];
{risk, return} /. res, {α, Subdivide[0, 10, 200]}];範囲
での最適な
は,リスクとリターンのトレードオフの上界包絡線を与える:
randomRiskReturns = Table[{risk, return}, {w, Table[...]}];
Show[ListPlot[frontier, ...], ListPlot[randomRiskReturns, Rule[...]]]riskAversionParameter = N@{1 / 1000, 1 / 100, 1 / 2, 1, 5, 10, 15, 20};
res = Table[{α, return, Quiet@Append[w, 1 - Total[w]]} /.
Quiet@ConicOptimization[objective[α],
{riskConstraint, weightConstraints, marketConstraints}, {w, s, t∈Vectors[6]}], {α, riskAversionParameter}];市場コストを計上することで,低リスク回避のための多様化したポートフォリオが得られるが,リスク回避が高い場合は,多様化されていない株式を購入するため,市場への影響コストが支配的になる:
Legended[BarChart[res[[All, -1]], ...], SwatchLegend[...]]特性と関係 (8)
ConicOptimizationは目的関数の大域的最小値を与える:
res = ConicOptimization[2Subscript[x, 1] + 3Subscript[x, 2], (| | |
| -- | -- |
| x1 | 1 |
| 1 | x2 |)Underscript[, {"SemidefiniteCone", 2}]0, {Subscript[x, 1], Subscript[x, 2]}]Show[Plot3D[2Subscript[x, 1] + 3Subscript[x, 2], {Subscript[x, 1], Subscript[x, 2]}∈ImplicitRegion[...]], Graphics3D[...]]Minimizeは錐問題についての大域的厳密結果を与える:
Minimize[{2Subscript[x, 1] + 3Subscript[x, 2], (| | |
| -- | -- |
| x1 | 1 |
| 1 | x2 |)Underscript[, {"SemidefiniteCone", 2}]0}, {Subscript[x, 1], Subscript[x, 2]}]%//NNMinimizeを使って,大域メソッドを使った近似結果を得ることができる:
NMinimize[{2Subscript[x, 1] + 3Subscript[x, 2], (| | |
| -- | -- |
| x1 | 1 |
| 1 | x2 |)Underscript[, {"SemidefiniteCone", 2}]0}, {Subscript[x, 1], Subscript[x, 2]}]FindMinimumを使って,局所メソッドを使った近似結果を得ることができる:
FindMinimum[{2Subscript[x, 1] + 3Subscript[x, 2], (| | |
| -- | -- |
| x1 | 1 |
| 1 | x2 |)Underscript[, {"SemidefiniteCone", 2}]0}, {Subscript[x, 1], Subscript[x, 2]}]SemidefiniteOptimizationはConicOptimizationの特殊ケースである:
SemidefiniteOptimization[10x + 11y, {x + y ≥ 2, (| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0}, {x, y}]ConicOptimization[10x + 11y, {x + y ≥ 2, (| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0}, {x, y}]SecondOrderConeOptimizationはConicOptimizationの特殊ケースである:
SecondOrderConeOptimization[10x + 11 y, {x + y ≥ 1, {x, y}∈Disk[]}, {x, y}]ConicOptimization[10x + 11 y, {x + y ≥ 1, {x, y}∈Disk[]}, {x, y}]QuadraticOptimizationは ConicOptimizationの特殊ケースである:
obj = 2x^2 + 20y^2 + 6x y + 5x;
cons = {-x + y ≥ 2, y ≥ 0};QuadraticOptimization[obj, cons, {x, y}]ConicOptimization[t, {obj ≤ t, cons}, {x, y, t}]LinearOptimizationはConicOptimizationの特殊ケースである:
LinearOptimization[10.x + 11.y, {x, y}∈RegularPolygon[4], {x, y}]ConicOptimization[10.x + 11.y, {x, y}∈RegularPolygon[4], {x, y}]考えられる問題 (6)
最適点における制約条件はある程度の許容度まで満足するものと期待される:
res = ConicOptimization[x + y, {x^2 + y^2 ≤ 1}, {x, y}]x^2 + y^2 ≤ 1 /. resx^2 + y^2 - 1 /. res制約条件違反はしばしばToleranceオプションで制御される:
res = ConicOptimization[x + y, {x^2 + y^2 ≤ 1}, {x, y}, Tolerance -> 10 ^ -8]x^2 + y^2 - 1 /. res空集合あるいは実行不可能な問題の最小値は
であると定義される:
ConicOptimization[x, {x ≤ 0, x ≥ 1}, x, "PrimalMinimumValue"]ミニマイザはIndeterminateである:
ConicOptimization[x, {x ≤ 0, x ≥ 1}, x]ConicOptimization[-(x + y), x + y ≥ 1, {x, y}, "PrimalMinimumValue"]ミニマイザはIndeterminateである:
ConicOptimization[-(x + y), x + y ≥ 1, {x, y}]下手にスケールされた問題の結果は大きい誤差を含む可能性がある:
ConicOptimization[x + y + z, {x ^ 2 + y ^ 2 + z ^ 2 ≤ 10 ^ 20, x > 5, y > 5}, {x, y, z}]Minimize[{x + y + z, {x ^ 2 + y ^ 2 + z ^ 2 ≤ 10 ^ 20, x ≥ 5, y ≥ 5}}, {x, y, z}][[2]]//N
を10-10でスケールした後では,以下の問題と数学的に等しくなる:
ConicOptimization[x + y + z, {x ^ 2 + y ^ 2 + z ^ 2 ≤ 1, x > 5*^-10, y > 5*^-10}, {x, y, z}]5*10-10の±10-6の範囲での
と
についての任意の結果は許容度10-6の範囲に収まり,スケールバックした際の誤差は最大で以下のようになる:
10 ^ 10 * 10 ^ -6前のスケールされた問題を解くことも,デフォルトの許容度をより小さくすることもできる:
ConicOptimization[x + y + z, {x ^ 2 + y ^ 2 + z ^ 2 ≤ 10 ^ 20, x > 5, y > 5}, {x, y, z}, Tolerance -> 10 ^ -13]混合整数問題についての双対に関連した解の特性は得られないかもしれない:
ConicOptimization[t, {2x^2 + 20y^2 + 6x y + 5x ≤ t, -x + y ≥ 2}, {x∈Integers, y, t}, {"DualMaximumValue", "DualMaximizer", "DualityGap"}]複素値を含む制約条件はベクトル不等式で指定しなければならない:
{q, c} = {{{2, 1 + I}, {1 - I, 1}}, {2, 3}};
ConicOptimization[{1, 2}.x, (1 / 2) * x.q.x + c.x1, x∈Vectors[2, Reals]]Lessを使うだけでは,理論的に両辺が実数であってもうまくいかない:
{q, c} = {{{2, 1 + I}, {1 - I, 1}}, {2, 3}};
ConicOptimization[{1, 2}.x, (1 / 2) * x.q.x + c.x < 1, x∈Vectors[2, Reals]]テクニカルノート
関連するガイド
-
▪
- 凸最適化 ▪
- 行列ベースの最小化 ▪
- 最適化 ▪
- 記号的なベクトル,行列,配列
テキスト
Wolfram Research (2019), ConicOptimization, Wolfram言語関数, https://reference.wolfram.com/language/ref/ConicOptimization.html (2020年に更新).
CMS
Wolfram Language. 2019. "ConicOptimization." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2020. https://reference.wolfram.com/language/ref/ConicOptimization.html.
APA
Wolfram Language. (2019). ConicOptimization. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/ConicOptimization.html
BibTeX
@misc{reference.wolfram_2026_conicoptimization, author="Wolfram Research", title="{ConicOptimization}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/ConicOptimization.html}", note=[Accessed: 16-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_conicoptimization, organization={Wolfram Research}, title={ConicOptimization}, year={2020}, url={https://reference.wolfram.com/language/ref/ConicOptimization.html}, note=[Accessed: 16-October-2026]}