如何绘制[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
相关产品推荐
相关产品推荐

