Оптимизация производительности RK4 в Python

Я разрабатываю классическую схему Рунге-Кутты (RK4) для большого количества связанных уравнений в Python 2.7. Поскольку будет более сотни связанных уравнений 1-го порядка, циклы for будут чертовски большими, и я ищу некоторые подсказки по оптимизации.

<сильный>1. При вычислении вектора возвращаемых переменных для коэффициентов РК лучше ли...

  • Предварительно выделите numpy array и заполните его или
  • Использовать list.append для каждой переменной и numpy.array(list) в конце?

<сильный>2. Связанные уравнения, очевидно, имеют коэффициенты. Может лучше...

  • Вставьте их в функцию, вызываемую в шагах RK4 (т. е. переопределяйте их каждый раз, когда вызывается оценка функции) или
  • Пометить их как глобальные переменные?

person Victor Pira    schedule 13.12.2016    source источник
comment
Лучшей оптимизацией было бы использование scipy.integrate.odeint вместо самостоятельной реализации метода... Я не думаю, что 2 будет иметь значение для времени работы. Для 1 лучший вариант лучше, но вам действительно следует попытаться сформировать правый вектор с помощью операций с массивом numpy вместо того, чтобы перебирать массив.   -  person    schedule 13.12.2016
comment
@zaq: я не хочу использовать odeint, потому что у меня нелинейная система, очень чувствительная к входным параметрам, поэтому я не хочу использовать черные ящики. Извините, но я не понимаю вашего третьего предложения (Для 1...). Должен ли он быть первым?   -  person Victor Pira    schedule 14.12.2016
comment
lsoda, который стоит за odeint, является хорошо протестированным и хорошо задокументированным черным ящиком. Установите относительные (и абсолютные) пределы погрешности, так как значения по умолчанию довольно высоки. Сделайте несколько прогонов с разными настройками ошибок, чтобы задокументировать стабильность результата.   -  person Lutz Lehmann    schedule 14.12.2016
comment
Сравните также с stackoverflow .com/questions/29617089/ и stackoverflow.com/questions/29803342/ для использования псевдоспектральных методов для отдельной обработки линейных членов и, таким образом, для лучшего численного интегрирования в нелинейной части.   -  person Lutz Lehmann    schedule 14.12.2016