双曲面绘图

时间:2014-07-15 23:18:51

标签: python matplotlib

我确实看过这篇文章: Plotting A Hyperboloid

然而,对我来说,如何将公式转化为这一点并不是那么明显:

x = a*np.cosh(u)*np.cos(v)
y = b*np.cosh(u)*np.sin(v)
z = c*np.sinh(u)

我的等式是:

(x**2 + y**2)/a + z**2/b = c

这是此链接中的等式1:http://arxiv.org/pdf/1211.0980.pdf

我真的想改变a,b,c值然后看看表面是如何变化的。 我用于x,y,z的公式是什么,或者我怎么能得到它们?

当我得到这样的等式时:

 z = np.sqrt(b*(c**2 - (np.cosh(u)**2)/a))

我在表面中间得到了一堆Nans。 ; /

谢谢!

1 个答案:

答案 0 :(得分:1)

你提到的两个表达式都适用于一个类人猿,但是笛卡尔式的表达式通常更容易一些(并且隐式方程中存在符号错误)。对于这种情况,坚持你的等式,正确的形式是

(x**2 + y**2)/a - z**2/b = c

并且圆形双曲面的更标准表达式将是

(x**2 + y**2)/a**2 - z**2/b**2 = 1  (or -1 for a two-sheet hyperboloid)

要在matplotlib中绘制这些,请创建一个x和y的网格,然后计算z,如下所示:

from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)

Z = np.sqrt(4.*(X**2 + Y**2)/1. + 1)

xcolors = X - min(X.flat)
xcolors = xcolors/max(xcolors.flat)

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=cm.hot(xcolors),
    linewidth=1)

plt.show()

这里我用x值着色,因为我认为这给了一个更清晰的情节。 enter image description here 或者将+1更改为-1以获取两个工作表版本的工作表: enter image description here