![](/img/trans.png)
[英]How to put initial condition of ODE at a specific time point using odeint in Python?
[英]How to use odeint in python using some constraints in between time sequence?
我正在嘗試使用 odeint 在 python 中求解一組耦合微分方程。 假設兩個與時間相關的方程涉及兩個變量,例如
dv(t)/dt = -(v(t) - Vr) + delta*exp(v(t) - vth) - w(t)/g
dw(t)/dt = a(v(t) - Vr) - w(t)
使用重置動態 if v(t)>vth , v = Vr, w = w+b 我盡力了但沒有得到想要的結果,因為我不知道如何使用 odeint 來重置某個時間變量參數時間序列之間。
我的代碼是:
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
pi = -60*10**-3 #mv
delta = 2.5*10**-3 #mV
vth = - 52*10**-3 #mV
gl = 25*10**-9 #nS
tau_m = 20*10**-3 #ms
a = 1*10**-9 #nS
tau_w = 600*10**-3 #ms
b = 0.6*10**-9
def Saponati(states, t):
v, w = states
v = (-(v - pi) + delta*np.exp((v - vth)/delta) - (w/gl))/tau_m
w = (a*(v - pi) - w)/tau_w
print("v", v, w)
if v>vth:
v = pi
w = w+b
print(v)
return states
#state0 = [-57, 0]
states0 = [-57, 0.001]
t = np.arange(0.0, 40.0, 0.01)
v = odeint(Saponati, states0, t)
plt.plot(t, states[:,0])
您正在繪制錯誤類型的變量。 列表 v 必須是單維列表。 因此,通過將 v 轉換為 y,您可以找到所需的結果。
我已經標記了我的 chages
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
pi = -60*10**-3 #mv
delta = 2.5*10**-3 #mV
vth = - 52*10**-3 #mV
gl = 25*10**-9 #nS
tau_m = 20*10**-3 #ms
a = 1*10**-9 #nS
tau_w = 600*10**-3 #ms
b = 0.6*10**-9
def Saponati(states, t):
v, w = states
v = (-(v - pi) + delta*np.exp((v - vth)/delta) - (w/gl))/tau_m
w = (a*(v - pi) - w)/tau_w
#print("v", v, w)
if v>vth:
v = pi
w = w+b
print(v)
return states
#state0 = [-57, 0]
states0 = [-57, 0.001]
t = np.arange(0.0, 40.0, 0.1)
v = odeint(Saponati, states0, t)
# My change to simplify v list
y = []
for x in v:
y.append(x[0])
# My change end.
#print(y)
plt.plot(t,y)
plt.show()
見附件截圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.