我很难解释反正切函数的结果。这种行为对于我遇到的所有实现都是一致的,所以我将在这里限制自己使用 NumPy 和 MATLAB。
这个想法是有一个随机放置的点圈。目标是表示它们在极坐标系中的位置,并且由于它们是均匀分布的,我希望 θ 角(使用atan2
函数计算)也可以在区间 -π ... π 上随机分布。
这是MATLAB的代码:
stp = 2*pi/2^8;
siz = 100;
num = 100000000;
x = randi([-siz, siz], [1, num]);
y = randi([-siz, siz], [1, num]);
m = (x.^2+y.^2) < siz^2;
[t, ~] = cart2pol(x(m), y(m));
figure()
histogram(t, -pi:stp:pi);
对于 Python 和 NumPy:
import numpy as np
import matplotlib.pyplot as pl
siz = 100
num = 100000000
rng = np.random.default_rng()
x = rng.integers(low=-siz, high=siz, size=num, endpoint=True)
y = rng.integers(low=-siz, high=siz, size=num, endpoint=True)
m = (x**2+y**2) < siz**2
t = np.arctan2(y[m], x[m]);
pl.hist(t, range=[-np.pi, np.pi], bins=2**8)
pl.show()
在这两种情况下,我得到的结果都是这样的,可以很容易地看到 π/4 的每个倍数的“步数”。
它看起来像是某种精度误差,但奇怪的是我没想到的角度。这种行为也存在于普通atan
功能中。