You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用笛卡尔坐标绘制完整球体?np.sqrt致半球问题

如何用笛卡尔坐标绘制完整球体(解决np.sqrt仅返回正值的问题)

我懂你说的痛点!用np.sqrt默认只能拿到正的z值,所以画出来自然是上半球,而且当x²+y²超过1的时候,根号里的数变成负数,还会弹出那个烦人的RuntimeWarning: invalid value encountered in sqrt警告。

既然你只关注基于x²+y²+z²=1的笛卡尔坐标实现方案,那我们可以通过绘制上下两个半球来解决这个问题,同时还能消除警告,具体步骤如下:

  • 先计算z的平方项,把其中小于0的部分替换为NaN(这样np.sqrt就不会处理无效的负数,警告也就消失了)
  • 分别计算上半球的正z值和下半球的负z值
  • 调用两次plot_surface分别绘制上下半球,组合起来就是完整的球体

下面是修改后的完整代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(1,2,1, projection='3d')

xs = np.linspace(-1, 1, 100)
ys = np.linspace(-1, 1, 100)
xs, ys = np.meshgrid(xs, ys)

# 计算z的平方项,将小于0的部分设为NaN,避免无效计算
z_squared = 1 - xs**2 - ys**2
z_squared[z_squared < 0] = np.nan

# 分别计算上下半球的z值
zs_upper = np.sqrt(z_squared)
zs_lower = -np.sqrt(z_squared)

# 绘制上半球和下半球
ax.plot_surface(xs, ys, zs_upper, lw=0, antialiased=True)
ax.plot_surface(xs, ys, zs_lower, lw=0, antialiased=True)

plt.show()

这样修改后,你就能得到完整的单位球体,而且不会再出现那个RuntimeWarning,完全符合你要求的基于笛卡尔坐标方程的实现方式。

内容的提问来源于stack exchange,提问作者runo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:58:28