Почему результат вычисления тригонометрической функции отличается? - PullRequest
0 голосов
/ 14 июня 2019

Я вычислил три метода из следующих с 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

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

РЕДАКТИРОВАТЬ Среднее круговых величин , предполагая, что подход sin, cos является лучшим.

Рефакторинг вашего кода для использования исключительно numy.Два метода различны, однако первые два, использующие 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
0 голосов
/ 14 июня 2019

С чего вы взяли, что средний угол и угол среднего вектора должны быть одинаковыми?Это верно только для n = 1,2, для n = 3 degAry = [0, 90, 90] легко проверить как контрпример: среднее значение углов составляет 60 с tan = sqrt(3), среднее значение вектора (1/3 2/3) соответствует tan = 2.

...