2014-12-19 48 views
0

我在做一些模擬,當我在scipy.integrate.odeint中觀察到意外的行爲時。Scipy odeint停止

我可以重現我的問題與此代碼:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.integrate import odeint 

tau = 0.01 

a, b = 0.7, 0.8 

def E_p(t): 
    E = -0.07 
    if t < b and t > a: 
     E = -0.05 
    return E 

def dynamics(V, t): 
    return (E_p(t) - V)/tau 

time = np.arange(0, 1, 0.001) 
ps = odeint(dynamics, -0.07, time) 

plt.plot(time, ps) 

當我設置a和b左側(在我的情況下,零)odeint行之有效附近的時間間隔,而不是間隔的權利它並不是什麼。

我希望看到這個

integration

但更多的權利。我真正想要做的是在RC電路中模擬一個方形脈衝。

我認爲odeint停止集成時感覺功能已經收斂,但我找不到任何文檔說這一點。

+0

我不認爲'odeint'是能夠應付像你這樣的連續函數 – xnx

+0

好了,我這樣做,圖像使用= 0.1和b = 0.2,因此它可以在來案例。很高興知道它何時有效,但我會認爲它不起作用並使用其他功能。將來我還需要使用一般的脈衝響應,所以我需要一個處理不連續函數的函數。 –

回答

2

雖然不連續性打破了大多數ODE解算器所基於的假設,但odeint通常在處理一個假設時做得非常好。這裏的問題很可能是由求解器使用的自適應步長引起的。在這種情況下,步長可能足夠大,以至於求解器跳過脈衝 - 它永遠不會「看到」它。

嘗試使用odeint的參數hmax。將其設置爲小於脈衝寬度的值。這將確保odeint至少擊中一次脈衝。然後自適應求解器應該很好地解決脈衝的邊界。例如,這工作:

ps = odeint(dynamics, -0.07, time, hmax=0.2*(b-a))