我确实看过这篇文章: 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。 ; /
谢谢!
答案 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值着色,因为我认为这给了一个更清晰的情节。 或者将+1更改为-1以获取两个工作表版本的工作表: