我用Numpy计算了以下三种方法。
为避免圆周期性,我给定范围是0到+180。 三种方法的计算结果应该匹配。
但是,所有计算结果都不同。 为什么会这样?
degAry = []
sumDeg = 0
cosRad = 0
sinRad = 0
LEN = 300
RAD2DEG = 180.0 / PI # 57.2957795
for i in range(LEN):
deg = random.uniform(0,180)
rad = np.deg2rad(deg)
degAry.append(deg)
sumDeg += deg
cosRad += np.cos(rad)
sinRad += np.sin(rad)
print(np.arctan2( sinRad/LEN, cosRad/LEN ) * RAD2DEG) # 88.39325364335279
print(np.sum(degAry)/LEN) # 88.75448888951954
print(sumDeg/LEN) # 88.75448888951951
答案 0 :(得分:0)
是什么让您认为平均角度和平均矢量的角度应该相同?这仅对n = 1,2
是正确的,对于n = 3
degAry = [0, 90, 90]
很容易被证明是一个反例:角度的均值为60
,tan = sqrt(3)
为均值向量是(1/3 2/3)
对应于tan = 2
。
答案 1 :(得分:0)
编辑 Mean of circular quantities 暗示罪过,cos方法是最好的。
重构代码以仅使用numpy。两种方法是不同的,但是,使用RAD2DEG或np.degrees的前两种方法会得到相同的结果。后者使用度数总和除以样本大小而有所不同。
这似乎不是一个求和问题(N = 3000,按正常顺序求和,先升后降)。它们产生相同的结果
np.sum(deg) # 134364.25172174018
np.sum(np.sort(deg)) # 134364.25172174018
np.sum(np.sort(deg)[::-1]) # 134364.25172174018
我并没有以弧度形式对cos和sin求和。我会把它留给别人。
PI = np.pi
sumDeg = 0.
cosRad = 0.
sinRad = 0.
N = 30
RAD2DEG = 180.0 / PI # 57.2957795
deg = np.random.uniform(0, 90.0, N)
rad = np.deg2rad(deg)
sumDeg = np.sum(deg)
cosRad = np.sum(np.cos(rad))
sinRad = np.sum(np.sin(rad))
print(np.arctan2(sinRad/N, cosRad/N) * RAD2DEG)
print(np.degrees(np.arctan2(sinRad/N, cosRad/N)))
print(sumDeg/N)
结果
> N = 1
> 22.746571717879792
> 22.746571717879792
> 22.746571717879792
>
> N= 30
> 48.99636699165551
> 48.99636699165551
> 49.000295118106884
>
> N = 300
> 44.39333460088003
> 44.39333460088003
> 44.44513528547155
>
> N = 3000
> 44.984167020219175
> 44.984167020219175
> 44.97574462726241