我正在尝试对多种阻尼类型的振动进行3D放大图绘制。为了让那些不知道它是什么的人简化它,基本上,您有3个变量:
我的直觉说我应该用(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()
我有点想绘制这个图,所以如果您有任何建议,我会很高兴的。
答案 0 :(得分:0)
您需要首先创建一个matplotlib figure
。
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(b, d, nu)
plt.show()
此外,所有变量的大小均应相同。因此,变量d
的长度应与其他变量相同。
如果将变量d
转换为长度为0.1
的{{1}}数组,您将得到关注。
510
您得到:
答案 1 :(得分:0)
这应该起作用: 我不是Python专家,尤其是两个for循环可能非常不适合Python,但可以完成工作。
import math
import matplotlib.pyplot as plt
import numpy as np
b = np.arange(0.2, 3.2, 0.2)
d = np.arange(0.1, 1.0, 0.1)
nu = np.zeros( (b.size, d.size) )
counter_y = 0
for deta in d:
counter_x = 0
for beta in b:
nu[counter_x, counter_y] = math.sqrt( 1 + (2*deta*beta)**2 ) / math.sqrt( (1-beta**2)**2 + (2*deta*beta)**2)
counter_x += 1
counter_y += 1
X, Y = np.meshgrid(d, b)
fig = plt.figure()
ax = fig.add_subplot(111, projection = '3d')
ax.plot_surface(X, Y, nu)
答案 2 :(得分:0)
如果您使用的是numpy
,请不要使用math
模块。 Numpy是所有内置的数学函数,但是它们在numpy数组上的工作要好得多。借助网格可以在所有b,d值上计算nu。
meshgrid可以获取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()
此外,3D绘图往往会阻止查看所有数据(因为尖峰将数据隐藏在其后面)。我建议使用pcolormesh或Contourf图。在后一种情况下,最后6行变为:
plt.contourf(B, D, nu)
plt.colorbar()
plt.xlabel('b')
plt.ylabel('d')
plt.show()