6

可能重复:
你如何计算一组角度的平均值?

如果我有一组轴承,范围从 1 到 360,我怎样才能找到平均值?通常要找到平均值,会将它们全部加起来并除以项目数。这里的问题是,在 [1, 359], 2 个轴承的情况下这样做会导致 180,实际上应该是 360。有什么想法吗?

4

3 回答 3

7

将角度表示为 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)))  

当分母接近零时,请注意控制可能的溢出。

在此处输入图像描述

于 2011-03-04T03:30:15.303 回答
1

从您的问题中不清楚您试图将“平均”定义为什么......对于圆圈上的方向,没有明确的平均概念。

一种解释是与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
于 2011-03-04T03:42:14.570 回答
0

所以你想要的是两个轴承的中间 - 如果你有 {90, 270} 会发生什么?期望的答案是 0 还是 180?这是要考虑的事情..三个轴承的中间是什么?

你可以做的一件事是:

  • 取你的组中的前两个轴承
  • 计算出两者在任一方向上的差异(即 [1, 359] 在一个方向上给出 2 度,在另一个方向上给出 358)
  • 如果您希望所需的角度是两者中最尖锐的角度的中间,请将其作为您的差异并添加到该对中的大部分逆时针(即 359)
  • 将其用作新轴承,将下一个(即第 3 个)用作另一个轴承,并重复,直到所有轴承都“居中”。

在我的脑海中,我不认为这是公平的,它可能会偏向一个方向(即可能会优先考虑你集合中的后续值)。

于 2011-03-04T03:32:18.077 回答