Здравствуйте, я написал этот код, чтобы попытаться смоделировать солнечную систему Луны и Земли. Я получаю круговую орбиту для Земли, но Луна сходит с ума.
Есть ли лучший способ попробовать это сделать, используя метод euler / leapfrog?
Я не предпринял усилий, чтобы внимательно просмотреть ваш код или проверить его поведение, но хорошо известно, что метод Эйлера получает энергию в таких симуляциях, поэтому вместо него обычно используется трапециевидный.
https://en.wikipedia.org/wiki/Trapezoidal_rule
Если я правильно понимаю, ваш метод является вторым порядком в отношениях между положением и скоростью (я предполагаю, что мы намерены избегать этого прироста энергии), но, похоже, это первый порядок в отношениях между ускорением и скоростью.
Возможно, вам удастся сохранить дизайн скачкообразной (а не трапециевидной), но, пытаясь это сделать, вам следует лучше сделать явное дополнительное состояние, чтобы исключить использование второй производной.
Изменить: Я перечитал страницу Википедии на чехарду и перечитал ваш код, и стало ясно, что вы не используете чехарду (как я говорил ранее, потому что вы применяете его только к положению \ скорости, а не к скорости \ ускорению). Обратите внимание, что на странице также показано, как упростить уравнения чехарды для ситуации (которая у вас есть), в которой ускорение зависит от положения, а не от скорости:
https://en.wikipedia.org/wiki/Leapfrog_integration
Возможно, вы можете попробовать использовать методы Рунге Кутты, если хотите продолжать использовать явную интеграцию: https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods
RK4 обычно достаточно.