19 三维曲面 plot_surface
用途
两个自变量加一个响应,如效率 MAP、P-V 特性、温度分布曲面。
示例(5 张)
19-1 电机效率 MAP 三维曲面

19-2 光伏组件 P-V 特性曲面(不同辐照度与温度)

19-3 母线室温度分布三维曲面

19-4 LC 滤波器幅频响应曲面

19-5 锂电池放电容量特性:倍率与温度的影响

代码
以下 5 个函数取自 code/第四批_信号与三维261106.py,直接调用即可出图。版式(宋体 + Times、10 磅、刻度朝内四边、图内无标题、留白自检)由 code/公共配置261106.py 的 setup_cn_style() 与 save() 统一提供。
# 摘自 code/第四批_信号与三维261106.py
def surf_01():
"""电机效率 MAP 三维曲面。"""
fig, ax = new_fig3d(right=0.86, left=0.13)
n = np.linspace(600, 3000, 60)
tq = np.linspace(0, 120, 60)
N, T = np.meshgrid(n, tq)
Z = 94.5 - 8.0 * ((T - 62) / 90) ** 2 - 3.4 * ((N - 2100) / 1500) ** 2 \
- 2.0 * ((T - 40) / 80) * ((N - 1800) / 1400)
s = ax.plot_surface(N, T, Z, cmap=CMAP_SEQ, linewidth=0.15,
edgecolor="0.45", antialiased=True, rstride=2, cstride=2)
ax.set_xlabel("转速 " + IT["n"] + " / (r/min)", labelpad=2)
ax.set_ylabel("转矩 " + IT["T"] + " / (N·m)", labelpad=2)
ax.set_zlabel("效率 " + IT["eta"] + " / %", labelpad=2)
ax.view_init(elev=26, azim=-128)
cb = fig.colorbar(s, ax=ax, pad=0.06, fraction=0.03, shrink=0.72)
cb.set_label("效率 " + IT["eta"] + " / %")
cb.ax.tick_params(direction="in", labelsize=FS - 3, length=2, width=0.5)
cb.outline.set_linewidth(0.5)
save(fig, "19_三维曲面", "19_三维曲面_电机效率MAP")
def surf_02():
"""光伏组件 P-V 特性曲面(不同辐照度与温度)。"""
fig, ax = new_fig3d(right=0.86, left=0.13)
u = np.linspace(0, 42, 70)
g = np.linspace(0.2, 1.0, 40)
U, G = np.meshgrid(u, g)
isc = 9.8 * G
P = U * isc * (1 - np.exp((U - 42 * (0.86 + 0.14 * G)) / 3.2))
P = np.clip(P, 0, None)
s = ax.plot_surface(U, G * 1000, P, cmap=CMAP_SEQ, linewidth=0.15,
edgecolor="0.45", antialiased=True, rstride=2, cstride=2)
ax.set_xlabel("电压 " + IT["U"] + " / V", labelpad=2)
ax.set_ylabel("辐照度 " + IT["G"] + " / (W/m²)", labelpad=2)
ax.set_zlabel("功率 " + IT["P"] + " / W", labelpad=2)
ax.view_init(elev=24, azim=-136)
cb = fig.colorbar(s, ax=ax, pad=0.06, fraction=0.03, shrink=0.72)
cb.set_label("功率 " + IT["P"] + " / W")
cb.ax.tick_params(direction="in", labelsize=FS - 3, length=2, width=0.5)
cb.outline.set_linewidth(0.5)
save(fig, "19_三维曲面", "19_三维曲面_光伏P-V特性")
def surf_03():
"""母线室温度分布三维曲面。"""
fig, ax = new_fig3d(right=0.86, left=0.13)
x = np.linspace(0, 1.4, 60)
y = np.linspace(0, 1.1, 50)
X, Y = np.meshgrid(x, y)
Z = 30 + 26 * np.exp(-((X - 0.55) / 0.30) ** 2) * np.exp(-((Y - 0.5) / 0.34) ** 2) \
+ 6 * Y + 3 * np.sin(X * 4) * np.cos(Y * 3)
s = ax.plot_surface(X, Y, Z, cmap=CMAP_SEQ, linewidth=0.12,
edgecolor="0.5", antialiased=True, rstride=2, cstride=2)
ax.set_xlabel("柜宽 " + IT["x"] + " / m", labelpad=2)
ax.set_ylabel("柜高 " + IT["y"] + " / m", labelpad=2)
ax.set_zlabel("温度 " + IT["T"] + " / °C", labelpad=2)
ax.view_init(elev=28, azim=-122)
cb = fig.colorbar(s, ax=ax, pad=0.06, fraction=0.03, shrink=0.72)
cb.set_label("温度 " + IT["T"] + " / °C")
cb.ax.tick_params(direction="in", labelsize=FS - 3, length=2, width=0.5)
cb.outline.set_linewidth(0.5)
save(fig, "19_三维曲面", "19_三维曲面_母线室温度分布")
def surf_04():
"""LC 滤波器幅频响应曲面。"""
fig, ax = new_fig3d(right=0.86, left=0.13)
f = np.logspace(1, 4.3, 80)
q = np.linspace(0.5, 8, 40)
F, Q = np.meshgrid(f, q)
fr = 800.0
H = 1 / np.sqrt((1 - (F / fr) ** 2) ** 2 + (F / (fr * Q)) ** 2)
HdB = 20 * np.log10(np.clip(H, 1e-4, None))
s = ax.plot_surface(np.log10(F), Q, HdB, cmap=CMAP_SEQ, linewidth=0.15,
edgecolor="0.45", antialiased=True, rstride=2, cstride=2)
ax.set_xlabel("lg(" + IT["f"] + " / Hz)", labelpad=2)
ax.set_ylabel("品质因数 " + IT["Q"], labelpad=2)
ax.set_zlabel("幅值 / dB", labelpad=2)
ax.view_init(elev=24, azim=-132)
ax.set_zlim(-60, 30)
cb = fig.colorbar(s, ax=ax, pad=0.06, fraction=0.03, shrink=0.72)
cb.set_label("幅值 / dB")
cb.ax.tick_params(direction="in", labelsize=FS - 3, length=2, width=0.5)
cb.outline.set_linewidth(0.5)
save(fig, "19_三维曲面", "19_三维曲面_LC滤波器频响")
def surf_05():
"""锂电池放电容量特性:倍率与温度的影响。"""
fig, ax = new_fig3d(left=0.13)
c = np.linspace(0.2, 3.0, 60)
t = np.linspace(-20, 45, 50)
C, T = np.meshgrid(c, t)
cap = 100 * (1 - 0.11 * (C - 0.2) ** 1.25) * (1 - 0.0042 * np.abs(T - 25) ** 1.4)
cap = np.clip(cap, 45, 102)
s = ax.plot_surface(C, T, cap, cmap=CMAP_SEQ, linewidth=0.15,
edgecolor="0.45", antialiased=True, rstride=2, cstride=2)
ax.set_xlabel("放电倍率 " + IT["C"], labelpad=2)
ax.set_ylabel("温度 " + IT["T"] + " / °C", labelpad=2)
ax.set_zlabel("可用容量 / %", labelpad=2)
ax.view_init(elev=25, azim=-130)
save(fig, "19_三维曲面", "19_三维曲面_电池容量特性")
说明
- 图片 1181×944 px(100 mm × 80 mm @ 300 dpi),三维图为 1181×1122 px。
- 图内不放标题,图题由本文件的标题承担。
- 数据为 10 kV 配网、380 V 低压、50 Hz 量级的仿真算例,随机种子固定,重跑结果一致。
浙公网安备 33010602011771号