NMinimize
詳細とオプション
- NMinimizeは大域的最適化(GO)としても知られている.
- NMinimizeは,与えられた制約条件に従って常に f の最小値を求めようとする.
- NMinimizeは,通常,制約が与えられた場合に可能な最小値を求めるために使われる.分野によっては,最適な戦略,最良適合,最適な構成等と呼ばれることがある.
- NMinimizeは{fmin,{x->xmin,y->ymin,…}}の形のリストを返す.
- f および cons が線形または凸のとき,NMinimizeが与える結果は実数および整数値の両方の上で最小値になる.それ以外の場合は結果が単に極小値であるかもしれない.
- NMinimizeが制約条件を満足できないと判断した場合は{Infinity,{x->Indeterminate,…}}が返される.
- NMinimizeは,目的関数 f と制約条件 cons がスカラー変数またはベクトル変数に依存する式で与えられるモデリング言語をサポートする.f と cons は,一般に,非常に効率的な形に解析されるが,f と cons の項が変数の数値に対して数値を与える限りNMinimizeはしばしば解を求めることができる.
- 制約条件 cons は以下の論理結合でよい.
-
lhs==rhs 等式 lhs>rhs, lhs≥rhs, lhs<rhs, lhs≤rhs 不等式 (LessEqual, …) lhsrhs, lhsrhs, lhsrhs, lhsrhs ベクトル不等式 (VectorLessEqual, …) {x,y,…}∈reg 領域指定 - NMinimize[{f,cons},x∈rdom]は,事実上,NMinimize[{f,cons&&x∈rdom},x]に等しい.
- x∈rdom については,Indexed[x,i]を使って別の座標に言及することができる.
- 次は,使用可能な領域 rdom である.
-
Reals 実数スカラー変数 Integers 整数スカラー変数 Vectors[n,dom]
のベクトル変数Matrices[{m,n},dom]
の行列変数ℛ 幾何学領域
に制限されたベクトル変数 - デフォルトでは,すべての変数が実数であると仮定される.
- 指定可能なオプション
-
AccuracyGoal Automatic 目標となる最終確度桁数 EvaluationMonitor None f が評価されたときに常に評価される式 MaxIterations Automatic 使用する最大反復回数 Method Automatic 使用されるアルゴリズム PrecisionGoal Automatic 目標となる最終精度桁数 StepMonitor None ステップを取るたびに常に評価される式 WorkingPrecision MachinePrecision 内部計算に使用する精度 - AccuracyGoalとPrecisionGoalの設定で最小値の位置の値と最小になったときの関数の値の両方で目標とする桁数を指定する.
- NMinimizeはAccuracyGoalとPrecisionGoalで指定された目標値のどちらかが達成されるまで計算を続ける.
- NMinimizeのためのメソッドには2つのクラスがある.最初のクラスは問題の特性を使うので,メソッドが収束する際に求まった最小値は大域的であることが保証される.2番目のクラスは発見的なメソッドで,複数の局所探索を使うことがあるが,一般的には確率論によって調整され,大域的最小値に焦点が当てられる.このメソッドもしばしば大域的な最小値を求めるが,必ずそうするとは保証されない.
- 次は,解に収束する場合に最小値を与えることが保証されているメソッドである.
-
"Convex" 凸法だけを使う "MOSEK" 凸問題用の商用MOSEKライブラリを使う "Gurobi" 凸問題用の商用Gurobiライブラリを使う "Xpress" 凸問題用の商用Xpressライブラリを使う - 次は,発見的な方法である.
-
"NelderMead" Nelder・Meadのシンプレックス法 "DifferentialEvolution" 差分進化を使う "SimulatedAnnealing" 焼きなまし法を使う "RandomSearch" 複数のランダムな初期点から始めて求まった最良の極小値を使う "Couenne" 非凸混合整数非線形問題にCouenneライブラリを使用する
例題
すべて開く すべて閉じる例 (3)
NMinimize[x ^ 4 - 3x ^ 2 - x, x]x /. Last[NMinimize[x ^ 4 - 3x ^ 2 - x, x]]NMinimize[{x ^ 2 - (y - 1) ^ 2, x ^ 2 + y ^ 2 ≤ 4}, {x, y}]NMinimize[{E ^ (Sin[50 x]) + Sin[60 E ^ y] + Sin[70 Sin[x]] + Sin[Sin[80 y]] - Sin[10 (x + y)] + 1 / 4 (x ^ 2 + y ^ 2), x ^ 2 + y ^ 2 ≤ 1}, {x, y}]NMinimize[x + y, {x, y}∈Disk[]]Show[ContourPlot[x + y, {x, y}∈Disk[]], Graphics[{Red, PointSize[Large], Point[{x, y} /. Last[%]]}]]スコープ (40)
基本的な用法 (12)
NMinimize[{x + 2y, x^2 + 2y^2 ≤ 3, x + y == 2, x ≥ 1}, {x, y}]いくつかの線形不等式条件はVectorGreaterEqualで表すことができる:
NMinimize[{x + y, VectorGreaterEqual[{{x + 2y, x}, {3, -1}}]}, {x, y}]
v>=
または \[VectorGreaterEqual]を使ってベクトル不等式の記号を入力する:
NMinimize[{x + y, {x + 2y, x}{3, -1}}, {x, y}]NMinimize[{x + y, x + 2y ≥ 3, x ≥ -1}, {x, y}]NMinimize[{{1, 1}.v, {{1, 2}, {1, 0}}.v{3, -1}}, v]
にスレッディングの可能性があるので,不等式
は
とは等しくないかもしれない:
NMinimize[{{1, 1}.x, {{1, 2}, {1, 0}}.x + {-3, 1}0}, x]NMinimize[{{1, 1}.x, {{1, 2}, {1, 0}}.x{3, -1}}, x]
での意図しないスレッディングを避けたければInactive[Plus]を使うとよい:
NMinimize[{{1, 1}.x, {{1, 2}, {1, 0}}.x + {-3, 1}0}, x]定数パラメータを持つ方程式を使って
での意図しないスレッディングを回避する:
parEqs = {a == {{1, 2}, {1, 0}}, b == {3, -1}};NMinimize[{{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}]NMinimize[{{1, 1}.v, constraint}, v]NMinimize[{x + y, x^2 + y^2 ≤ 9}, {x, y}]"NormCone"で錐不等式を使って制約条件
を指定する:
constraint = VectorGreaterEqual[{{x, y, 3}, 0}, {"NormCone", 3}]NMinimize[{x + y, constraint}, {x, y}]{a, b} = {{{1, 1, 0}, {0, 1, 1}, {1, 1, 1}}, {2, 2, -1}};Indexedを使ってベクトル変数の成分(例:
)にアクセスする:
NMinimize[{Total[x], a.xb, Indexed[x, 1] ≥ 1}, x]ベクトル変数の次元と領域が曖昧なときはVectors[n,dom]を使って指定する:
NMinimize[{Indexed[x, {1}] + 2Indexed[x, {2}], (| | |
| --------------- | --------------- |
| Indexed[x, {1}] | 1 |
| 1 | Indexed[x, {2}] |)Underscript[, {"SemidefiniteCone", 2}]0}, x]NMinimize[{Indexed[x, {1}] + Indexed[2x, {2}], (| | |
| --------------- | --------------- |
| Indexed[x, {1}] | 1 |
| 1 | Indexed[x, {2}] |)Underscript[, {"SemidefiniteCone", 2}]0}, x∈Vectors[2, Reals]]NonNegativeReals (
)を使って非負の制約条件を指定する:
NMinimize[{{1, 1}.x, {Indexed[x, {1}], Indexed[x, {2}], 1}Underscript[, {"NormCone", 3}]0}, x∈Vectors[2, NonNegativeReals]]NMinimize[{{1, 1}.x, {Indexed[x, {1}], Indexed[x, {2}], 1}Underscript[, {"NormCone", 3}]0, x0}, x]NonPositiveReals (
)を使って非正の制約条件を指定する:
NMinimize[{-Total[v], {1, 2}.v-3}, v∈Vectors[2, NonPositiveReals]]NMinimize[{-Total[v], {1, 2}.v-3, v0}, v]Orという条件を指定することができる:
NMinimize[{x + y, x ^ 2 + y ^ 2 ≤ 1 || (x + 2) ^ 2 + (y + 2) ^ 2 ≤ 1}, {x, y}]//Quiet領域制約1 (4)
Integersを使って整数領域の制約を指定する:
NMinimize[{x + y, x + 2y ≥ 3, x ≥ -2}, {x∈Integers, y∈Integers}]Vectors[n,Integers]を使ってベクトル変数に整数領域の制約を指定する:
NMinimize[{Total[x], a == {{1, 2}, {1, 0}}, b == {3, -2},
a.xb}, x∈Vectors[2, Integers]]NonNegativeIntegers (
)を使って非負の整数領域の制約を指定する:
NMinimize[{x + 2y, x^2 + 2y^2 ≤ 3, x + y == 2, x∈NonNegativeIntegers}, {x, y}]NonPositiveIntegers (
)を使って非正の整数領域の制約を指定する:
NMinimize[{-x + y, x + 2y ≥ 3, x∈NonPositiveIntegers}, {x, y}]領域制約2 (5)
t = RotationTransform[{{0, 0, 1}, {1, 1, 1}}];
ℛ = TransformedRegion[Ellipsoid[{0, 0, 0}, {1, 2, 3}], t];NMinimize[z, {x, y, z}∈ℛ]Graphics3D[{{Opacity[0.5], Green, GeometricTransformation[Ellipsoid[{0, 0, 0}, {1, 2, 3}], t]}, {Red, PointSize[Large], Point[{x, y, z} /. Last[%]]}}]Subscript[ℛ, 1] = Disk[];
Subscript[ℛ, 2] = InfiniteLine[{{-2, 0}, {0, 2}}];NMinimize[EuclideanDistance[{x, y}, {u, v}], {{x, y}∈Subscript[ℛ, 1], {u, v}∈Subscript[ℛ, 2]}]Graphics[{{LightBlue, Subscript[ℛ, 1]}, {Green, Subscript[ℛ, 2]}, {Red, Point[{{x, y}, {u, v}} /. Last[%]]}}]Subscript[ℛ, 1] = Triangle[{{0, 0}, {1, 0}, {0, 1}}];
Subscript[ℛ, 2] = Disk[{1, 1}, {2r, r}];NMinimize[{r, {x, y}∈Subscript[ℛ, 1] && {x, y}∈Subscript[ℛ, 2]}, {r, x, y}]Graphics[{{LightBlue, Subscript[ℛ, 1], Subscript[ℛ, 2]}, {Red, Point[{x, y}]}} /. Last[%]]Subscript[ℛ, 3] = Disk[{a, b}, r];NMinimize[{r, ({0, 0} | {1, 0} | {0, 1})∈Subscript[ℛ, 3]}, {a, b, r}]Graphics[{{LightBlue, Subscript[ℛ, 3]} /. %[[2]], {Red, Point[{{0, 0}, {1, 0}, {0, 1}}]}}]Circumsphereを使うと,同じ結果が直接与えられる:
Circumsphere[{{0, 0}, {1, 0}, {0, 1}}]//Nℛ = Sphere[];NMinimize[x.{1, 2, 3}, x∈ℛ]線形問題 (5)
線形の目的関数と制約条件がある場合は,最小値が見付かるとそれは大域的になる:
NMinimize[{x + y, 3x + 2y ≥ 7 && x + 2y ≥ 6 && x ≥ 0 && y ≥ 0}, {x, y}]NMinimize[{x - y, x + y + z == 1 / 2, x - 2z == 1, 2x - y ≥ 1}, {x, y, z}]Equalを使っていくつかの等式制約を一度に表現する:
NMinimize[{x - y, {x + y, x - y} == {1 / 2, 1}}, {x, y}]NMinimize[{x - y, x + y == 1 / 2, x - y == 1}, {x, y}]VectorLessEqualを使っていくつかのLessEqual不等式制約を一度に表現する:
NMinimize[{x + y, VectorLessEqual[{{x - 2y, -x + y}, {3, 2}}]}, {x, y}]NMinimize[{x + y, {x - 2y, -x + y}{3, 2}}, {x, y}]NMinimize[{x + y, {x - 2y ≤ 3, -x + y ≤ 2}}, {x, y}]Intervalを使って変数の境界を指定する:
NMinimize[{x + y, x + 2y ≥ 3}, {x∈Interval[{-1, 2}], y∈Interval[{-1, 1}]}]凸問題 (7)
"NonNegativeCone"を使って
の形の線形関数を指定する:
NMinimize[{Total[x],
VectorGreaterEqual[{{{-1, -1 / 2}, {1, -1 / 2}, {0, 1}}.x, {-1 / 2, -1 / 2, -1 / 2}}, {"NonNegativeCone", 3}]}, x]NMinimize[{Total[x], {{-1, -(1/2)}, {1, -(1/2)}, {0, 1}}.x-(1/2)}, x]NMinimize[{(x - 1)^2 + y^2, x + y / 2 ≤ 1 / 2, x - y ≥ 0}, {x, y}]ContourPlot[(x - 1)^2 + y^2, {x, -1, 1}, {y, -1, 1 / 2}, ...]res = NMinimize[{(x - 1)^2 + y^2, x^2 + (y^2/2) ≤ (1/2), 2x^2 ≤ 3y}, {x, y}]Show[Plot3D[(x - 1)^2 + y^2, {x, -1, 1}, {y, 0, 1}, ...], Graphics3D[{Red, PointSize[0.03], Point[{x, y, (x - 1)^2 + y^2} /. res[[2]]]}]]Subscript[ℛ, 1] = Triangle[{{1, 1}, {2, 1}, {1, 2}}];
Subscript[ℛ, 2] = Disk[];NMinimize[EuclideanDistance[x, y], {x∈Subscript[ℛ, 1], y∈Subscript[ℛ, 2]}]Graphics[{{LightBlue, Subscript[ℛ, 1], Subscript[ℛ, 2]}, {Red, Point[{x, y}]}} /. %[[2]]]res = NMinimize[{10x + 11 y, (| | |
| - | - |
| x | 1 |
| 1 | y |)Underscript[, {"SemidefiniteCone", 2}]0}, {x, y}]Show[Plot3D[10x + 11y, {x, 0, 5}, {y, 0, 5}, ...], Graphics3D[{Red, PointSize[0.05], Point[{x, y, 10x + 11y} /. res[[2]]]}]]res = NMinimize[{-Log[x + y], (| | |
| ----- | ----- |
| x + y | 1 |
| 1 | x - y |)Underscript[, {"SemidefiniteCone", 2}]0, 1 ≤ x ≤ 10, -1 ≤ y ≤ 1}, {x, y}]Show[Plot3D[-Log[x + y], {x, 1, 10}, {y, -1, 1}, ...], Graphics3D[{Red, PointSize[0.05], Point[{x, y, -Log[x + y]} /. res[[2]]]}]]res = NMinimize[{(x - 2)^2 + (y - 1 / 2)^2, Inactive[Norm][{x, y}, 4] ≤ 1}, {x, y}]Show[Plot3D[(x - 2)^2 + (y - 1 / 2)^2, {x, -1, 1}, {y, -1, 1}, ...], Graphics3D[{PointSize[0.05], Point[{x, y, (x - 2)^2 + (y - (1/2))^2} /. res[[2]]]}]]凸に変換可能 (4)
面積が1で縦が最大でも横の1/2になるようにして長方形の外周を最小化する:
NMinimize[{2w + 2h, h w == 1, h ≤ (1/2)w, h ≥ 0, w ≥ 0}, {h, w}]この問題は対数凸関数で,変換{hExp[],wExp[ ]}を行なって対数を取って凸問題を得ることで解くことができる:
NMinimize[{Log[Exp[𝓌 + Log[2]] + Exp[𝒽 + Log[2]]], 𝒽 + 𝓌 == 0, 𝒽 - 𝓌 ≤ Log[1 / 2]}, {𝒽, 𝓌}]{Exp[First[%]], Thread[{h, w} -> Exp[{𝒽, 𝓌}] /. Last[%]]}不等式制約とノルム制約に従って擬似凸関数
を最小化する.目的関数は領域上の非負の関数と非正の関数の積なので,擬似凸関数である:
NMinimize[{-x y, x ≥ 0, y ≥ 0, Norm[{x - 1, y - 2}] ≤ 1}, {x, y}]擬似凸問題はパラメータ
についてのパラメトリック凸最適化問題として解くことができる:
pfun = ParametricConvexOptimization[0, {-x y ≤ α, x ≥ 0, y ≥ 0,
Norm[{x - 1, y - 2}] ≤ 1}, {x, y}, α, "PrimalMinimizerRules"]fun[α_ ? NumericQ] := -x * y /. pfun[α];
Plot[fun[α], {α, -4.68, 0}, PlotRange -> All]pfun[-4.68]pfun[-4.69]制約条件
に従って
を最小化する.目的関数は凸関数ではないが凸関数の差
で表すことができる.ただし,
と
は凸関数である:
res = NMinimize[{x ^ 2 - y ^ 2, Norm[{x, y}] <= 2}, {x, y}]Show[Plot3D[x ^ 2 - y ^ 2, {x, -2, 2}, {y, -2, 2}, ...], Graphics3D[{PointSize[0.04], Point[{x, y, x ^ 2 - y ^ 2} /. res[[2]]]}]]制約条件
に従って
を最小化する.制約条件
が凸ではないが凸制約条件
の差で表すことができる.ただし,
と
は凸関数である:
res = NMinimize[{x ^ 2 + y, 1 <= Norm[{x, y}] <= 2}, {x, y}]Show[Plot3D[x ^ 2 + y, {x, -2, 2}, {y, -2, 2}, ...], Graphics3D[{PointSize[0.04], Point[{x, y, x ^ 2 + y} /. res[[2]]]}]]一般的な問題 (3)
res = NMinimize[{x + y, Sin[2x] + Cos[3y] ≤ 1, Norm[{x, y}] ≤ 2}, {x, y}]Show[Plot3D[x + y, {x, -2, 2}, {y, -2, 2}, ...], Graphics3D[{Blue, PointSize[0.03], Point[{x, y, x + y} /. res[[2]]]}]]res = NMinimize[{Sin[2x] + Cos[x], -2 ≤ x ≤ 3}, x]Plot[Sin[2x] + Cos[x], {x, -2, 3}, Epilog -> {...}]res = NMinimize[{Sin[x^2 + y], Sin[2x] + Cos[3y] ≤ 1, Norm[{x^2, y}] ≤ 2}, {x, y}]Show[Plot3D[Sin[x^2 + y], {x, -2, 2}, {y, -2, 2}, ...], Graphics3D[{Blue, PointSize[0.03], Point[{x, y, Sin[x^2 + y]} /. res[[2]]]}]]オプション (10)
AccuracyGoalとPrecisionGoal (2)
NMinimize[Sin[Tan[x] / 2], x, AccuracyGoal -> 9, PrecisionGoal -> 8]次は,収束基準
と
を強制する.これはデフォルトの機械精度計算では達成できない:
NMinimize[Sin[Tan[x] / 2], x, AccuracyGoal -> 20, PrecisionGoal -> 18]WorkingPrecisionの設定値を高くするとプロセスが収束する:
NMinimize[Sin[Tan[x] / 2], x, AccuracyGoal -> 20, PrecisionGoal -> 18, WorkingPrecision -> 40]EvaluationMonitor (1)
関数の解を出す過程で評価したすべての点を環状の最小値で記録する:
f[x_, y_] := (x ^ 2 + y ^ 2 - 16) ^ 2;
{sol, pts} = Reap[
NMinimize[f[x, y], {{x, -5, 5}, {y, -5, 5}}, Method -> "DifferentialEvolution", EvaluationMonitor :> Sow[{x, y}]]];呼び出した点の中で目的関数の値において最終的な解に近いすべての点をプロットする:
ContourPlot[f[x, y], {x, -5, 5}, {y, -5, 5}, ColorFunction -> (Hue[.6(1 - #1)]&),
Epilog -> Map[Point, Cases[First[pts], x_ /; Abs[f@@x - First[sol]] ≤ .05]], Contours -> 4Range[0, 10] ^ 2]Method (5)
NMinimize[{Sin[.4 x ^ 2] + .7Cos[.6 x] x, -9 < x < 9}, {x}, Method -> #]& /@ {"NelderMead", "DifferentialEvolution", "SimulatedAnnealing"}この問題に対しては,自動選択されたメソッドが最適解を与える:
minSol = NMinimize[{Sin[.4 x ^ 2] + .7Cos[.6 x] x, -9 < x < 9}, {x}]自動メソッド選択がこの非凸問題に選ぶのは"Couenne"メソッドである:
minSol = NMinimize[{Sin[.4 x ^ 2] + .7Cos[.6 x] x, -9 < x < 9}, {x}, Method -> "Couenne"]Plot[Sin[.4 x ^ 2] + .7Cos[.6 x] x, {x, -9, 9}, Rule[...]]"Couenne"メソッドを使って複数の極小値を含む関数の最小値を求める:
fun = E^Sin[50x] + Sin[60 E^y] + Sin[70 Sin[x]] + Sin[Sin[80 y]] - Sin[10 (x + y)] + (x^2 + y^2) / 4;
res = NMinimize[Evaluate[fun], {x, y}, Method -> "Couenne"]Show[Plot3D[fun, ...], Graphics3D[{...}]]速度を求めるなら,たくさんの変数がある問題には"NelderMead"メソッドを使う:
n = 50;AbsoluteTiming[NMinimize[Sum[i * (x[i] - i) ^ 2 + Sin[x[i]], {i, 1, n}], Table[x[i], {i, 1, n}], Method -> "NelderMead"]]"Convex"メソッドあるいはExcept["Convex"]を使って凸法を使うかどうかを指定する:
NMinimize[x^2 + y^2, {x + y == 1, x ^ 2 + 5y ^ 2 < 1}, {x, y}, Method -> #]& /@ {"Convex", Except["Convex"]}"Couenne"メソッドあるいはExcept["Couenne"]を使ってCouenneソルバを選択するか除外するかする:
NMinimize[Sin[x^2 + y^2], {x + y == 1, x ^ 2 + 5y ^ 2 < 1}, {x, y}, Method -> #]& /@ {"Couenne", Except["Couenne"]}StepMonitor (1)
古典的なRosenbrock関数の最小値を求める際にNMinimizeが取ったステップ:
pts = Reap[NMinimize[(1 - x) ^ 2 + 100(-x ^ 2 - y) ^ 2, {x, y},
Method -> "NelderMead", StepMonitor :> Sow[{x, y}]]][[2, 1]];
pts = Join[{{-1.2, 1}}, pts];ContourPlot[(1 - x) ^ 2 + 100(-x ^ 2 - y) ^ 2, {x, -1.3, 1.5}, {y, -1.5, 1.4}, Epilog -> {Arrow[pts], Point[pts]}, Contours -> Table[10 ^ -i, {i, -2, 10}], ColorFunction -> (Hue[(Log[10, #] + 10) / 12]&), ColorFunctionScaling -> False]WorkingPrecision (1)
作業精度を
にする.デフォルトでAccuracyGoalとPrecisionGoalは
に設定されている:
NMinimize[Cos[x ^ 2 - 3 y] + Sin[x ^ 2 + y ^ 2], {x, y}, WorkingPrecision -> 20]アプリケーション (19)
幾何学の問題 (4)
と
を中心とする半径1の2つの円板間の最短距離を求める.
を円板1の上の点,
円板2の上の点とする.目的は制約条件
に従って
を最小化することである:
res = NMinimize[{Norm[p1 - p2], c2 == {2, 1}, Norm[p1] ≤ 1, Norm[p2 - c2] ≤ 1}, {p1∈Vectors[2, Reals], p2∈Vectors[2, Reals]}]Graphics[{{Lighter[Blue], Disk[]}, {Lighter[Red], Disk[{2, 1}]}, {Green, PointSize[0.03], Point[{p1, p2} /. res[[2]]]}}]region = [image];constraints = Table[Norm[Inactive[Plus][pi, -c]] ≤ r, {pi, MeshCoordinates[region]}];res = NMinimize[{r, constraints}, {r, c∈Vectors[3, Reals]}]Show[Graphics3D[{Opacity[0.2], Red, Ball[c, r] /. res[[2]]}], region]包み込む最小の球はBoundingRegionを使って効率的に求めることができる:
BoundingRegion[region, "MinBall"]3Dの点集合を体積を最小にして包み込む,
とパラメータ化できる最小の楕円体を求める:
pts = IconizedObject[«With»];constraints = Table[Norm[a.pi + b] ≤ 1, {pi, pts}];res = NMinimize[{-Log[Det[a]], constraints, aUnderscript[, {"SemidefiniteCone", 3}]0}, {a, b∈Vectors[3]}]{Σ, x0} = {Inverse[Transpose[a].a /. res[[2]]], -LinearSolve[a, b] /. res[[2]]};
minVolEllipsoid = Ellipsoid[x0, Σ]Graphics3D[{{Opacity[0.3], Red, Ellipsoid[x0, Σ]}, {PointSize[0.025], Point[pts]}}]境界楕円体(体積は必ずしも最小ではない)もBoundingRegionを使って求めることができる:
fastEllipsoid = BoundingRegion[pts, "FastEllipsoid"]{Volume[minVolEllipsoid], Volume[fastEllipsoid]}半径
(
)の重なり合ない
個の円が入る最小の正方形を求める.円の数と各円の半径を指定する:
n = 20;
r = BlockRandom[RandomReal[{0.5, 1.5}, n], RandomSeeding -> 234];
が円
の中心なら,目的は
を最小化することになる.目的は
と
を最小化するように変換できる:
objectiveConstraint = Table[-s <= Norm[c[i], Infinity] + r[[i]] <= s, {i, n}];nonOverlapConstraint = Table[Norm[c[i] - c[j]] >= r[[i]] + r[[j]],
{i, 1, n}, {j, i + 1, n}];vars = Append[Table[Element[c[i], Vectors[2, Reals]], {i, n}], Element[s, Reals]];Short[res = NMinimize[{s, objectiveConstraint, nonOverlapConstraint}, vars, Method -> "DifferenceOfConvex"], 5]Graphics[{Table[Circle[c[i], r[[i]]], {i, n}], {FaceForm[None], EdgeForm[StandardGray], Rectangle[{-s, -s}, {s, s}]}}] /. res[[2]]Sum[Area[Disk[c[i], r[[i]]]], {i, n}] / Area[Rectangle[{-s, -s}, {s, s}]] /. res[[2]]データフィッティング問題 (3)
与えられた行列 a とベクトル b について,
を制約条件
に従って最小にする:
{a, b} = IconizedObject[«Block»];NMinimize[{Norm[Inactive[Plus][a.x, -b]], x1}, 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 = NMinimize[{Norm[Inactive[Plus][a.λ, -b]], pointConstraints}, λ]Show[Plot[Evaluate[{1, x, x^2, x^3}.λ /. res[[2]]], {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 = NMinimize[{Norm[Inactive[Plus][a.λ, -b], 1], a == input, b == output}, λ]Plot[Evaluate[bases.λ /. res[[2]]], {x, -3, 3}, Epilog -> {PointSize[0.008], Point[data]}]Plot[{Sin[2x] + Cos[x ^ 2], Evaluate[bases.λ /. res[[2]]]}, {x, -3, 3}, PlotLegends -> {"Reference", "SubscriptBox[L, 1]fit"}]分類問題 (5)
{set1, set2} = IconizedObject[«Block»];分離するためには,集合1は
を,集合2は
を満足しなければならない:
constraints = {set1.a + b1, set2.a + b-1};目的は
と
の間の厚みの2倍を与える
を最小化することである:
res = NMinimize[{Norm[a], constraints}, {a, b}]line = a.{x, y} + b /. res[[2]]Show[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 = NMinimize[{Norm[a], constraints}, {a, b}, PrecisionGoal -> 3]poly = (a.{1, x, x^2, y, y^2, x y} + b) /. res[[2]]Show[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 = Indexed[μ, #]& /@ Range[n];カーネル
は,
でそれ以外は
となるような
-最近傍 (
) 関数である.この問題のために
の最近傍が選択されている:
kNN = Nearest[x -> Automatic][x, 10];
κ = SparseArray[Join@@Table[Thread[{i, kNN[[i]]}], {i, n}] -> 1, {n, n}];c1 = Table[Norm[Inactive[Plus][Indexed[x, {i}], -Indexed[μ, {i}]]], {i, n}];
c2 = Flatten[Table[κ[[i, j]]Norm[Indexed[μ, {i}] - Indexed[μ, {j}], 1], {i, 1, n}, {j, i + 1, n}]];
objective = Total[c1 ^ 2] / 2 + 10 Total[c2];vars = Table[Indexed[μ, {i}]∈Vectors[dim, Reals], {i, n}];res = NMinimize[objective, vars];各データ点に対応する中心がある.同じ群に属するデータは同じ中心値を持つ:
allCenters = centers /. res[[2]];
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}]]正の整数のリストを与えられたときに,このリストを重なり合ない2つの部分集合に分割する.ただし,2つの部分集合の合計の差を最小にしなければならない.リストを定義する:
n = 10;
list = BlockRandom[RandomInteger[{1, 1000}, n], RandomSeeding -> 123]値が–1か1であるバイナリ変数を定義する.リストの要素が部分集合1に属するなら,これに関連付けられたバイナリ変数の値は–1になる.部分集合2に関連付けられたバイナリ変数は1である:
vars = Table[x[i], {i, n}];
binaryConstraints = Table[{Abs[x[i]] == 1, x[i]∈Integers}, {i, 1, n}];objective = Abs[list . vars];NMinimize[objective, binaryConstraints, vars]重さが異なるオブジェクトの集合と2つの袋が与えられたとして,袋の可搬重量を超えない範囲で合計重量が最大になるように2つの袋に入れられるオブジェクトを求める.オブジェクトの数と重さを求める:
nObjects = 20;
weights = BlockRandom[RandomInteger[{1, 1000}, nObjects], RandomSeeding -> 123]オブジェクトを袋1に入れるか,袋2に入れるか,あるいはどちらでもないかを決定するためにバイナリ変数を使用する:
binaryConstraints = {0a1, 0b1, 0a + b1};weightConstraints = {0 <= weights.a <= 5000, 0 <= weights.b <= 5000};目的は,2つの袋に入るオブジェクトの重さを最大にすることである:
objective = -(weights.(a + b));sol = NMinimize[objective, {binaryConstraints, weightConstraints}, {a∈Vectors[nObjects, Integers], b∈Vectors[nObjects, Integers]}]バイナリ変数
は袋1に入るオブジェクトに関連付けられる.変数
は
の補集合である.袋に入ったオブジェクトの重さは以下の通りである:
Map[weights.# /. sol[[2]]&, {a, b}]画像処理 (1)
全変動ノルムの下で最も近い画像を求めることで,破損した画像を回復する:
image = ImageResize[ColorConvert[ExampleData[{"TestImage", "House"}], "Grayscale"], 75]40%のデータ点をランダムに削除することで破損画像を作成する:
data = ImageData[image];
SeedRandom[123];
mask = RandomChoice[{0.4, 0.6} -> {0, 1}, Dimensions[data]];
corruptedData = mask * data;
Image[corruptedData]目的は
を最小にすることである.ただし,
は画像データである:
{n, m} = Dimensions[data];objective = Total[Flatten[Table[Norm[{Indexed[u, {i + 1, j}] - Indexed[u, {i, j}], Indexed[u, {i, j + 1}] - Indexed[u, {i, j}]}], {i, n - 1}, {j, m - 1}]]];任意の非零のデータ点
は破損していないと仮定する.これらの点について,
と設定する:
knownPos = SparseArray[mask]["NonzeroPositions"];constraint = Map[Indexed[u, #] == data[[Sequence@@#]]&, knownPos];sol = NMinimize[{objective, constraint}, u∈Matrices[{n, m}, Reals]];Image[u /. sol[[2]]]施設の場所の問題 (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[Erf[r[i] ^ 1.5], {i, nTowers}];
を,クライアント
が携帯基地局
でカバーされるなら
であることを示す決定変数とする:
decisionConstraint = 0z1;各携帯基地局はその範囲がクライアントの何人かをカバーするような場所になければならない:
m = 20;
distConstraint = Table[Norm[{p[j, 1], p[j, 2]} - 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, 1], p[j, 2], r[j]}, {j, nTowers}], z∈Matrices[{nClients, nTowers}, Integers]}];Quiet[res = NMinimize[{objective, decisionConstraint,
distConstraint, coverageConstraint, maxCoverageConstraint}, vars]]towerPos = Table[{p[i, 1], p[i, 2]}, {i, nTowers}] /. res[[2]];
towerRange = Table[r[i], {i, nTowers}] /. res[[2]];各携帯基地局の位置とその範囲をクライアントの場所について可視化する:
Graphics[{{Orange, PointSize[0.04], Point[towerPos]}, {Green, PointSize[0.02], Point[clientPos]}, {...}}, Frame -> True]ポートフォリオの最適化 (1)
リスクが最小でリターンが最大になるような,資本
の6つの株式への投資配分を求める:
{μ, Σ} = Block[...];リターンは
で与えられる.ただし,
は個別の株式の予想収益の値のベクトルである:
return = μ.w;リスクは
で与えられる.
はリスク回避パラメータであり,
である:
risk = w.Σ.w;
riskConstraint = risk ≤ s;目的は,指定されたリスク回避パラメータについてリスクを最小にしつつリターンを最大にすることである:
objective[α_ ? NumericQ] := -(return - α s);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@NMinimize[{objective[α],
riskConstraint, weightConstraints, marketConstraints}, {w, s, t∈Vectors[6, Reals]}];
{risk, return} /. res[[2]], {α, Subdivide[0, 10, 100]}];範囲
での最適な
は,リスクとリターンのトレードオフの上界包絡線を与える:
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@NMinimize[{objective[α],
riskConstraint, weightConstraints, marketConstraints}, {w, s, t∈Vectors[6, Reals]}][[2]], {α, riskAversionParameter}];市場コストを説明することで,低リスク回避のための多様化したポートフォリオが得られるが,リスク回避が高い場合は,多様化されていない株式を購入するため,市場への影響コストが支配的になる:
Legended[BarChart[res[[All, -1]], ...], SwatchLegend[...]]軌道最適化 (1)
円形の障害物を迂回する始点から終点までの距離が最短の経路を求める:
p = {{2, 2}, {7, 6}, {3, 5}, {4, 8}, {8, 9}, {6, 2.5}};
r = {1, 1.3, 1.5, 1, 0.7, 1.5};
{start, end} = {{0, 0}, {10, 10}};
domain = Graphics[{MapThread[Circle[#1, #2]&, {p, r}],
{PointSize[0.02], Point[{start, end}]}}, Frame -> True]この経路は,点の間の距離が
である
個の点に離散化される.
は最小化される軌道の長さである:
n = 30;
distanceConstraints = Table[Inactive[Norm][x[i] - x[i - 1]] <= l / n, {i, n}];objectConstraints = Table[Inactive[Norm][-p[[j]] + x[i]] >= r[[j]], {i, 1, n}, {j, 1, 6}];positionConstraints = {x[0] == start, x[n] == end};vars = Append[Table[x[i]∈Vectors[2, Reals], {i, 0, n}], l∈Reals];Short[res = NMinimize[{l, distanceConstraints,
objectConstraints, positionConstraints}, vars, Method -> "DifferenceOfConvex"], 2]pts = vars[[1 ;; -2, 1]] /. res[[2]];
Show[domain, Graphics[{Red, Point[pts]}]]製造問題 (3)
指定された歯車比を生成するために,ギア
に必要な歯車
の数を求める:
teethConstraints = {12gearTeeth60, gearTeeth∈Vectors[4, Integers]};gearRatio = (Indexed[gearTeeth, 2]Indexed[gearTeeth, 3]) / (Indexed[gearTeeth, 1]Indexed[gearTeeth, 4]);NMinimize[Abs[(1 / 6.931) - gearRatio], teethConstraints, gearTeeth]圧力釜の製造コストを最小にする.釜は長さ
,半径
の円柱形シェルで,円柱の両端に半球のキャップが付いている:
volumeConstraint = π R^2L + (4 / 3)π R^3 >= 1296000;シェルの厚さは
で半球キャップの厚さは
である.シェルとキャップの厚さには上限と下限が指定されており,半径との比よりも大きくなければならない:
thicknessConstraints = {1.1 <= Subscript[T, s] <= 2, 0.6 <= Subscript[T, h] <= 2, Subscript[T, s] >= Subscript[c, 1] R, Subscript[T, h] >= Subscript[c, 2]R};thicknessIntegerConstraints = {Subscript[T, s] == Subscript[c, k]Subscript[k, 1], Subscript[T, h] == Subscript[c, k]Subscript[k, 2], Subscript[k, 1] >= 1, Subscript[k, 2] >= 1,
Subscript[k, 1]∈Integers, Subscript[k, 2]∈Integers};dimensionConstraints = {0 <= R <= 100, 0 <= L <= 240};シェルとキャップの材料の密度は
である.材料コストは以下の通りである:
materialCosts = 2π ρ (Subscript[c, s] Subscript[T, s] R L + Subscript[c, h] R^2 Subscript[T, h]);shellWeldCost = Subscript[c, w]π ρ(Subscript[T, s] / Cos[π / 6])^2(60 / 360)(2 L);
headWeldCost = Subscript[c, w]π ρ(Subscript[T, s] / Cos[π / 6])^2(60 / 360)(4π R);totalCost = shellWeldCost + headWeldCost + materialCosts;constants = {Subscript[c, 1] -> 0.0193, Subscript[c, 2] -> 0.00954, Subscript[c, s] -> 0.35, Subscript[c, h] -> 1, Subscript[c, w] -> 8, Subscript[c, k] -> 0.0625, ρ -> 0.283}NMinimize[{totalCost, volumeConstraint,
thicknessConstraints, thicknessIntegerConstraints, dimensionConstraints} /. constants, {R, L, Subscript[T, s], Subscript[T, h], Subscript[k, 1], Subscript[k, 2]}]軸荷重をに依存する,巻き径
,線バネ径
,バネコイル
の最小体積の圧縮コイルバネを設計する:
springVolume = π Subscript[d, w]Subscript[d, s]^2(Subscript[n, coils] + 2) / 4;バネにかかる剪断応力は,最大許容軸荷重
に依存し,最大許容応力
より低くなければならない:
k = With[{c = (Subscript[d, w] / Subscript[d, s])}, (4c - 1) / (4c - 4) + (0.615) / c];
shearStressConstraint = 8k Subscript[P, max]Subscript[d, w] / (π Subscript[d, s]^3) <= Subscript[S, max];δ = (8Subscript[P, max]Subscript[d, w]^3Subscript[n, coils]) / (11500000 Subscript[d, s]^4);springLengthConstraint = (δ + 1.05(Subscript[n, coils] + 2)Subscript[d, s]) <= Subscript[l, max];springWireDiameterConstraint = Subscript[d, s] >= Subscript[d, sMin];springWindingDiameterConstraint = Subscript[d, w] + Subscript[d, s] <= Subscript[d, max];巻き径
は,バネコイルがキツく巻かれすぎないようにするために,少なくとも線バネ径
の3倍でなければならない.
springDiameterRatioConstraint = Subscript[d, w] >= 3Subscript[d, s];deflectionConstraint = Subscript[δ, min] <= δ <= Subscript[δ, max];たわみと事前荷重によって生じる荷重
は,最大荷重
を超えてはならない:
loadDeflectionConstraint = Subscript[P, load] + k Subscript[δ, w] <= Subscript[P, max];バネコイルはミュージックワイヤー スプリング鋼ASTM A228から製造され,ワイヤーの直径は一連の所定の直径から選択する必要がある:
wireDiameters = {0.009, 0.0095, 0.0104, 0.0118, 0.0128, 0.0132, 0.014, 0.015, 0.0162, 0.0173, 0.018, 0.020, 0.023, 0.025, 0.028, 0.032, 0.035, 0.041, 0.047, 0.054, 0.063, 0.072, 0.080, 0.092, 0.105, 0.120, 0.135, 0.148, 0.162, 0.177, 0.192, 0.207, 0.225, 0.244, 0.263, 0.283, 0.307, 0.331, 0.362, 0.394, 0.4375, 0.5};binaryConstraints = {wireDiameters.b == Subscript[d, s], Total[b] == 1, 0b1, b∈Vectors[Length[wireDiameters], Integers]};constants = {Subscript[P, load] -> 300, Subscript[P, max] -> 1000, Subscript[S, max] -> 189000, Subscript[δ, w] -> 1.25, Subscript[δ, min] -> 1.78, Subscript[δ, max] -> 6, Subscript[l, max] -> 14, Subscript[d, max] -> 3, Subscript[d, sMin] -> 0.2};allConstraints = {shearStressConstraint, springLengthConstraint, springWireDiameterConstraint, springWindingDiameterConstraint, springDiameterRatioConstraint, deflectionConstraint, loadDeflectionConstraint, binaryConstraints, 0 <= Subscript[n, coils] <= 100} /. constants;NMinimize[springVolume, allConstraints, {Subscript[d, s], Subscript[d, w], Subscript[n, coils]∈Integers, b}]特性と関係 (9)
NMinimizeは最小値と,変数の値を最小にする規則を与える:
NMinimize[{x.x + y, Norm[x + y] ≤ 1}, {Element[x, Vectors[2, Reals]], y}]NArgMinは最小化する値のリストを与える:
NArgMin[{x.x + y, Norm[x + y] ≤ 1}, {Element[x, Vectors[2, Reals]], y}]NMinValueは最小値だけを与える:
NMinValue[{x.x + y, Norm[x + y] ≤ 1}, {Element[x, Vectors[2, Reals]], y}]NMinimize[{x ^ 2 + y ^ 2, x + 2 y ≥ 3}, {x, y}]NMaximize[{-(x ^ 2 + y ^ 2), x + 2 y ≥ 3}, {x, y}]凸問題については,ConvexOptimizationを使って追加的な解の特性が得られるかもしれない:
NMinimize[{x ^ 2 + y ^ 2, x + 2 y ≥ 3}, {x, y}]ConvexOptimization[x ^ 2 + y ^ 2, x + 2 y ≥ 3, {x, y}, {"PrimalMinimumValue", "PrimalMinimizerRules"}]ConvexOptimization[x ^ 2 + y ^ 2, x + 2 y ≥ 3, {x, y}, "DualMaximizer"]パラメータがある凸問題についてParametricConvexOptimizationを使うとParametricFunctionが与えられる:
pfun = ParametricConvexOptimization[x + 2 y, (x - α) ^ 2 + (y - β) ^ 2 ≤ 1, {x, y}, {α, β}, {"PrimalMinimumValue", "PrimalMinimizerRules"}]ParametricFunctionはパラメータの値について評価できる:
{pfun[0., 0.], pfun[.5, 1.], pfun[2., 1.]}NMinimizeを使ってパラメトリック問題についての関数を定義する:
fun[α_ ? NumericQ, β_ ? NumericQ] := NMinimize[{x + 2 y, (x - α) ^ 2 + (y - β) ^ 2 ≤ 1}, {x, y}];
{fun[0., 0.], fun[.5, 1.], fun[2., 1.]}testData = RandomReal[{0, 4}, {1000, 2}];
{First[AbsoluteTiming[pfun @@@testData]], First[AbsoluteTiming[fun @@@ testData]]}ParametricFunctionの導関数も計算できる:
D[pfun[α, β], {{α, β}}] /. {α -> 2., β -> 1.}RobustConvexOptimizationは,パラメータ制約がある凸問題についてはパラメータの可能なすべての値について有効な最適値を求める:
{rMinValue, rMin} = RobustConvexOptimization[2x + 3y, x + y ≥ α && x - y ≤ β && -1 ≤ α ≤ 1 && 0 ≤ β ≤ 1, {x, y}, {α, β}, {"PrimalMinimumValue", "PrimalMinimizerRules"}]NMinimizeはパラメータの特定の値についてより小さい値を求めるかもしれない:
NMinimize[{2x + 3y, x + y ≥ α && x - y ≤ β && α == 0 && β == 0}, {x, y}]このミニマイザは α と β の使用可能なすべての値についての制約条件は満足しない:
(x + y ≥ α && x - y ≤ β /. Last[%]) /. {α -> 1, β -> 1}パラメータの特定の値について求まった最小値はロバストな最小値以下である:
fun[α_, β_] /; (-1 ≤ α ≤ 1 && 0 ≤ β ≤ 1) :=
NMinValue[{2x + 3y, x + y ≥ α && x - y ≤ β}, {x, y}];testValues = RandomVariate[UniformDistribution[{{-1, 1}, {0, 1}}], 100];
AllTrue[testValues, ((fun@@#) ≤ rMinValue)&]NMinimizeは大域的である最小値を求めようとするのに対し,FindMinimumは極小値(局所的な最小値)を求めようとする:
objective = -100 / ((x - 1)^2 + (y - 1)^2 + 1) - 200 / ((x + 1)^2 + (y + 2)^2 + 1);
NMinimize[{objective, x^2 + y^2 > 3 }, {x, y}]FindMinimum[{objective, x^2 + y^2 > 3 }, {{x, 2}, y}]ContourPlot[objective, {x, -3, 2}, {y, -3, 2}, ...]FindFitはNMinimizeを使って大域的最適フィットを求めることができる.次でそのモデルを設定する:
model = a + bCos[2Pict] + dSin[2Piet];
parameters = {a, b, c, d, e};f[t_] := Evaluate[model /. {a -> 0.2, b -> 0.3, c -> 0.1, d -> 0.9, e -> 0.55}];
data = {#, f[#]}& /@ Table[t, {t, 0, 2Pi, .1}];デフォルトで,FindFitは局所的最適フィットしか求めない:
ffsol = FindFit[data, model, parameters, t];
lp = ListPlot[data, PlotStyle -> {PointSize[0.02]}, DisplayFunction -> Identity];nfp = Plot[model /. ffsol, {t, 0, 2Pi}, DisplayFunction -> Identity];
Show[lp, nfp, DisplayFunction -> $DisplayFunction]NMinimizeメソッドを使うと大域的最適フィットが求まる:
ffsol = FindFit[data, model, parameters, t, Method -> NMinimize];
nfp = Plot[model /. ffsol, {t, 0, 2Pi}, DisplayFunction -> Identity];
Show[lp, nfp, DisplayFunction -> $DisplayFunction]RegionDistanceとRegionNearestを使って距離と最近点を計算する:
ℛ = Cone[{{-1, 0, 1}, {2, 3, 4}}, 3];
p = {3., 2., 1.};RegionDistance[ℛ, p]RegionNearest[ℛ, p]どちらもNMinimizeを使って計算することができる:
NMinimize[Norm[{x, y, z} - p], {x, y, z}∈ℛ]Graphics3D[{ℛ, {PointSize[Large], {Green, Point[p]}, {Red, Point[{x, y, z} /. %[[2]]]}}}]RegionBoundsを使って境界ボックスを計算する:
f = x^4 + 3. x^2 y + 2. x^2 y^2 - y^3 + y^4 ≤ 0;
ℛ = ImplicitRegion@@{f, {x, y}}RegionBounds[ℛ]NMaximizeとNMinimizeを使っても同じ境界が計算できる:
{{x1, x2}, {y1, y2}} = {NMinimize[#, {x, y}∈ℛ][[1]], NMaximize[#, {x, y}∈ℛ][[1]]}& /@ {x, y}Show[{Graphics[{LightBlue, Rectangle[{x1, y1}, {x2, y2}]}], RegionPlot[f, {x, x1 - 1, x2 + 1}, {y, y1 - 1, y2 + 1}]}]考えられる問題 (3)
非線形の関数の場合は,NMinimizeは,メソッドによっては極小値しか見付けられないことがある:
sol = NMinimize[-x Sin[x] + 3 Cos[x] + x / 1000, x, Method -> "NelderMead"]Plot[-x Sin[x] + 3 Cos[x] + x / 1000, {x, -20, 20}, Epilog -> {Red, PointSize[0.04], Point[{x /. sol[[2]], sol[[1]]}]}]NMinimize[-x Sin[x] + 3 Cos[x] + x / 1000, {x, -20, 20}, Method -> "NelderMead"]NMinimize[-x Sin[x] + 3 Cos[x] + x / 1000, x]NMinimizeは,メソッドによっては円板上で二次元関数の極小値を求める:
NMinimize[{Cos[x] - Exp[(x - 0.5) y], x ^ 2 + y ^ 2 < 1}, {x, y}, Method -> "NelderMead"]NMinimize[{Cos[x] - Exp[(x - 0.5) y], x ^ 2 + y ^ 2 < 1}, {{x, -1, 0}, y}, Method -> "NelderMead"]ContourPlot[Cos[x] - Exp[(x - 0.5)y], {x, -1, 1}, {y, -1, 1}, ...]f1[a_] := NIntegrate[(x - a) ^ 2, {x, 0, 10}]f1[2]この関数を記号パラメータに適用するとNIntegrateからメッセージが生成される:
f1[q]この関数をNMinimizeのような他の数値関数と一緒に使っても同じように警告が出る:
NMinimize[f1[a], a]メッセージが出るのを避けるために,引数が数値のときにだけ評価する関数を定義する:
f2[a_ ? NumericQ] := NIntegrate[(x - a) ^ 2, {x, 0, 10}]f2[π]f2[q]これで,この関数をNMinimizeのような他の数値関数と一緒に使えるようになった:
NMinimize[f2[a], a]テクニカルノート
-
▪
- 数値解析:基本操作 ▪
- 数値最適化 ▪
- 大域的非線形数値最適化 ▪
- 制約条件付き最適化 ▪
- 制約条件のない最適化 ▪
- 実装に関するノート: 数値および関連関数
関連するガイド
-
▪
- 最適化 ▪
- 凸最適化 ▪
- 領域におけるソルバ ▪
- 微積分 ▪
- グラフプログラミング ▪
- 数値的評価と精度 ▪
- 立体幾何学 ▪
- 幾何学的計算 ▪
- 平面幾何学 ▪
- 記号的なベクトル,行列,配列 ▪
- 科学的モデル ▪
- 多角形 ▪
- システムモデルの解析と設計 ▪
- 多面体
履歴
2003 で導入 (5.0) | 2007 で更新 (6.0) ▪ 2014 (10.0) ▪ 2019 (12.0) ▪ 2021 (12.3) ▪ 2021 (13.0) ▪ 2022 (13.2) ▪ 2024 (14.1)
テキスト
Wolfram Research (2003), NMinimize, Wolfram言語関数, https://reference.wolfram.com/language/ref/NMinimize.html (2024年に更新).
CMS
Wolfram Language. 2003. "NMinimize." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2024. https://reference.wolfram.com/language/ref/NMinimize.html.
APA
Wolfram Language. (2003). NMinimize. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/NMinimize.html
BibTeX
@misc{reference.wolfram_2026_nminimize, author="Wolfram Research", title="{NMinimize}", year="2024", howpublished="\url{https://reference.wolfram.com/language/ref/NMinimize.html}", note=[Accessed: 02-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_nminimize, organization={Wolfram Research}, title={NMinimize}, year={2024}, url={https://reference.wolfram.com/language/ref/NMinimize.html}, note=[Accessed: 02-November-2026]}