ローゼンブロック関数

ローゼンブロック関数

ローゼンブロック関数は、最適化アルゴリズム性能テストベンチマークによく使用される非線形関数です。

ローゼンブロック関数の式は次の通りです:

$$
f(x, y) = (a - x)^2 + b \cdot (y - x^2)^2
$$

ここで、$( a ) と ( b ) $は任意の定数ですが、一般的には$ ( a = 1 ) $および$ ( b = 100 ) $の値が使用されます。

それでは、この関数をPythonで定義し、3Dプロットを行ってみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# ローゼンブロック関数の定義
def rosenbrock(x, y):
a = 1
b = 100
return (a - x)**2 + b * (y - x**2)**2

# データの生成
x = np.linspace(-2, 2, 100)
y = np.linspace(-1, 3, 100)
X, Y = np.meshgrid(x, y)
Z = rosenbrock(X, Y)

# 3Dグラフのプロット
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis')

# 軸ラベルの設定
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# グラフの表示
plt.show()

このコードでは、ローゼンブロック関数を定義し、その関数を使用して3Dプロットを行っています。

[実行結果]

ソースコード解説

このソースコードは、Pythonを使用してローゼンブロック関数を3Dプロットするものです。

以下は、コードの章立て詳細な説明です:

1. モジュールのインポート

  • import numpy as np:
    NumPyライブラリを np としてインポートします。
    NumPyは数値計算を行うための重要なライブラリであり、このコードでは行列操作や数学的関数を使用します。
  • import matplotlib.pyplot as plt:
    Matplotlibライブラリから plt としてサブモジュールをインポートします。
    Matplotlibはグラフを描画するためのライブラリであり、このコードではプロットの作成に使用されます。
  • from mpl_toolkits.mplot3d import Axes3D:
    Matplotlibの3Dプロット機能を使用するために、Axes3D サブモジュールをインポートします。

2. ローゼンブロック関数の定義

  • def rosenbrock(x, y):
    ローゼンブロック関数を定義します。
    この関数は2つの変数 xy を取り、それらの値に基づいて関数値を計算します。
    ローゼンブロック関数は、$ ( f(x, y) = (a - x)^2 + b \cdot (y - x^2)^2 ) $の形をしています。
    この関数は、最小値が$ ( x = a ) $および$ ( y = x^2 ) $のときに$ ( 0 ) $になります。

3. データの生成

  • x = np.linspace(-2, 2, 100):
    区間 ([-2, 2]) を100等分した x の値を生成します。
  • y = np.linspace(-1, 3, 100):
    区間 ([-1, 3]) を100等分した y の値を生成します。
  • X, Y = np.meshgrid(x, y):
    xy の値からメッシュグリッドを生成します。
    メッシュグリッドは、 xy の組み合わせに対する関数の値を計算するために使用されます。
  • Z = rosenbrock(X, Y):
    ローゼンブロック関数を XY のメッシュグリッドに適用し、対応する関数の値を計算します。

4. 3Dグラフのプロット

  • fig = plt.figure():
    新しい図を作成します。
  • ax = fig.add_subplot(111, projection='3d'):
    3Dサブプロットを図に追加します。
  • ax.plot_surface(X, Y, Z, cmap='viridis'):
    3D曲面をプロットします。
    XYZ はそれぞれ x 座標、 y 座標、関数の値であり、 cmap パラメータはカラーマップを指定します。

5. 軸ラベルの設定

  • ax.set_xlabel('X'), ax.set_ylabel('Y'), ax.set_zlabel('Z'):
    X軸、Y軸、Z軸のラベルを設定します。

6. グラフの表示

  • plt.show():
    プロットを表示します。

これにより、ローゼンブロック関数の3Dプロットが生成され、その形状や特性を視覚的に理解することができます。

結果解説

[実行結果]

このグラフは、ローゼンブロック関数$ ( f(x, y) = (a - x)^2 + b \cdot (y - x^2)^2 ) $の3Dプロットです。
この関数は、2つの変数$ ( x ) $と$ ( y ) $の値に依存しています。

  • $X軸$と$Y軸$は、それぞれ変数$ ( x ) $と$ ( y ) $の値域を示しています。
    これらの値は、指定した範囲内で等間隔に設定されています。
  • $Z軸$は、関数$ ( f(x, y) ) $の値を表しています。
    つまり、Z軸の値は、各$ ( x ) $と$ ( y ) $の組み合わせに対する関数の値です。
  • 3Dプロット上の曲面は、関数$ ( f(x, y) ) $の値に対応しています。
    曲面の高さや形状は、$( x ) $と$ ( y ) $の値によって異なります。
    より高い曲面はより大きな関数の値を示し、より低い曲面はより小さな関数の値を示します。
  • 曲面の色は、Z値の大きさに基づいて変化します。
    一般的には、Z値が大きいほど明るい色、Z値が小さいほど暗い色になります。

このグラフを通じて、ローゼンブロック関数形状極小値を視覚的に理解することができます。