2015-06-02 2 views
4

Это мой первый вопрос здесь, поэтому, пожалуйста, успокойся. Мне интересно, есть ли способ интегрировать систему ODE только до тех пор, пока не будет найден локальный максимум указанной переменной. Вот еще несколько деталей:Могу ли я интегрироваться с odeint scipy, пока не будет найден локальный макс?

Назовем нашу систему ODE dX/dt = F(X) where X(t) = [x1(t), x2(t), ... , xn(t)]. Предположим, что решение этой системы притягивается к устойчивому предельному циклу С всюду, но в одной неустойчивой неподвижной точке р. Выберите некоторые начальные условия X0 не р, а не в C. Мы хотим следовать траектории решения для:

dX/dt = F(X), X(0) = X0 (*) 

только до x1 (т) не достигнет своего первого локального максимума.

Прогресс: Использование scipy.integrate.odeint Я могу найти решение предельного цикла C и его периода T, но, начиная с произвольной точки, единственный способ, которым я смог решить эту проблему, - это решение (*) для «долгого времени» (возможно, 4 * T) и, считая это достаточно долгое время, определить первый локальный максимум x1 после факта. Мой более крупный проект требует, чтобы это выполнялось много раз, поэтому я стараюсь сократить время вычисления, где только могу. Похоже, должен быть более быстрый способ сделать это, не написав мой собственный решатель.

Возможно (и, вероятно), что я делаю это слишком сложным? Если вы думаете о другом способе сделать это, я буду благодарен за любые предложения.

+0

Набор солнечных часов (доступный, например, Ассимуло) имеет возможности поиска корней в пределах их решатели CVODE и IDA. – Moritz

ответ

0

Я не проверял это, но следующий код должен работать или по крайней мере помочь:

from scipy.integrate import ode 

y0, t0 = [1.0j, 2.0], 0 

def f(t, y, arg1): 
    return [1j*arg1*y[0] + y[1], -arg1*y[1]**2] 

r = ode(f).set_integrator('zvode', method='bdf') 
r.set_initial_value(y0, t0).set_f_params(2.0) 
t1 = 10 
dt = 1 

older = 0 
previous = 0 
current = 0 
while r.successful() and not (older < previous and prevous > current): 
    older = previous 
    previous = current 
    current = r.integrate(r.t+dt) 

print("Maximum occurs at {}".format(r.t - dt)) 

Я также хотел бы дополнительно изучить python ode

EDIT:

еще лучше было бы используйте solout, который находится здесь here

+1

Если вы отправляете сообщение в качестве ответа, вы можете потратить время, чтобы убедиться, что ответ проверен. Обычно непроверенный код является опасным кодом. –

 Смежные вопросы

  • Нет связанных вопросов^_^