最適化問題 SciPy
SciPyを用いて複雑な最適化問題を解き、その結果をグラフ化する例を示します。
以下では、非線形の目的関数と制約条件を持つ最適化問題を設定します。
問題設定
目的関数:
$$
f(x) = (x_0 - 2)^2 + (x_1 - 3)^2 + \cos(x_0 \cdot x_1)
$$
制約条件:
非線形等式制約:
$$
g_1(x) = x_0^2 + x_1^2 - 4 = 0
$$非線形不等式制約:
$$
g_2(x) = x_0 \cdot x_1 - 1 \geq 0
$$
初期推定値として$ ( x_0 = 1 ), ( x_1 = 1 ) $を使用します。
1 | import numpy as np |
このコードでは、SciPyのminimize関数を使って非線形の目的関数と制約条件を持つ最適化問題を解き、その結果をグラフ化しています。
結果として、目的関数の等高線図と最適解をプロットしています。
[実行結果]
ソースコード解説
このソースコードは、非線形制約付きの最適化問題をSciPyを使って解き、その結果を等高線プロットとして視覚化しています。
以下に、コードの各部分を詳しく説明します。
1. インポート
まず、必要なライブラリをインポートします。
1 | import numpy as np |
numpyは数値計算をサポートするライブラリです。scipy.optimizeのminimize関数は最適化問題を解くために使用します。matplotlib.pyplotはプロットを作成するためのライブラリです。
2. 目的関数の定義
最適化の対象となる関数を定義します。
1 | def objective_function(x): |
この関数は、2変数$ ( x[0] ) $と$ ( x[1] ) $を持ち、それらの二乗誤差と余弦関数の和として定義されます。
3. 制約条件の定義
2つの制約条件を定義します。
1 | def constraint1(x): |
constraint1は等式制約です。
これは$ ( x[0]^2 + x[1]^2 = 4 ) $という円の方程式に対応します。constraint2は不等式制約です。
これは$ ( x[0] \cdot x[1] \geq 1 ) $という条件です。
4. 制約条件の設定
制約条件をリストとして設定します。
1 | constraints = [{'type': 'eq', 'fun': constraint1}, |
minimize 関数に渡すために、制約条件を辞書形式で定義します。
5. 初期推定値の設定
最適化アルゴリズムの初期値を設定します。
1 | initial_guess = [1, 1] |
最適化の開始点を$ ([1, 1]) $とします。
6. 最適化の実行
minimize 関数を用いて最適化を実行します。
1 | result = minimize(objective_function, initial_guess, constraints=constraints) |
objective_function を最小化し、与えられた制約条件を満たす解を求めます。
7. 結果の表示
最適解と最適値を出力します。
1 | print("最適解:", result.x) |
8. 結果のプロット
最適化結果を等高線プロットとして視覚化します。
1 | x0_range = np.linspace(-3, 3, 400) |
等高線プロットのためのグリッドを作成し、目的関数の値を計算します。
9. プロットの作成
等高線プロットを作成し、最適解をプロットします。
1 | plt.figure(figsize=(10, 6)) |
- 等高線プロットを描画し、カラーバーを追加します。
- 最適解を赤い点としてプロットし、ラベルを付けます。
- タイトルやラベルを設定し、プロットを表示します。
このコード全体の流れは、非線形最適化問題を定義し、それをSciPyの minimize 関数で解き、その結果を視覚的に確認するための等高線プロットを作成するものです。
結果解説
[実行結果]
このグラフは、非線形最適化問題の解法の結果を示しています。
目的関数の等高線図(Contour plot)と最適解の位置がプロットされています。
問題設定
目的関数:
$$
f(x) = (x_0 - 2)^2 + (x_1 - 3)^2 + \cos(x_0 \cdot x_1)
$$
制約条件:
- 非線形等式制約:
$$
g_1(x) = x_0^2 + x_1^2 - 4 = 0
$$ - 非線形不等式制約:
$$
g_2(x) = x_0 \cdot x_1 - 1 \geq 0
$$
初期推定値:
$$
x_0 = 1, x_1 = 1
$$
解の結果
最適解:
$$
x = [1.21825985, 1.5861409]
$$
最適値:
$$
f(x) = 2.265404399189813
$$
グラフの解説
等高線図(Contour plot):
- $x$軸と$y$軸は、それぞれ変数$ (x_0) $と$ (x_1) $を表しています。
- カラーマップは、目的関数 $ ( f(x) ) $の値を表しています。
色が濃いほど、目的関数の値が高いことを示します。 - 等高線は、同じ目的関数の値を持つ点を繋いだ線です。
等高線が密な部分は勾配が急なことを示し、疎な部分は勾配が緩やかなことを示します。
最適解の位置:
- 赤い点は、最適解を示しています。
この点は、与えられた制約条件を満たしつつ、目的関数の値を最小にする点です。 - グラフ上で赤い点の位置は、近くの等高線と一致しています。
この点が最適解であることを示しています。
- 赤い点は、最適解を示しています。
解説
この最適化問題では、2つの非線形制約条件の下で、非線形な目的関数を最小化する最適な解を求めています。
最適解は、与えられた初期推定値から始まり、制約条件を満たす範囲内で目的関数の値を最小化する点として見つかりました。
グラフ上では、この最適解の位置が目的関数の等高線と共に示されており、目的関数の形状や最適解の位置関係が視覚的に確認できます。
これにより、問題の最適化プロセスと結果を直感的に理解することができます。




















