Сценарий Python занимает более 20 часов
У меня есть система из 16 связанных дифференциальных уравнений, и я использую пакет Scipy.integrate.odeint.
Код должен работать от 0 до 5 гигов, а затем наносить на график данные, природа дифференциальных уравнений заключается в том, что они чрезвычайно колебательные. Кроме того, временной интервал, который я использовал, равен 1e+8, или я получаю эту постоянную ошибку:
"Слишком много работы для этого вызова (возможно, неправильный тип Dfun). Запустите с full_output = 1, чтобы получить количественную информацию. '
Мне просто интересно, есть ли другой способ, который я могу использовать, чтобы ускорить решение моего интегратора? Есть ли лучшие методы интеграции для больших систем связанных ODE? Код работает более 20 часов, но безрезультатно.
1 ответ
Для большинства больших систем дифференциальных уравнений основным узким местом обычно является вычисление производной (правая часть). Вы, вероятно, делаете это исключительно на Python, что делает его намного медленнее, чем могло бы быть. Я написал модуль Python под названием JiTCODE, который ускоряет интеграцию путем жесткого кодирования производной и особенно предназначен для больших систем ODE.
Также обратите внимание, что
odeint
использует LSODA, который не самый эффективный метод для нежестких систем.Получаемая ошибка обычно возникает, если количество шагов интеграции превышает определенный порог. Для долгой интеграции этого можно ожидать. Вы можете контролировать это, регулируя параметр
mxstep
,odeint
также имеет параметр максимального размера шага, который автоматически выбирается способом, которого я не знаю. Хотя это кажется разумным масштабом с вашей шкалой времени в быстром тесте, я не могу исключить, что в вашем случае он не справляется с работой с гигантами в единицах СИ, что может привести к абсурдному множеству шагов.Учитывая, что вы работаете с гигантами (что намекает на астрономию, что, в свою очередь, повышает вероятность сбережения энергии), вам также следует проверить, подходит ли симплектический интегратор для вашей задачи.