首页 > 解决方案 > 查找全局最小值 (SciPy) 并将其显示在 3D 图上

问题描述

我有一个带有两个变量的函数,我需要找到一个全局最小值。此外,构建 3D 图形并在图形上显示全局最小值(一个点)。但我得到了一个完整的第二个数字而不是一个点。我使用 Jupyter 笔记本。我的代码是:

import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,10))
axes = fig.gca(projection='3d')

def f(x, y):
    return (np.exp(np.sqrt(x**2 + y**2)))

y = x = np.linspace(-3, 3, 50)

x, y = np.meshgrid(x, y)
z = f(x,y)

# optimization
optimize.minimize(f, -3, args=(3)) # maybe something is wrong right here
optimization = optimize.minimize(f, -3, args=(3))


surf = axes.plot_surface(x, y, z, cmap='coolwarm',linewidth=0, antialiased=False)

surf1 = axes.plot_surface(x, y, f(optimization.x,y), cmap='coolwarm',linewidth=0, antialiased=False)

axes.set_xlabel('Ось X')
axes.set_ylabel('Ось Y')
axes.set_zlabel('Ось Z')

plt.show()

标签: pythonpython-3.xscipyjupyter-notebook

解决方案


问题是您在一个轴中优化您的曲面只会导致脚本中的另一个曲面图。

您可以通过迭代优化每个轴来找到解决方案。在我在下面提供的解决方案中,它适用于您的示例,但是为更复杂的函数(即非凸函数)找到全局最优值将需要更多的迭代才能收敛。(可能还有更微妙的梯度下降法

请注意,我使用了 contour3D 而不是 plot_surface 来更好地可视化绘图点。

import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,10))
axes = fig.gca(projection='3d')

def f(x, y):
    return (np.exp(np.sqrt(x**2 + y**2)))

y = x = np.linspace(-3, 3, 50)

x, y = np.meshgrid(x, y)
z = f(x,y)


# optimization x
optimization = optimize.minimize(f, [-3], args=(-3,)) 
best_x = optimization.x

# optimization y
optimization = optimize.minimize(lambda x,y: f(y,x), [-3], args=(-3,))
best_y = optimization.x

#surf = axes.plot_surface(x, y, z, cmap='coolwarm',linewidth=0, antialiased=True)
surf = axes.contour3D(x, y, z, 50,  cmap='coolwarm',)
axes.scatter3D([best_x], [best_y], [f(best_x, best_y)], s=[100], c="g");


axes.set_xlabel('Ось X')
axes.set_ylabel('Ось Y')
axes.set_zlabel('Ось Z')

plt.show()

在此处输入图像描述]


推荐阅读