Moyenne des angles
j'ai regardé quelques solutions ici, mais aucune ne fournit ce dont j'ai besoin, donc:
je dois faire la moyenne d'un ensemble d'angles(0 à 359.9, pas de négatifs) (A1 + A2 + A3 + An) / n
le problème est quand vous obtenez un tableau {1, 359, 2, 358} la moyenne si vous utilisez la formule ci-dessus est de 180, mais en fait il est censé être 0.
une idée?
4 réponses
ajouter des vecteurs unitaires de chaque angle et convertir le vecteur résultant en un angle. Si le vecteur de résultat est de longueur zéro, les entrées s'annulent et le résultat est indéterminé.
Un vecteur unitaire a une longueur de 1, et x et y les longueurs sont données par le cosinus et le sinus de l'angle. Ainsi vous faites la moyenne de vos exemples comme dans le pseudo-code suivant:
x = cos(radians(1)) + cos(radians(359)) + cos(radians(2)) + cos(radians(358));
y = sin(radians(1)) + sin(radians(359)) + sin(radians(2)) + sin(radians(358));
angle = degrees(atan2(y, x));
un rayon quittant un cercle peut être représenté de plus d'une manière. Il peut être 0 degrés, 360 degrés, 720 degrés,etc. Vous devez déterminer quelle est la bonne réponse acceptable pour votre cas, et des réponses intermédiaires secrètes à la réponse finale avant de la présenter.
1 + 359 + 2 + 358 = 360 + 360 = 720 degrees in total
720 / 4 = 360 / 2 = 180 degrees on average
ce n'est pas que la réponse devrait être zéro, c'est que 359 degrés n'est pas équivalent à -1 degrés parce que l'angle va autour du cercle"dans l'autre sens".
voulez-vous pour arrondir c'est à dire 0 devrait venir après 359 degré?
prendre un module du résultat avec 360.
avg = ( (a1 + a2 + an) /n ) % 360
faire la moyenne des degrés est un peu plus compliqué qu'il n'y paraît. J'ai dû faire ça au travail l'autre jour et je veux partager mes conclusions.
- ajouter 360 à l'une de vos valeurs ne devrait pas changer votre moyenne.
par exemple, avg(2 4 18) = moy(362,4,18) = 8 - changer toutes les valeurs par une valeur constante devrait changer la moyenne également beaucoup.
par exemple, avg(2-3,4-3,18-3) = moy(359,1,15) = 8-3 - si vos degrés "annulent", par exemple 0,120,240, la moyenne n'est pas définie
(c'est-à-dire qu'il y a plusieurs réponses tout aussi bonnes).
Je ne vois pas d'autre solution que de donner un message d'erreur.
après être tombé dans plusieurs pièges, je me suis retrouvé avec la définition suivante: La moyenne est la valeur qui minimise la variance.
une fois donnée la moyenne, la variance peut être calculée par:
- déplacement de toutes les valeurs par le même angle tel que la moyenne est à 180.
(Cela équivaut à" couper " le cercle du côté opposé de la moyenne.) - normalisant tous les angles entre 0 et 360.
- calcul de la moyenne normale.
- déplacement de la moyenne en arrière par l'angle que vous avez décalé les valeurs avant (en inversant l'étape 1).
cela prend du temps(n^2).
cependant, si toutes vos valeurs se situent dans un intervalle de 180 degrés, vous pouvez décaler les valeurs de sorte que 0 est contenu dans le plus grand écart de valeur et puis calculer la moyenne normale. Cela prend un temps O(n) fois.