0

によって暗黙的に定義されたボリュームを持つ

x*y*z <= 1 

為に

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

利用可能なPythonモジュール、できればmayaviを使用して、その外面をプロットするにはどうすればよいですか?

関数 mlab.mesh は知っていますが、その入力がわかりません。3 つの 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 の場合) になりますが、これは私が探していたものとはまったく異なります。私が探しているのは、基本的には「3D のポリゴン」のような任意のサーフェスを描画する方法です。

サーフェスをプロットする次のコードを作成しました (mayavi でも動作します)。このコードを特定の問題に合わせて変更する必要がありますが、そのためには、3D サーフェスが 3 つの 2D 配列によって定義される理由と方法を理解する必要があります。これらの配列 ( xyおよび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()
4

2 に答える 2

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、次のようにこれらのサーフェスの 1 つをプロットできます ( 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 に答える