我试图三维绘图放大系数的振动多种类型的阻尼。为了简化那些不知道它是什么的人,基本上,你有3个变量:
- β,它在0和无穷大之间变化,但我想把它从0到3,在0。2个间隔。
- 阻尼比,d,它在0和无穷大之间变化,但我想把它从0画到1。1间隔。
- 最后是nu,它是一个根据前面两个变量而变化的函数。
我的直觉告诉我应该用(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()
我有点坚持试图策划这一点,所以如果你有任何建议,我会很高兴。
3条答案
按热度按时间uqdfh47h1#
如果你使用的是
numpy
,那么不要使用math
模块。Numpy和所有内置的数学函数一样,但它们在numpy数组上的工作要好得多。我们可以在网格的帮助下计算所有B,d值的nu。meshgrid可以获取2个1D数组,并返回2个2D数组,使得数组中的每个索引对应于原始1D数组中的唯一元素对。
这产生:
此外,3D图往往会阻止看到所有数据(因为尖峰隐藏了它后面的东西)。我建议使用pcolormesh或contourf plot。在后一种情况下,最后6行变为:
其产生:
qni6mghb2#
这应该可以工作:我不是PythonMaven,特别是两个for循环可能非常不符合Python,但它完成了工作。
bq3bfh9z3#
你需要先创建一个
matplotlib figure
。此外,所有变量的大小应该相同。因此,变量
d
应该是一个与其他变量相同长度的数组。如果你把你的变量
d
变成0.1
的数组,长度510
,你会得到如下结果。你会得到: