双曲面绘图

4 投票
1 回答
3176 浏览
提问于 2025-04-18 13:29

我看到过这个帖子: 绘制双曲面

不过,我不太明白这个公式是怎么变成这样的:

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值来上色,因为我觉得这样能让图看得更清楚。

enter image description here

或者把+1改成-1,就可以得到双层版本的一个面:

enter image description here

撰写回答