Интересен способ, которым scmutils выполняет интеграцию. Функция производной состояния работает с локальным кортежем, как описано в SICM, но интегратор хочет работать с функцией, которая принимает массив чисел с плавающей запятой в качестве входных данных и создает массив равного размера в качестве выходных. Для этого scmutils берет данные начального состояния, заменяет значения в них символами и передает их вашей производной. Это производит вывод symboli c, который можно использовать для подготовки функции с правильной сигнатурой для интегратора. (Я могу описать этот процесс более подробно, если хотите).
Однако ваша проблема в декартовых координатах, и результирующее выражение symboli c выглядит волосатым. Вы можете увидеть этот процесс в действии, создав свой собственный символ c состояние и передав его производной функции, а также упростив вывод (передав результат через pe
(выражение печати)):
(define symbolic-system
(up 't
(up (up 'g_0
(up 'x_0 'y_0 'z_0) ; Sun position (x,y,z) in meters in barycentric coordinates
(up 'vx_0 'vy_0 'vz_0)) ; Sun velocity (vx,vy,vz) in meters per second
(up 'g_1
(up 'x_1 'y_1 'z_1)
(up 'vx_1 'vy_1 'vz_1))
; (up 'g_2
; (up 'x_2 'y_2 'z_2)
; (up 'vx_2 'vy_2 'vz_2))
; (up 'g_3
; (up 'x_3 'y_3 'z_3)
; (up 'vx_3 'vy_3 'vz_3))
)))
(pe ((dy/dt) symbolic-system))
Результат потрясающий, поэтому я не вставлял его сюда. Если вы теперь добавите еще один pl anet, раскомментировав строки с нижним индексом 2, вы обнаружите, что печать зависает, что означает, что упрощатель выражений застрял. Числовой интегратор еще даже не запустился.
Что делать? Возможно, вам удастся вернуть некоторую емкость, исключив координату z. Вы можете переместить параметры GM, которые являются постоянными, в список аргументов функции конструктора производных состояний, оставив только те вещи, которые будут изменяться в самом кортеже состояний. Вы можете немного сгладить кортеж состояний; его структура полностью зависит от вас.
Однако в конечном итоге интегрируемая функция будет намного сложнее, чем функция, которую вы написали бы сами, и многое из этого связано с условиями sqrt(x^2 + y^2 + ...)
, которые вы получаете из декартовых координат. . Scmutils был разработан для задач, в которых использование обобщенных координат создает компактные лагранжианы, из которых могут быть получены более простые производные функции состояния (автоматически, что является magi c scmutils). Я думаю, что эта конкретная проблема будет подъёмом в гору. , который экономит на координатах, фокусируясь на третьем теле, которое, как предполагается, намного меньше, чем два других, и имеет систему координат, вращающуюся так, что первые два тела l ie по оси x. Другой пример - это спин-орбитальная связь , в которой есть два тела, но отклонение формы спутника от окружности не является незначительным. Оба этих подхода дают формулировки, в которых координат намного меньше, чем 3 * (количество тел)