Решение уравнения Кеплера в вычислительном отношении - PullRequest
7 голосов
/ 13 марта 2011

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

Я не вижу, глядя на математику, какчтобы сделать это в вычислительном отношении, поэтому я надеялся, что кто-то с лучшим математическим образованием может мне помочь.Как я могу решить этого зверя в вычислительном отношении?

FWIW, я использую F # - и я могу вычислить другие элементы, необходимые для этого уравнения, именно с этой частью у меня возникли проблемы.

Я также открыт для методов, которые аппроксимируют истинную аномалию с учетом времени, расстояния периапсиса и эксцентриситета

Ответы [ 3 ]

8 голосов
/ 13 марта 2011

Эта статья:

Практический метод решения уравнения Кеплера
http://murison.alpheratz.net/dynamics/twobody/KeplerIterations_summary.pdf

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


Вы также можете найти интересным. Это программа ocaml, часть которой утверждает, что содержит решатель уравнений Кеплера. Поскольку F # входит в семейство языков ML (как и ocaml), это может послужить хорошей отправной точкой.

3 голосов
/ 11 августа 2012

хотел бы оставить здесь ответ, если эту страницу найдет кто-то, кто ищет похожие материалы.

Следующее было написано как "выражение" в программном обеспечении Adobe After Effects, так что это javascriptish, хотяУ меня есть версия Python для другого приложения (Cinema 4D).Идея та же: выполняйте метод Ньютона итеративно, пока не будет достигнута некоторая произвольная точность.

Обратите внимание, что я не публикую этот код как примерный или значимо эффективный в любым способом, просто публикуюкод, который мы создали в срок, чтобы выполнить определенную задачу (а именно, перемещать планету вокруг фокуса в соответствии с законами Кеплера и делать это точно).Мы не пишем код для жизни, и поэтому мы не публикуем его для критики.Quick & dirty - это то, что соответствует срокам.

В After Effects любой код «выражения» выполняется один раз - для каждого отдельного кадра в анимации.Это ограничивает то, что можно делать при реализации многих алгоритмов, из-за невозможности легко обращаться к глобальным данным (другие алгоритмы для кеплеровского движения используют интерактивно обновляемые векторы скорости, подход, который мы не могли использовать).В результате код оставляет позицию [x, y] объекта в этот момент времени (внутренне это номер кадра), и код предназначен для присоединения к элементу позиции слоя объекта награфик времени.

Этот код разработан из материала, найденного по адресу http://www.jgiesen.de/kepler/kepler.html,, и предлагается здесь для следующего парня.

pi = Math.PI;
function EccAnom(ec,am,dp,_maxiter) { 
// ec=eccentricity, am=mean anomaly,
// dp=number of decimal places
    pi=Math.PI;
    i=0; 
    delta=Math.pow(10,-dp); 
    var E, F; 

    // some attempt to optimize prediction
    if (ec<0.8) {
        E=am;
    } else {
       E= am + Math.sin(am);
    }
    F = E - ec*Math.sin(E) - am; 
    while ((Math.abs(F)>delta) && (i<_maxiter)) {
        E = E - F/(1.0-(ec* Math.cos(E) )); 
        F = E - ec * Math.sin(E) - am; 
        i = i + 1;
    } 
    return Math.round(E*Math.pow(10,dp))/Math.pow(10,dp);
} 
function TrueAnom(ec,E,dp) { 
    S=Math.sin(E); 
    C=Math.cos(E); 
    fak=Math.sqrt(1.0-ec^2);

    phi = 2.0 * Math.atan(Math.sqrt((1.0+ec)/(1.0-ec))*Math.tan(E/2.0));
    return Math.round(phi*Math.pow(10,dp))/Math.pow(10,dp);
} 
function MeanAnom(time,_period) {
    curr_frame  = timeToFrames(time);
    if (curr_frame <= _period) {
        frames_done = curr_frame;
        if (frames_done < 1) frames_done = 1;
    } else {
        frames_done = curr_frame % _period;
    }
    _fractime = (frames_done * 1.0 ) / _period;
    mean_temp   = (2.0*Math.PI) * (-1.0 * _fractime);
    return mean_temp;
}
//==============================
// a=semimajor axis, ec=eccentricity, E=eccentric anomaly 
// delta = delta digits to exit, period = per., in frames
//----------------------------------------------------------
_eccen      = 0.9;              
_delta      = 14;
_maxiter    = 1000;                 
_period     = 300;          
_semi_a     = 70.0;
_semi_b     = _semi_a * Math.sqrt(1.0-_eccen^2); 
_meananom = MeanAnom(time,_period);
_eccentricanomaly = EccAnom(_eccen,_meananom,_delta,_maxiter);
_trueanomaly = TrueAnom(_eccen,_eccentricanomaly,_delta);
r = _semi_a * (1.0 - _eccen^2) / (1.0 + (_eccen*Math.cos(_trueanomaly)));
x = r * Math.cos(_trueanomaly);
y = r * Math.sin(_trueanomaly);
_foc=_semi_a*_eccen;
[1460+x+_foc,540+y];
2 голосов
/ 13 марта 2011

Вы можете проверить это, реализовано в C # по Carl Johansen

Represents a body in elliptical orbit about a massive central body

Вот комментарий от кода

Истинная аномалия в этом контексте - это угол между телом и солнцем.Для эллиптических орбит это немного сложно.Процент завершенного периода по-прежнему является ключевым входом, но нам также необходимо применить уравнение Кеплера (основанное на эксцентриситете), чтобы гарантировать, что мы выметаем равные области в равное время.Это уравнение является трансцендентным (то есть не может быть решено алгебраически), поэтому мы должны либо использовать приближенное уравнение, либо решить числовым методом.Моя реализация использует итерацию Ньютона-Рафсона для получения превосходного приблизительного ответа (обычно за 2 или 3 итерации).

...