FindMinimum[f,x]
自動的に選んだ点から始めて f の極小値を求める.
FindMinimum[f,{x,x0}]
点 x=x0から始めて f の極小値を求める.
FindMinimum[f,{{x,x0},{y,y0},…}]
複数の変数を持つ関数の極小値を求める.
FindMinimum[{f,cons},{{x,x0},{y,y0},…}]
制約条件 cons のもとで極小値を求める.
FindMinimum[{f,cons},{x,y,…}]
制約条件で定義された範囲内の点から始める.
FindMinimum
FindMinimum[f,x]
自動的に選んだ点から始めて f の極小値を求める.
FindMinimum[f,{x,x0}]
点 x=x0から始めて f の極小値を求める.
FindMinimum[f,{{x,x0},{y,y0},…}]
複数の変数を持つ関数の極小値を求める.
FindMinimum[{f,cons},{{x,x0},{y,y0},…}]
制約条件 cons のもとで極小値を求める.
FindMinimum[{f,cons},{x,y,…}]
制約条件で定義された範囲内の点から始める.
詳細とオプション
- FindMinimumは{fmin,{x->xmin}}の形式のリストを返す.ただし,fminは f の見出された極小値で,xminは x の値である.
- 変数の初期値がリストで与えられている場合は,変数の値は同じ次元のリストであると解釈される.
- 制約条件 cons は,方程式,不等式,あるいはこれらの論理結合を含むことができる.
- 制約条件 cons は以下の論理結合でよい.
-
lhs==rhs 方程式 lhs>rhs または lhs>=rhs 不等式 {x,y,…}∈reg 領域指定 - FindMinimumは,まずすべての変数の値を局所化し,次に記号的となった変数で f を評価し,繰り返して結果を数値的に評価する.
- FindMinimumは属性HoldAllを持ち,Blockを用いて実質的に変数を局所化する.
- FindMinimum[f,{x,x0,x1}]は x0と x1を x の最初の2つの値として用い,導関数を使用せずに f の極小値を求める.
- FindMinimum[f,{x,x0,xmin,xmax}]は極小値を求める.x が xmin から xmaxまでの区間からはみ出したところで探索を中止する.
- f と cons の両方が線形の場合を除き,FindMinimumが求めた結果は極小値のみに対応し,大域的である最小値には対応しない.
- デフォルトで,変数はすべて実数であると仮定される.
- 線形の f と cons については,x∈Integersを使って変数が整数値のみを取るように指定することができる.
- 可能なオプション
-
AccuracyGoal Automatic 目標確度 EvaluationMonitor None f が評価されたときに常に評価される式 Gradient Automatic f の勾配要素のリスト MaxIterations Automatic 使用する最大反復回数 Method Automatic 使用するアルゴリズム PrecisionGoal Automatic 目標精度 StepMonitor None 段階を取るたびに常に評価される式 WorkingPrecision MachinePrecision 内部計算で使用する精度 - AccuracyGoalとPrecisionGoalの設定値で,極小値の位置の値と極小値に達したときの関数の値の両方で目標とする有効桁精度を指定する.
- FindMinimumは,AccuracyGoalまたはPrecisionGoalで指定された精度(または確度)に達するまで計算を続ける.
- Methodが取り得る設定には,"ConjugateGradient","PrincipalAxis","LevenbergMarquardt","Newton","QuasiNewton","InteriorPoint","LinearProgramming"等がある.デフォルト値はAutomaticである.
例題
すべて開く すべて閉じる例 (4)
FindMinimum[x Cos[x], {x, 2}]Plot[x Cos[x], {x, 0, 20}]x /. Last[FindMinimum[x Cos[x], {x, 2}]]FindMinimum[{x Cos[x], 1 ≤ x ≤ 15}, {x, 7}]線形制約条件と整数制約条件に従って線形関数の最小値を求める:
FindMinimum[{x + y, x + 2y ≥ 3 && x ≥ 0 && y ≥ 0 && y∈Integers}, {x, y}]FindMinimum[{x + y, {x, y}∈Disk[]}, {x, y}]Show[ContourPlot[x + y, {x, y}∈Disk[]], Graphics[{Red, PointSize[Large], Point[{x, y} /. Last[%]]}]]スコープ (12)
FindMinimum[x Cos[x], {x, 5}]FindMinimum[x Cos[x], {x, 10}]FindMinimum[Sin[x]Sin[2y], {{x, 2}, {y, 2}}]FindMinimum[{Sin[x]Sin[2y], x ^ 2 + y ^ 2 < 3}, {{x, 2}, {y, 2}}]FindMinimum[{Sin[x ]Sin[2y], x ^ 2 + y ^ 2 < 3}, {x, y}]線形目的および制約条件には,整数制約条件を強制することができる:
FindMinimum[{x + y, 3x + 2y ≥ 7 && x ≥ 0 && y ≥ 0}, {x, y}]FindMinimum[{x + y, 3x + 2y ≥ 7 && x ≥ 0 && y ≥ 0 && x∈Integers}, {x, y}]Or制約条件を指定することができる:
FindMinimum[{x + y, x ^ 2 + y ^ 2 ≤ 1 || (x + 2) ^ 2 + (y + 2) ^ 2 ≤ 1}, {x, y}]t = RotationTransform[{{0, 0, 1}, {1, 1, 1}}];
ℛ = TransformedRegion[Ellipsoid[{0, 0, 0}, {1, 2, 3}], t];FindMinimum[{z, {x, y, 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}}];FindMinimum[{(x - u)^2 + (y - v)^2, {{x, y}∈Subscript[ℛ, 1], {u, v}∈Subscript[ℛ, 2]}}, {x, y, u, v}]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}];FindMinimum[{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];FindMinimum[{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[];FindMinimum[{x.{1, 2, 3}, x∈ℛ}, x]Subscript[ℛ, 1] = Triangle[{{0, 0}, {1, 0}, {0, 1}}];
Subscript[ℛ, 2] = Disk[{2, 2}, 1];FindMinimum[{EuclideanDistance[x, y], {x∈Subscript[ℛ, 1], y∈Subscript[ℛ, 2]}}, {x, y}]Graphics[{{LightBlue, Subscript[ℛ, 1], Subscript[ℛ, 2]}, {Red, Point[{x, y}]}} /. %[[2]]]オプション (7)
AccuracyGoalとPrecisionGoal (2)
FindMinimum[Sin[x / 2], {x, 1}, AccuracyGoal -> 9, PrecisionGoal -> 8]FindMinimum[Sin[x / 2], {x, 1}, AccuracyGoal -> 20, PrecisionGoal -> 18]WorkingPrecisionの設定値を高くするとこのプロセスは収束する:
FindMinimum[Sin[x / 2], {x, 1}, AccuracyGoal -> 20, PrecisionGoal -> 18, WorkingPrecision -> 40]EvaluationMonitor (1)
Gradient (1)
FindMinimum[Sin[x]Sin[2 y], {x, y}, Gradient -> {Cos[x] Sin[2 y], 2 Cos[2 y] Sin[x]}, Method -> "Newton"]FindMinimum[Sin[x]Sin[2y], {x, y}, Gradient -> {Cos[x] Sin[2 y], 2 Cos[2 y] Sin[x]}, Method -> {"Newton", Hessian -> {{-Sin[x] Sin[2 y], 2 Cos[x] Cos[2 y]}, {2 Cos[x] Cos[2 y], -4 Sin[x] Sin[2 y]}}}]Method (1)
この場合は,デフォルトの導関数に基づいたメソッドではうまくいかない:
FindMinimum[Abs[x + 1] + Abs[x + 1.01] + Abs[y + 1], {x, y}]FindMinimum[Abs[x + 1] + Abs[x + 1.01] + Abs[y + 1], {x, y}, Method -> "ConjugateGradient"]これらの場合には,導関数を必要としない直接探索法が役に立つ:
FindMinimum[Abs[x + 1] + Abs[x + 1.01] + Abs[y + 1], {x, y}, Method -> "PrincipalAxis"]NMinimizeもまた,さまざまな直接探索法を使う:
NMinimize[{Abs[x + 1] + Abs[x + 1.01] + Abs[y + 1], 0 > x > -2}, {x, y}]StepMonitor (1)
関数の最小値を求める際にFindMinimumが取るステップ:
pts = Reap[FindMinimum[(1 - x) ^ 2 + 100(-x ^ 2 - y) ^ 2 + 1, {{x, -1.2}, {y, 1}}, StepMonitor :> Sow[{x, y}]]][[2, 1]];
pts = Join[{{-1.2, 1}}, pts];ContourPlot[(1 - x) ^ 2 + 100(-x ^ 2 - y) ^ 2 + 1//Log, {x, -1.3, 1.5}, {y, -1.5, 1.4}, Epilog -> {Red, Line[pts], Point[pts]}]WorkingPrecision (1)
作業精度を
にする.デフォルトでAccuracyGoalとPrecisionGoalは
に設定されている:
FindMinimum[Cos[x ^ 2 - 3 y] + Sin[x ^ 2 + y ^ 2], {x, y}, Method -> "Newton", WorkingPrecision -> 20]アプリケーション (3)
1973年から1994年までのS&P 500からの長期債券の年間配当(R):
R = {{0.942, 1.02, 1.056, 1.175, 1.002, 0.982, 0.978, 0.947, 1.003, 1.465, 0.985, 1.159, 1.366, 1.309, 0.925, 1.086, 1.212, 1.054, 1.193, 1.079, 1.217, 0.889}, {0.852, 0.735, 1.371, 1.236, 0.926, 1.064, 1.184, 1.323, 0.949, 1.215, 1.224, 1.061, 1.316, 1.186, 1.052, 1.165, 1.316, 0.968, 1.304, 1.076, 1.1, 1.012}};μ = Mean[Transpose@R]Σ = Covariance[Transpose[R]]X = Map[Subscript[x, #]&, {"long T-bond", "SP500"}]FindMinimum[{X.Σ.X, Total[X] == 1 && μ.X ≥ 1.10 && Apply[And, Thread[X ≥ {0, 0}]]}, X]
について,半径
の重なり合ない
個の円が入る最小の正方形を求める.円の数と各円の半径を指定する:
n = 20;
r = BlockRandom[RandomReal[{0.5, 1.5}, n], RandomSeeding -> 123];
が円
の中心なら,目的は
を最小化することになる.この目的は,
のときに
を最小化することに変形できる:
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 = FindMinimum[{s, objectiveConstraint, nonOverlapConstraint}, vars], 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]]出発点と到着点の間の距離が最小になるようにして,円形の障害物の間を通る経路を求める:
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 = FindMinimum[{l, distanceConstraints,
objectConstraints, positionConstraints}, vars], 2]pts = vars[[1 ;; -2, 1]] /. res[[2]];
Show[domain, Graphics[{Red, Point[pts]}]]特性と関係 (2)
FindMinimumは極小を求めようとするのに対し,NMinimizeは大域的最小を求めようとする:
objective = -100 / ((x - 1)^2 + (y - 1)^2 + 1) - 200 / ((x + 1)^2 + (y + 2)^2 + 1);
FindMinimum[{objective, x^2 + y^2 > 3 }, {{x, 2}, y}]NMinimize[{objective, x^2 + y^2 > 3 }, {x, y}]ContourPlot[objective, {x, -3, 2}, {y, -3, 2}, ...]Minimizeは最小値を求め,無限大の精度でも使うことができる:
Minimize[{-100 / ((x - 1)^2 + (y - 1)^2 + 1) - 200 / ((x + 1)^2 + (y + 2)^2 + 1), x^2 + y^2 > 3 }, {x, y}]N[%]FindMinimumは最小値と最小となる点の両方を与える:
FindMinimum[{x - 2y, x ^ 2 + y ^ 2 ≤ 1}, {x, y}]FindArgMinは最小となる位置を与える:
FindArgMin[{x - 2y, x ^ 2 + y ^ 2 ≤ 1}, {x, y}]FindMinValueは最小値を与える:
FindMinValue[{x - 2y, x ^ 2 + y ^ 2 ≤ 1}, {x, y}]考えられる問題 (6)
機械精度の計算では,スムーズな極小値を持つ関数でも凸凹に見えることがある:
opt = FindMinimum[x Cos[x], {x, 1}]yopt = First[opt];
xopt = x /. Last[opt];Plot[x Cos[x] - yopt, Evaluate[{x, xopt - 1.*^-7, xopt + 1.*^-7}], PlotRange -> All]機械精度以上の精度にするとこのような問題が避けられることがある:
FindMinimum[x Cos[x], {x, 1}, WorkingPrecision -> 30]FindMinimum[{x + y, x ^ 2 + y ^ 2 ≥ 2 && x ^ 2 + y ^ 2 ≤ 1}, {x, y}]FindMinimum[Tan[x], {x, 2}]FindMinimum[{-x ^ 2 - y ^ 2, x ^ 2 + y ^ 2 > 10}, {x, y}]FindMinimum[{x + y, x + 2y ≥ 3 && x > 1 && y > 1 && x∈Integers}, {x, y}, WorkingPrecision -> 20]初期値を与えることでアルゴリズムの収束を助けられる場合がある:
FindMinimum[{Cos[x] - Exp[(x - 0.5) y], x ^ 2 + y ^ 2 < 1}, {x, y}]FindMinimum[{Cos[x] - Exp[(x - 0.5) y], x ^ 2 + y ^ 2 < 1}, {{x, -1}, {y, -1}}]f[x_] := Nest[Sin[# + Sin[2#]]&, x, 15]FindMinimum[f[x], {x, 0}]//Timingg[x_ ? NumericQ] := Nest[Sin[# + Sin[2#]]&, x, 15]FindMinimum[g[x], {x, 0}]//Timingテクニカルノート
-
▪
- 制約条件付き最適化 ▪
- 制約条件のない最適化 ▪
- 数値解析:基本操作 ▪
- 数値最適化 ▪
- 記号的評価 ▪
- 実装に関するノート: 数値および関連関数
関連するガイド
-
▪
- 最適化 ▪
- 離散数学 ▪
- 凸最適化 ▪
- 領域におけるソルバ ▪
- 科学的モデル ▪
- グラフプログラミング ▪
- 行列分解 ▪
- 記号的なベクトル,行列,配列 ▪
- システムモデルの解析と設計
履歴
1988 で導入 (1.0) | 2000 で更新 (4.1) ▪ 2003 (5.0) ▪ 2007 (6.0) ▪ 2014 (10.0)
テキスト
Wolfram Research (1988), FindMinimum, Wolfram言語関数, https://reference.wolfram.com/language/ref/FindMinimum.html (2014年に更新).
CMS
Wolfram Language. 1988. "FindMinimum." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2014. https://reference.wolfram.com/language/ref/FindMinimum.html.
APA
Wolfram Language. (1988). FindMinimum. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/FindMinimum.html
BibTeX
@misc{reference.wolfram_2026_findminimum, author="Wolfram Research", title="{FindMinimum}", year="2014", howpublished="\url{https://reference.wolfram.com/language/ref/FindMinimum.html}", note=[Accessed: 12-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_findminimum, organization={Wolfram Research}, title={FindMinimum}, year={2014}, url={https://reference.wolfram.com/language/ref/FindMinimum.html}, note=[Accessed: 12-August-2026]}