如何用Numpy计算时间变量的arctan2以得到[0,π]正解
求解[0, π]区间反正切结果的实现方案
先纠正两个容易搞错的点:
- 你之前的方程变形符号写反了:原式
a*cos(t)+b*sin(t)= c*cos(t)+d*sin(t)移项后是(a-c)cos(t) + (b-d)sin(t) = 0,推导得到的正切形式应该是tan(t) = (c-a)/(b-d),分子分母写反的话算出来的结果会完全错。 - Numpy里返回值范围为
[-π/2, π/2]的是单参数函数np.arctan(),你提到的np.arctan2(y, x)实际返回值范围是[-π, π],它会根据传入的x、y两个参数的符号自动判断角度所在象限,不会出现单参数arctan的象限混淆问题,也不会碰到分母为0的计算报错,鲁棒性更好。
Numpy本身没有专门做返回值固定在[0, π]区间的反正切函数,基于np.arctan2做一步简单的区间转换就能得到符合要求的结果,操作步骤如下:
- 按正确顺序传入参数调用
np.arctan2:对应tan(t) = sin(t)/cos(t)的定义,对变形后的方程,调用np.arctan2(a - c, d - b)即可得到范围在[-π, π]的初始计算值。 - 做区间映射:把所有小于0的初始计算结果加上
np.pi,最终输出的结果范围就会落在[0, π]区间,完全满足t作为时间不取负值的要求。
补充说明:由于正切函数的周期是π,上述方法得到的是方程在
[0, π]区间内的唯一解,如果需要后续更长时间点的周期解,直接在这个基础解上累加整数倍的np.pi就可以得到所有合法解。
内容的提问来源于stack exchange,提问作者Lost
相关产品推荐
相关产品推荐

