gpt4 book ai didi

python - 如何绘制 2 个变量的 3D 函数

转载 作者:行者123 更新时间:2023-12-01 09:09:40 25 4
gpt4 key购买 nike

我正在尝试以 3D 方式绘制多种阻尼类型的振动放大系数。为了让那些不知道它是什么的人简化一下,基本上,你有 3 个变量:

  • beta,在 0 到无限之间变化,但我想以 0.2 的间隔将其可视化为 0 到 3。
  • 阻尼比 d,在 0 到无穷大之间变化,但我想以 0.1 的间隔将其从 0 到 1 绘制。
  • 最后是 nu,它是一个根据前面两个变量而变化的函数。

2D function, y is nu, x is beta

我的直觉告诉我应该用 (X,Y,Z) = (beta, d, nu) 来绘制它,但我刚刚开始使用这个库,而且我对 python 有点陌生,我只是使用它当我需要在类里面想象或计算问题时。我尝试为 beta 和 d 创建 2 个数组,但我不知道应该为 nu 创建数组,因为它依赖于两者。

这是我到目前为止的代码:

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


nu = []
b = [0.1 + i / 100 for i in range(0, 510)]
damp = [0.1 + i/10 for i in range(0,510)]

for d in damp:
nu_new = []
nu.append(nu_new)
for beta in b:
nu_new.append( math.sqrt(1+(2*d*beta)**2)/ math.sqrt((1-beta**2)**2+(2*d*beta)**2))

fig = plt.figure()
ax = Axes3D(fig)
ax.plot(b, d, nu)
plt.show()

我在尝试绘制这个过程中遇到了困难,所以如果您有任何建议,我会很高兴。

最佳答案

如果您使用 numpy,则不要使用 math 模块。 Numpy 作为内置的所有数学函数,但它们在 numpy 数组上的工作效果要好得多。我们可以借助网格计算所有 b、d 值的 nu。

网格网格可以接受 2 个 1D 数组,并返回 2 个 2D 数组,这样数组中的每个索引都对应于原始 1D 数组中唯一的一对元素。

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

b = np.arange(0.2, 3.2, 0.2)
d = np.arange(0.1, 1.0, 0.1)

B, D = np.meshgrid(b, d)
nu = np.sqrt( 1 + (2*D*B)**2 ) / np.sqrt( (1-B**2)**2 + (2*D*B)**2)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(B, D, nu)
plt.xlabel('b')
plt.ylabel('d')
plt.show()

这会产生: enter image description here

此外,3D 绘图往往会阻碍查看所有数据(因为尖峰隐藏了其后面的东西)。我会推荐 pcolormesh 或轮廓图。在后一种情况下,最后 6 行变为:

plt.contourf(B, D, nu)
plt.colorbar()
plt.xlabel('b')
plt.ylabel('d')
plt.show()

产生: enter image description here

关于python - 如何绘制 2 个变量的 3D 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51765184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com