Линейное соответствие планетам - PullRequest
0 голосов
/ 14 января 2010

Поразительное выравнивание происходит 2048/5/28 с внутренними 5 планетами имеющие гелиоцентрические долготы (в градусах): 248,229, 66,631, 246,967, 249,605, 67,684.

Планеты находятся на расстоянии не более 0,875 градусов от линии (через Солнце) с уклоном 67,823 градуса. В этом случае искомый метод (PA) даст: PA (248,229, 66,631, 246,967, 249.605, 67,684) = (67,823, 0,875)

Я попробовал два простых алгоритма, которые оба не работают в этом случае: 2003/9/9: 340,256, 180,320, 346,156, 342,316, 150,285

Один метод дает наклон = 127,867, отклонение = 51,019, а другой 271,867, 85,251. Я думаю, что правильный метод даст s = 163,466, d = 7,515.

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

Питон или JavaScript приветствуются. Я понял, как редактировать! Или нет.

def score3(wList):
  wSize = len(wList)
  #print wList

  first = wList[0]
  d1 = first - 90.0
  if d1 < 0.0:    d1 += 360.0
  d2 = first + 90.0
  if d2 > 360.0:  d1 -= 360.0
  if d1 > d2:   d1,d2 = d2,d1

  sum = 0.0
  for wx in range(0,wSize):
    curr = wList[wx]
    if (curr > d1) and (curr < d2):
      new = curr
    else:
      new = (curr + 180.0) % 360.0
      wList[wx] = new
    sum += new
    #print '%7.3f --> %7.3f' % (curr, new)
  avg = sum / wSize
  #print avg, wList

  score = 0.0
  for wx in range(0,wSize):
    curr = wList[wx]
    diff = curr - avg
    if diff < 0:   diff = - diff
    score += diff
  score /= wSize

  return avg, score

1 Ответ

0 голосов
/ 14 января 2010

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

Это означает, что функция, которую вы хотите минимизировать:

\sum (forceAngleIntoQuandrantI(a_i - A))^2

или что-то эквивалентное. То есть планета никогда не может лежать более чем на 90 градусов от предложенной линии.

Теперь, если вы используете подпрограмму форсирования, как я показывал изначально (вы все еще можете найти это в истории редактирования этого ответа), проблема больше не является аналитической, и вам придется использовать итеративный подход (см. Метод деления пополам для простого подхода). Или вы можете заметить, что sin ^ 2 (theta) монотонно увеличивается в квадрантах I, IV и симметричен относительно линии + - 90 градусов и минимизирует

\sum sin^4(a_i - A) 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...