目标是使用 meshgrid 和 numpy 库生成伪球体的三维图形,但我使用下面的代码生成的图形不完整
u = np.linspace(0, np.pi, 50)
v = np.linspace(0, 2*np.pi, 100)
x, y = np.meshgrid(u, v)
X = np.arccos(x)*np.cos(y)
Y = np.arccos(x)*np.sin(y)
Z = x-np.tan(x)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
期望生成类似的图形
你代码的问题在于
u
的定义域。伪球面的参数化方式中,
u
不应该在整个
[0, pi]
区间内取值,而应该限制在
(0, pi)
,以避免在
u=0
和
u=pi
处出现奇异点。
以下是修改后的代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 注意 u 的取值范围
u = np.linspace(1e-5, np.pi - 1e-5, 50) # 避免 u=0 和 u=pi
v = np.linspace(0, 2*np.pi, 100)
x, y = np.meshgrid(u, v)
X = np.arccos(x)*np.cos(y)
Y = np.arccos(x)*np.sin(y)
Z = x-np.tan(x)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()
这段代码做了以下修改:
-
将
u
的取值范围从[0, pi]
改为(0, pi)
,通过设置1e-5
的微小偏移量来避免奇异点。 - 其他部分保持不变。
修改后的代码将生成一个完整的伪球面图形,类似于你提供的第二个图片。
标签:python,python-3.x,geometry,geometry-surface From: 78845440