{sin,cos}(arctan(x))与x/(x^2+y^2)

2024-09-28 05:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须定期计算{sin, cos}(arctan2(x))。这些表达式有更便宜的等价物,即

import numpy as np

np.random.seed(0)

a, b = np.random.rand(2)

print(np.cos(np.arctan2(b, a)))
print(a / np.sqrt(a ** 2 + b ** 2))
# or a / np.hypot(a, b)
print()
print(np.sin(np.arctan2(b, a)))
print(b / np.hypot(a, b))
0.6087819565465009
0.6087819565465009

0.7933375885355579
0.793337588535558

不幸的是,对于重要的边界情况a == b == 0.0,备选方案会产生错误并给出nan。我想避免两者

是否有专门的函数来计算{sin, cos}(arctan2(x))或者其他更合适的表达式?与上面一样,它需要用于标量和向量输入


Tags: orimportnumpy表达式asnprandomsqrt
1条回答
网友
1楼 · 发布于 2024-09-28 05:23:46

解决这个问题的一个可能的技巧是,当你除以0时,只需在值上加一个小ε

import numpy as np

np.random.seed(0)

a = np.random.rand(10)
b = np.random.rand(10)

a[0] = 0
b[0] = 0

eps = 1e-9

p1 = np.cos(np.arctan2(b, a))
p2 = (a+eps) / ((np.sqrt(a ** 2 + b ** 2))+eps)

print(np.allclose(p1, p2))

p1 = np.sin(np.arctan2(b, a))
p2 = b / (np.hypot(a, b)+eps)

print(np.allclose(p1, p2))  

相关问题 更多 >

    热门问题