双曲面绘图
我看到过这个帖子: 绘制双曲面
不过,我不太明白这个公式是怎么变成这样的:
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 个回答
3
你提到的两个表达式都是有效的,用于描述双曲面,但笛卡尔坐标系的表达式通常稍微简单一点(而且你的隐式方程中有个符号错误)。在这种情况下,按照你的方程,正确的形式是
(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,就可以得到双层版本的一个面:
