具有由
隐式定义的卷x*y*z <= 1
代表
-5 <= x <= 5
-5 <= y <= 5
-5 <= z <= 5
我如何使用可用的Python模块绘制其外表面,最好是mayavi?
我知道函数mlab.mesh,但我不明白它的输入。它需要三个2D阵列,我不明白如何创建具有上述信息。
编辑:
也许我的问题在于对meshgrid() - 函数或者numpy的mgrid-class的理解不够。我看到我必须以某种方式使用它们,但我并没有完全理解它们的目的或这样的网格代表什么。
编辑:
我到了这里:
import numpy as np
from mayavi import mlab
x, y, z = np.ogrid[-5:5:200j, -5:5:200j, -5:5:200j]
s = x*y*z
src = mlab.pipeline.scalar_field(s)
mlab.pipeline.iso_surface(src, contours=[1., ],)
mlab.show()
这会产生一个体积的等值面(对于x * y * z = 1),这不是我想要的。我正在寻找的基本上是绘制任意表面的方法,如果有这样的东西就像“3d中的多边形”。
我创建了以下代码,它绘制了一个曲面(也适用于mayavi)。我需要将此代码修改为我的特定问题,但要做到这一点,我需要了解为什么以及如何通过三个2d阵列定义3d表面?这些数组(x
,y
和z
)代表什么?
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D
phi, theta = np.mgrid[0:np.pi:11j, 0:2*np.pi:11j]
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(x,y,z)
fig.show()
答案 0 :(得分:2)
外表面,由
隐式定义x*y*z = 1,
无法在全局范围内明确定义。要看到这一点,请考虑给出x和y,然后:
z = 1/(x*y),
未定义x = 0
或y = 0
。因此,您只能在本地为不包含奇点的域定义表面,例如对于域
0 < x <= 5
0 < y <= 5
确实定义了 z
(双曲面)。同样,您需要绘制其他域的曲面,直到您拼凑在一起
-5 <= x <= 5
-5 <= y <= 5
请注意,您的曲面未定义为x = 0
和y = 0
,即坐标系的轴,因此您无法将曲面拼接在一起以获得全局定义的曲面。
使用numpy
和matplotlib
,您可以按如下方式绘制其中一个表面(从http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots采用):
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0.25, 5, 0.25)
Y = np.arange(0.25, 5, 0.25)
X, Y = np.meshgrid(X, Y)
Z = 1/(X*Y)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(0, 10)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
我不熟悉mayavi
,但我认为使用numpy
创建网格也是一样的。
答案 1 :(得分:1)
定义函数test_mesh()
的{{3}}中的测试用例能够生成一个球体。这是通过替换
r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
r = 1.0
说。
然而,您的问题是您需要了解您正在编写的方程式在您想要绘制球体时定义一个体积。您需要重新构造它们以给出球体的参数方程。这基本上是在上面的示例中所做的,但是您可能值得花时间自己尝试一下。作为提示考虑圆的方程并扩展它。