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

代码在Colab运行正常但Jupyter报sqrt无效值错误,是什么原因?

问题原因说明
  • 你看到的两类提示均不属于运行错误,属于运行警告,代码在Colab和Jupyter中的运行逻辑完全一致,仅两个环境的默认警告展示策略不同:Colab默认过滤了低优先级的运行时警告,Jupyter默认开启全量警告展示,因此出现Colab无提示、Jupyter弹出警告的差异。
  • 第一个RuntimeWarning: invalid value encountered in sqrt触发原因:你的函数f(x,y)的逻辑是对9 - x**2 - y**2开平方,要求被开方数必须≥0,也就是采样点需要满足x² + y² ≤ 9。但你设置的x取值范围是[-4, 4],当x的绝对值大于3时,仅x²就已经超过9,不管y取何值,被开方数都是负数,numpy计算负数的平方根会返回NaN(非数值),因此触发该警告。
  • 第二个UserWarning: Z contains NaN values. This may result in rendering artifacts.触发原因:你传给plot_surface的Z轴数据,也就是f(X,Y)的计算结果,包含大量NaN,matplotlib的3D绘图遇到NaN会跳过对应位置的渲染,可能出现画面缺块的异常效果,因此触发该提示。
修复方案
  • 方案1:调整采样范围从根源避免无效值。你可以把x的取值范围调整为np.linspace(-3, 3, 100),同时对应调整y的取值范围保证所有采样点都满足x² + y² ≤9,示例修改如下:
def f(x, y): return np.sqrt(9 - x**2 - y**2)
# 调整x的范围到-3~3
x = np.linspace(-3, 3, 100)
# 调整y的范围保证x²+y²最大为9
y = np.linspace(-np.sqrt(9 - x.max()**2), np.sqrt(9 - x.max()**2), 100)

X, Y = np.meshgrid(x, y)
ax = plt.axes(projection = '3d')

ax.plot_surface(X, Y, f(X, Y))
  • 方案2:预处理计算结果兼容无效值。如果你需要保留原有的采样范围,可以对f的计算结果做NaN替换处理,避免渲染异常,同时可以根据需要选择是否关闭警告提示:
import warnings
# 可选:临时关闭运行时警告,不推荐使用,会屏蔽其他有效警告
warnings.filterwarnings("ignore")
def f(x, y): return np.sqrt(9 - x**2 - y**2)
x = np.linspace(-4, 4, 100)
y = np.linspace(-2, 2, 100)

X, Y = np.meshgrid(x, y)
ax = plt.axes(projection = '3d')
# 把NaN替换为0,避免渲染异常
ax.plot_surface(X, Y, np.nan_to_num(f(X, Y), nan=0))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:06:03