Как Вы вычисляете среднее число ряда круговых данных?

Надеемся, что и центр карты, и вопросы о почтовом индексе были рассмотрены на форуме разработчиков MapQuest , пост .

https://developer.mapquest.com/forum/how-set-zoom-level-particular-zip-code

141
задан dbliss 4 March 2016 в 01:59
поделиться

10 ответов

Вычислите единичные векторы из углов и возьмите угол их среднего числа.

93
ответ дан 23 November 2019 в 23:10
поделиться

Необходимо определить среднее число более точно. Для конкретного случая двух углов я могу думать о двух различных сценариях:

  1. "истинное" среднее число, т.е. (+ b) / 2% 360.
  2. угол, который указывает "между" обоими другими при пребывании в том же полукруге, например, для 355 и 5, это было бы 0, не 180. Чтобы сделать это, необходимо проверить, больше ли различие между двумя углами, чем 180 или нет. Если так, увеличьте меньший угол 360 перед использованием вышеупомянутой формулы.

я не вижу, как вторая альтернатива может быть обобщена для случая больше чем двух углов, все же.

7
ответ дан 23 November 2019 в 23:10
поделиться

Я вижу проблему - например, если бы у Вас есть 45' углов и 315' углов, "естественное" среднее число было бы 180', но значение, которое Вы хотите, на самом деле 0'.

я думаю, что Starblue на что-то. Просто вычислите (x, y) декартовы координаты для каждого угла, и добавьте те итоговые векторы вместе. Угловое смещение заключительного вектора должно быть Вашим необходимым результатом.

x = y = 0
foreach angle {
    x += cos(angle)
    y += sin(angle)
}
average_angle = atan2(y, x)

я игнорирую на данный момент, что заголовок компаса запускается на севере и идет по часовой стрелке, тогда как "нормальные" декартовы координаты запускаются с нуля вдоль оси X и затем идут против часовой стрелки. Математика должна разработать тот же путь независимо.

50
ответ дан 23 November 2019 в 23:10
поделиться

Этот вопрос исследован подробно в книге: "Статистика По Сферам", Geoffrey S. Watson, Примечания Лекции Арканзасского университета в Математических Науках, 1983 John Wiley & Sons, Inc., как упомянуто в http://catless.ncl.ac.uk/Risks/7.44.html#subj4 Bruce Karsh.

А хороший способ оценить средний угол, A, от ряда угловых измерений [я] 0< =i

                   sum_i_from_1_to_N sin(a[i])
a = arctangent ---------------------------
                   sum_i_from_1_to_N cos(a[i])

метод, данный starblue, в вычислительном отношении эквивалентен, но его причины более ясны и вероятно программно более эффективны, и также работают хорошо в нулевом случае, таким образом, благодарность ему.

предмет теперь исследуется более подробно на Википедию , и с другим использованием, как дробные части.

56
ответ дан 23 November 2019 в 23:10
поделиться

ДЛЯ ОСОБОГО СЛУЧАЯ ДВУХ УГЛОВ:

Ответ ((a + b) mod 360) / 2 является НЕПРАВИЛЬНЫМ . Для углов 350 и 2 ближайшая точка - 356, а не 176.

Единичный вектор и триггерные решения могут быть слишком дорогими.

Я получил следующее:

diff = ( ( a - b + 180 + 360 ) mod 360 ) - 180
angle = (360 + b + ( diff / 2 ) ) mod 360
  • 0, 180 - > 90 (два ответа на это: это уравнение берет ответ по часовой стрелке из a)
  • 180, 0 -> 270 (см. Выше)
  • 180, 1 -> 90,5
  • 1, 180 -> 90,5
  • 20, 350 -> 5
  • 350, 20 -> 5 (все следующие примеры тоже меняются местами)
  • 10, 20 -> 15
  • 350, 2 -> 356
  • 359, 0 -> 359.5
  • 180, 180 -> 180
21
ответ дан 23 November 2019 в 23:10
поделиться

Alnitak имеет правильное решение. Решением Nick Fortescue является функционально то же.

Для особого случая где

(сумма (x_component) = 0,0 & & сумма (y_component) = 0.0)//, например, 2 угла 10. и 190. градусы, каждые

использование 0,0 градуса как сумма

В вычислительном отношении, необходимо протестировать на этот случай с тех пор atan2 (0., 0.) не определено и генерирует ошибку.

0
ответ дан 23 November 2019 в 23:10
поделиться

Средний угол phi_avg должен иметь свойство, что sum_i|phi_avg-phi_i |^2 становится минимальным, где различие должно быть в [-Пи, Pi) (потому что это могло бы быть короче для движения наоборот!). Это легко достигается путем нормализации всех входных значений к [0, 2Pi), хранения рабочего среднего числа phi_run и выбора нормализующий |phi_i-phi_run | к [-Пи, Pi) (путем добавления или вычитания 2Pi). Большинство предложений выше делает что-то еще, что делает не , имеют то минимальное свойство, т.е. они составляют в среднем что-то , но не углы.

0
ответ дан 23 November 2019 в 23:10
поделиться

Давайте представим эти углы с точками на окружности круга.

мы можем предположить, что все эти точки падают на ту же половину круга? (Иначе нет никакого очевидного способа определить "средний угол". Думайте о двух точках на диаметре, например, 0 градусов и 180 градусов---составляют средние 90 градусов или 270 градусов? Что происходит, когда у нас есть 3 или больше равномерно распространенных точки?)

С этим предположением, мы выбираем произвольную точку на том полукруге как "источник" и имеем размеры, данный набор углов относительно этого источника (назовите это "относительным углом"). Обратите внимание, что относительный угол имеет абсолютное значение строго меньше чем 180 градусов Наконец, возьмите средние из этих относительных углов для получения желаемого среднего угла (относительно нашего источника, конечно).

1
ответ дан 23 November 2019 в 23:10
поделиться

Вот идея: создайте среднее число многократно, всегда вычисляя среднее число углов, которые являются самыми близкими вместе, сохраняя вес.

Другая идея: найдите самый большой разрыв между данными углами. Найдите точку, которая делит пополам его, и затем выберите противоположную точку на круге как ссылочный нуль для вычисления среднего числа от.

1
ответ дан 23 November 2019 в 23:10
поделиться

Я бы пошел векторным путем с помощью комплексных чисел. Мой пример в Python, который имеет встроенные комплексные числа:

import cmath # complex math

def average_angle(list_of_angles):

    # make a new list of vectors
    vectors= [cmath.rect(1, angle) # length 1 for each vector
        for angle in list_of_angles]

    vector_sum= sum(vectors)

    # no need to average, we don't care for the modulus
    return cmath.phase(vector_sum)

Обратите внимание, что Python не необходим для создания временного нового списка векторов, все вышеперечисленное можно сделать за один шаг; Я просто выбрал этот способ, чтобы аппроксимировать псевдокод, применимый и к другим языкам.

2
ответ дан 23 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: