关于atan与atan2的区别及相位函数绘图异常的技术咨询
关于atan与atan2的区别及相位函数绘图异常的技术咨询
你好,我来帮你拆解这个问题的核心点,一步步给你解释清楚:
一、你的atan2参数传递是正确的
首先明确atan2(y, x)的定义:它返回平面坐标系中点(x, y)与原点连线和x轴正方向的夹角,输出范围是**(-π, π)**。而你的原式是:
$$f(\omega) = \arctan\left(\frac{-\omega\cdot R / L}{-w^2 + 1/(C\cdot L)}\right)$$
这里的分子对应atan2的第一个参数(y值,即tanθ的分子),分母对应第二个参数(x值,即tanθ的分母),所以你写成atan2(-w*R/L, -w**2 + 1/(C*L))完全符合atan2(y, x)的参数规则,是正确的。
二、为什么用atan会得到“错误”的绘图?
这本质是atan和atan2的输出范围与象限识别能力的差异:
atan(z)的输入是一个实数z(即y/x的结果),输出范围是**(-π/2, π/2)**,它只能识别第一、第四象限的角度。因为tanθ在第一和第三象限都是正的,第二和第四象限都是负的——当你只给atan一个z值时,它无法区分θ是来自第一象限还是第三象限(z正的时候),也无法区分是第二还是第四象限(z负的时候)。- 回到你的相位函数场景:
- 当ω远小于谐振频率$\omega_0 = \frac{1}{\sqrt{C\cdot L}}$时,分母
-w² + 1/(C·L)为正,分子-w·R/L为负,此时z=负/正=负,atan(z)返回第四象限的负角度,和实际一致; - 当ω大于$\omega_0$时,分母变为负,分子还是负,此时z=负/负=正,
atan(z)会返回第一象限的正角度,但实际对应的角度应该是第三象限的负角度(范围在-π到-π/2之间)——这就导致绘图出现跳变,看起来完全不像正常的相位曲线; - 而
atan2会同时根据y和x的符号判断象限,直接返回正确的角度值,所以绘图是正常的。
- 当ω远小于谐振频率$\omega_0 = \frac{1}{\sqrt{C\cdot L}}$时,分母
附测试用SageMath代码
R = 100 L = 1.5e-3 C = 1.6e-9 abs_H(w) = 1/(C*L) / sqrt( (-w**2 + 1/(C*L))**2 + (R/L*w)**2 ) # phase_H(w) = atan( -(w*R/L) / (-w**2 + 1/(C*L)) ) * 180/pi phase_H(w) = atan2( -(w*R/L) , (-w**2 + 1/(C*L)) ) * 180/pi # Notice atan2; otherwise it doesn't work p = plot(abs_H, w, (10, 1e7), scale='loglog') q = plot(phase_H, w, (10, 1e7), ymin=-180, scale='semilogx') show(p) print('') show(q) print('')
备注:内容来源于stack exchange,提问作者Martel
相关产品推荐
相关产品推荐

