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

如何绘制[sin(nx)/sin(x)]²函数?遇NaN值及除法警告求解

问题根源与解决方法

问题本质

你遇到的NaN和除法警告,核心原因是数组中存在某些x值,使得分母np.sin(alpha * x * np.pi)等于0:

  • 当alpha * x * np.pi = kπ(k为整数)时,sin(alpha * x * np.pi) = 0,此时做除法会触发除以0的错误,得到NaN。
  • 代入你的alpha≈0.452,计算x = k/alpha,k取1到13时,x值在2.212到28.761之间,刚好落在你0.001到30的取值范围内,这些位置就是触发问题的点。
  • 你用linspace时没出问题,只是因为linspace生成的点刚好避开了这些临界x值,不是真的没有问题。

临时方案的局限性

你用x[np.sin(x) != 0]过滤的方法,会直接丢弃这些临界位置的元素,导致数组长度变化,后续绘图时可能出现数据缺失的问题。

正确解决方法

利用数学极限处理这些临界值:当sin(a)→0时,sin(n*a)/sin(a)的极限是n(平方后为n²)。可以用numpy的掩码或np.where实现,既保留所有元素,又避免除以0:

代码示例

import numpy as np

def fun(x, n, alpha, beta):
    # 计算分母
    denom = np.sin(alpha * x * np.pi)
    # 处理浮点数精度,用极小值判断分母是否接近0
    zero_mask = np.abs(denom) < 1e-10
    
    # 计算比值平方:非0位置正常计算,0位置赋值n²
    ratio_sq = np.where(
        zero_mask,
        n**2,
        (np.sin(n * alpha * x * np.pi) / denom)**2
    )
    
    # 乘以sinc项返回结果
    return (np.sinc(beta * x)**2) * ratio_sq

关键说明

  • 用np.abs(denom) < 1e-10而非直接denom == 0:因为浮点数计算存在精度误差,真正等于0的情况很少,更多是接近0的极小值,直接判等会漏掉这些点。
  • np.where会保持原数组的形状,不会丢失数据,后续绘图可以正常使用完整的x和y数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:07:14