2015-06-02 57 views
4

這是我在這裏的第一個問題,所以請對我輕鬆點。我想知道是否有一種方法來整合ODE系統,直到找到指定變量的本地最大值。這裏是一些更多的細節:我可以與scipy的odeint進行整合,直到找到本地最大值?

讓我們打電話給我們的ODE系統dX/dt = F(X) where X(t) = [x1(t), x2(t), ... , xn(t)]。假設這個系統的解決方案被吸引到一個穩定的極限循環C,但在一個不穩定的固定點p處。選擇一些初始條件X0非p,而不是C.我們要遵循解決方案的軌跡:

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

只是直到X1(t)達到它的第一個局部最大值。

進度: 使用scipy.integrate.odeint我能夠找到限制週期C和它的週期T的解決方案,但從任意一點開始,唯一能解決這個問題的方法是求解(*)一個'長時間'(也許是4 * T),並且假設這段時間足夠長,那麼在事實之後確定x1的第一個局部最大值。我的大型項目需要多次完成,所以我儘量減少計算時間。似乎有必要有一個更快的方法來做到這一點,而不寫我自己的頌歌解算器。

我可能(而且可能)讓這個過於複雜?如果你想用不同的方式來做到這一點,我將不勝感激任何建議。

+0

日suite套件(可通過例如Assimulo訪問)具有根查找功能他們的解決者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

編輯:

更好的將使用solout可以發現here

+1

如果您發佈答案,您可能需要花時間確保答案已經過測試。通常未經測試的代碼是危險代碼。 –