簡體   English   中英

如何在時間序列之間使用一些約束在python中使用odeint?

[英]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()

見附件截圖。

注意:為了簡化起見,我更改了 t 的間隔。 您可以根據需要進行更改。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM