目录



前言

对于数学建模竞赛而言“字不如图”乃是常态。本文旨在学习建模并且将过程中实践所绘制的图记录下来,整理思路。主要参考学习的博客来自于非线性规划绘图,并且其中在复刻画图的代码上也有许多疑惑没有解决,希望可以记录下来也往大佬能够指出。

切记:不要愚蠢到在同一个地方跌倒


一、例程1

原博客代码

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

绘图代码


from scipy.optimize import brent, fmin_ncg, minimize
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style

plt.rcParams['axes.unicode_minus']=False #坐标轴的负号正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 添加这条可以让图形显示中文
plt.figure(figsize=(10, 10), dpi=70)  # 设置图像大小

# 1. Demo1:单变量无约束优化问题(Scipy.optimize.brent)
def objf(x):  # 目标函数
    fx = x**2 - 8*np.sin(2*x+np.pi)
    return fx

xIni = -5.0
xOpt= brent(objf, brack=(xIni,2))
print("xIni={:.4f}\tfxIni={:.4f}".format(xIni,objf(xIni)))
print("xOpt={:.4f}\tfxOpt={:.4f}".format(xOpt,objf(xOpt)))

X = np.arange(-10,7.5,0.01)	
Y = objf(X) 
plt.plot(X, Y, color="blue", linewidth=2.0, linestyle="-") # 将散点连在一起
plt.scatter(xIni, objf(xIni), s=100,c ='violet') #初始点
plt.scatter(xOpt, objf(xOpt), s=100)  #最优点
plt.text(xIni-1.7, objf(xIni)-3, 'Initial', fontdict={'size': 20, 'color': 'k'})
plt.text(xOpt-0.7, objf(xOpt)-3, 'Best', fontdict={'size': 20, 'color': 'k'})


 # x、y坐标以及标题
plt.xlabel('x', fontsize=18)
plt.ylabel('f(x)', fontsize=18)
plt.title('Optimization by Scipy.optimize.brent', fontsize=18)
plt.show()

运行图片

还是绘制的有点粗糙TT

在这里插入图片描述

二、例程2

原代码

在这里插入图片描述

原博客结果·:在这里插入图片描述
该3D图绘制总是报错,编程失败,还望大佬能够帮忙解惑
代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import brent, fmin, minimize
plt.rcParams['font.sans-serif'] = ['SimHei']  # 为了支持中文字体
plt.rcParams['axes.unicode_minus'] = False  # 上述字库没负号,因此负号不进行字体变换

# 2. Demo2:多变量无约束优化问题(Scipy.optimize.brent)
# Rosenbrock 测试函数
def objf2(x):  # Rosenbrock benchmark function
    fx = sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0)
    return fx

# 创建3D图形对象
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

# 生成网格点
x = np.linspace(-4, 4, 100)
y = np.linspace(-4, 4, 100)
X, Y = np.meshgrid(x, y)
Z = sum(100.0 * (X[1:] - Y[:-1] ** 2.0) ** 2.0 + (1 - Y[:-1]) ** 2.0)

#Z = objf2([x,y])

# 绘制立体函数图像
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black', alpha=0.8)

xIni = np.array([-2, -2])
xOpt = fmin(objf2, xIni)
print("xIni={:.4f},{:.4f}\tfxIni={:.4f}".format(xIni[0],xIni[1],objf2(xIni)))
print("xOpt={:.4f},{:.4f}\tfxOpt={:.4f}".format(xOpt[0],xOpt[1],objf2(xOpt)))


# 添加横纵坐标label
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 添加图的标题
plt.title('Optimization by Scipy.optimize.fmin')

# 设置刻度标签
ax.set_xticks(np.arange(-4, 4, 1))
ax.set_yticks(np.arange(-4, 4, 1))
ax.set_zticks(np.arange(0, 80000, 2000))

# 设置轴范围
ax.set_xlim(-4, 4)
ax.set_ylim(-4, 4)
ax.set_zlim(0, 80000)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)

# 隐藏边框
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False
ax.xaxis.pane.set_edgecolor('w')
ax.yaxis.pane.set_edgecolor('w')
ax.zaxis.pane.set_edgecolor('w')
ax.grid(True)

# 显示图形
plt.show()

报错内容

在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐