NumPy中conjugate与angle计算相位差的数值差异原因问询
两种复数相位差计算方式的差异原因
浮点精度误差(小差异场景)
第一个测试用例中两个结果的差异仅在浮点数末位,属于多步运算的正常舍入误差:
np.angle(a*np.conjugate(a0))需要先执行共轭计算、复数乘法两步运算,再求解幅角np.angle(a) - np.angle(a0)是分别求解两个复数的幅角后再做减法
不同运算链路的舍入误差累计结果不同,这类差异量级通常在1e-15级别,不会对实际使用造成影响。
相位卷绕(大差异/符号相反场景)
第二个测试用例的明显差异是核心问题,由np.angle的输出范围限制导致:
np.angle的返回值会被自动约束在[-π, π]区间内,任何超出该范围的相位都会被自动加减2π的整数倍,直到落入区间,这个特性叫做相位卷绕。- 计算第二个测试用例两个结果的差值:
3.2307217955357035 - (-3.0524635116438827) ≈ 6.283185307,刚好等于2π,说明两个结果本质是同一个相位差的不同表示形式。 - 直接相减的计算方式得到的结果没有经过区间约束,超过了
[-π, π]的范围;而先乘共轭再算幅角的方式,得到的结果会被自动折叠到[-π, π]区间内,因此出现了看似符号相反、数值差异极大的情况。
如果需要两种方式的结果统一,可以对直接相减得到的相位差做卷绕处理,比如通过np.unwrap函数调整,或者手动加减2π将结果对齐到目标区间。
内容的提问来源于stack exchange,提问作者decadenza
相关产品推荐
相关产品推荐

