python - 查找全局最小值 (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()
解决方案
问题是您在一个轴中优化您的曲面只会导致脚本中的另一个曲面图。
您可以通过迭代优化每个轴来找到解决方案。在我在下面提供的解决方案中,它适用于您的示例,但是为更复杂的函数(即非凸函数)找到全局最优值将需要更多的迭代才能收敛。(可能还有更微妙的梯度下降法)
请注意,我使用了 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()
推荐阅读
- java - Logback、Eclipse 和 Maven
- powershell - 脚本中的问题:调用命令“错误:通信出错”
- unity3d - 动态生成圆柱段形状的对象
- java - 获取在 servlet 容器中运行的 jar 资源中打包/包含的文件的信息
- html - 具有相同页面的 Amp 页面实现
- angular - 角度 cli 版本映射到角度版本?
- .htaccess - htaccess 将通配符子域的规则重写为 codeigniter 中的参数
- java - 泛型类的 Autowire 子类
- python - 在pygame中将screen.fill设置为渐变?
- python-3.x - QApplication框架内的PyQt5 QDialog