具有由隐式定义的卷
x*y*z <= 1
对于
-5 <= x <= 5
-5 <= y <= 5
-5 <= z <= 5
我该如何使用可用的Python模块(最好是mayavi)绘制它的外表面?
我知道函数mlab.mesh,但我不理解它的输入。它需要三个2D阵列,我不知道如何创建具有上述信息的阵列。
编辑:
也许我的问题在于对meshgrid()函数或numpy的mgrid类的理解不足。我看到我必须以某种方式使用它们,但我并没有完全理解它们的目的,也没有完全理解这样一个网格代表什么。
编辑:
我到达这里:
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),这不是我想要的。我所寻找的基本上是一种绘制任意曲面的方法,比如"三维多边形",如果有这样的东西的话。
我创建了以下代码,用于绘制曲面(也适用于mayavi)。我需要根据我的特定问题修改这段代码,但要做到这一点,我需要了解为什么以及如何通过三个二维数组定义三维曲面?这些阵列(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()
隐含定义的外表面
x*y*z = 1,
不能显式全局定义。要看到这一点,请考虑给定的x和y,然后:
z = 1/(x*y),
其不是针对CCD_ 4或CCD_。因此,您只能为不包括奇异性的域局部定义曲面,例如,为域
0 < x <= 5
0 < y <= 5
CCD_ 6确实是定义的(双曲面)。类似地,您需要绘制其他域的曲面,直到您将拼接在一起
-5 <= x <= 5
-5 <= y <= 5
请注意,曲面不是为x = 0
和y = 0
(即坐标系的轴)定义的,因此无法将曲面拼接在一起以获得全局定义的曲面。
使用numpy
和matplotlib
,可以绘制其中一个曲面,如下所示(采用http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-绘图):
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
创建网格也可以。
Mayavi文档中定义函数test_mesh()
的测试用例能够生成一个球体。这是通过更换来完成的
r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7
例如CCD_ 14。
然而,你的问题是,当你想画一个球体时,你需要明白你正在写的方程定义了一个体积。你需要重新表述它们来给出一个球体的参数方程。这基本上就是上面例子中所做的,但你自己尝试一下可能是值得的。作为提示,考虑圆的方程并对其进行扩展。