可能重复:
你如何计算一组角度的平均值?
如果我有一组轴承,范围从 1 到 360,我怎样才能找到平均值?通常要找到平均值,会将它们全部加起来并除以项目数。这里的问题是,在 [1, 359], 2 个轴承的情况下这样做会导致 180,实际上应该是 360。有什么想法吗?
可能重复:
你如何计算一组角度的平均值?
如果我有一组轴承,范围从 1 到 360,我怎样才能找到平均值?通常要找到平均值,会将它们全部加起来并除以项目数。这里的问题是,在 [1, 359], 2 个轴承的情况下这样做会导致 180,实际上应该是 360。有什么想法吗?
将角度表示为 Norm=1 的向量并对总和进行平均。
x1 = {cos(a),sin(a)}
x2 = {cos(b),sin(b)}
(x1+x2)/2 = {(cos(a)+cos(b))/2,(sin(a)+sin(b))/2}
这意味着平均值的角度是
atan2((sin(a)+sin(b)) /(cos(a)+cos(b)))
当分母接近零时,请注意控制可能的溢出。
从您的问题中不清楚您试图将“平均”定义为什么......对于圆圈上的方向,没有明确的平均概念。
一种解释是与x
所提供值的集合最接近的值,在最小二乘意义上,其中两个轴承之间的距离定义为它们之间的最小角度。这是计算这个平均值的代码:
In[2]:= CircDist[a_, b_] := 180 - Mod[180 + a - b, 360]
In[6]:= Average[bearings_] :=
x /. NMinimize[
Sum[CircDist[x, bearings[[i]]]^2, {i, 1, Length[bearings]}],
x][[2]]
In[10]:= Average[{1, 359}]
Out[10]= -3.61294*10^-15
所以你想要的是两个轴承的中间 - 如果你有 {90, 270} 会发生什么?期望的答案是 0 还是 180?这是要考虑的事情..三个轴承的中间是什么?
你可以做的一件事是:
在我的脑海中,我不认为这是公平的,它可能会偏向一个方向(即可能会优先考虑你集合中的后续值)。