0

具有隐式定义的卷

x*y*z <= 1 

为了

-5 <= x <= 5 
-5 <= y <= 5 
-5 <= z <= 5 

我将如何使用可用的 Python 模块(最好是 mayavi)绘制其外表面?

我知道函数 mlab.mesh,但我不明白它的输入。它需要三个二维数组,我不明白如何创建具有上述信息的数组。

编辑:

也许我的问题在于对 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),这并不是我想要的。我正在寻找的基本上是一种绘制任意表面的方法,例如“3d 多边形”(如果有的话)。

我创建了以下代码,它绘制了一个曲面(也适用于 mayavi)。我需要根据我的特定问题修改此代码,但要做到这一点,我需要了解为什么以及如何由三个 2d 数组定义 3d 表面?这些数组(xyz代表什么?

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()
4

2 回答 2

2

外表面,隐含定义为

x*y*z = 1,

不能在全局范围内显式定义。要看到这一点,请考虑给定 x 和 y,然后:

z = 1/(x*y),

没有为x = 0or定义y = 0。因此,您只能在本地为不包含奇异性的域定义曲面,例如对于域

0 < x <= 5
0 < y <= 5

z确实是定义的(双曲曲面)。同样,您需要绘制其他域的曲面,直到您拼凑在一起

-5 <= x <= 5
-5 <= y <= 5

请注意,您的表面不是为x = 0和定义的y = 0,即坐标系的轴,因此您不能将表面拼凑在一起以获得全局定义的表面。

使用numpyand 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是一样的。

于 2013-08-01T10:10:08.280 回答
1

Mayavi 文档中定义函数的测试用例test_mesh()能够生成球体。这是通过更换

r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7

r = 1.0说。

但是,您的问题是您需要了解,当您想要绘制球体时,您正在编写的方程定义了一个体积。您需要重新制定它们以给出球体的参数方程。这基本上是上面示例中所做的,但您自己尝试一下可能是值得的。作为提示考虑一个圆的方程并扩展它。

于 2013-07-31T23:22:17.933 回答