def kuramotos_f(): for i in range(n): coupling_sum = sum( sin(y(j)-y(i)) for j in range(n) if A[j,i] ) yield omega[i] + c/(n-1)*coupling_sum
def f(): for i in range(N): coupling_sum = sum( y(3*j)-y(3*i) for j in range(N) if A[i,j] ) coupling_term = k * symengine.sin(t) * coupling_sum yield -ω[i] * y(3*i+1) - y(3*i+2) + coupling_term yield ω[i] * y(3*i) + a*y(3*i+1) coupling_term_2 = k * (sum_z-N*y(3*i+2)) yield b + y(3*i+2) * (y(3*i) - c) + coupling_term_2
def f(): for i in range(N): coupling_sum = sum( y(3 * j) - y(3 * i) for j in range(N) if A[i, j]) coupling_term = k * symengine.sin(t) * coupling_sum yield -ω[i] * y(3 * i + 1) - y(3 * i + 2) + coupling_term yield ω[i] * y(3 * i) + a * y(3 * i + 1) coupling_term_2 = k * (sum_z - N * y(3 * i + 2)) yield b + y(3 * i + 2) * (y(3 * i) - c) + coupling_term_2
def getData(train_data_ratio, trans_ratio): ''' Integrates the rossler system, records the data into train_data, test_data based on train_data_ratio (train_data_length/total length of data) trans_ratio = (transience length/ total length of data) Returns: (train_data, test_data) ''' # Lorenz equation for motion f = [ 10 * (y(1) - y(0)), y(0) * (28 - y(2)) - y(1), y(0) * y(1) - (8.0 / 3) * y(2) ] inital_state = 2.0 * (1 - 2 * np.random.random(3)) ODE = jitcode(f) ODE.set_integrator("dopri5") ODE.set_initial_value(inital_state, 0.0) data = [] times = np.arange(1000, 10000, 0.1) for time in times: data.append(ODE.integrate(time)) data_arr = np.array(data) train_len = int(train_data_ratio * len(data_arr)) trans_len = int(trans_ratio * len(data_arr)) train_data = data_arr[0:train_len, :] test_data = data_arr[train_len + 1:, :] return train_data, test_data, trans_len
def tearDown(self): if isinstance(self.ODE, jitcode) and self.ODE.f_sym(): self.ODE.check() self.assertIsNotNone(self.ODE.f) assert_allclose(self.ODE.f(0.0, y0), f_of_y0, rtol=1e-5) if not self.ODE.jac is None: assert_allclose(self.ODE.jac(0.0, y0), jac_of_y0, rtol=1e-5) assert_allclose(self.ODE.integrate(1.0), y1, rtol=1e-4) for i in reversed(range(n)): assert_allclose(self.ODE.y_dict[y(i)], y1[i], rtol=1e-4)
def __init__(self, n, para): # Put all the internal variables and instance specific constants here # Examples of varibales include Vm, gating variables, calcium ...etc # Constants can be variouse conductances, which can vary across # instances. i = n2i(n) #integration variable index self.mem_pot = y(i) # the jitcode y # self.m = y(i+1) # ... and stuff like that self.int_freq = para[0] self.dim = NUM_DIM_NEURON # can vary across different types of neuron
def set_integration_index(self, i): self.ii = i self.V = y(i) self.n = y(i + 1) self.s = y(i + 2) self.v = y(i + 3) self.q = y(i + 4) self.Ca = y(i + 5)
def set_integration_index(self, i): self.ii = i self.V = y(i) self.m = y(i + 1) self.h = y(i + 2) self.n = y(i + 3) self.z = y(i + 4) self.u = y(i + 5)
def set_integration_index(self, i): """ Args: i: integration variable index """ self.ii = i # integration index self.v_mem = y(i) # membrane potential self.m_gate = y(i + 1) self.n_gate = y(i + 2) self.h_gate = y(i + 3) self.a_gate = y(i + 4) self.b_gate = y(i + 5) self.calcium = y(i + 6)
def dydt(self, pre_synapses, pre_neurons): # a list of pre-synaptic neurons # define how neurons are coupled here VV = self.V mm = self.m hh = self.h nn = self.n i_inj = self.i_inj i_syn = sum( self.I_syn(VV, y(synapse.get_ind()), synapse.get_params()[0], synapse.get_params()[1], synapse.weight) for (i, synapse) in enumerate(pre_synapses)) i_base = (self.I_Na(VV, mm, hh) + self.I_K(VV, nn) + self.I_L(VV) + i_syn) yield -1 / self.C_m * (i_inj + i_base) yield self.dm_dt(VV, mm) yield self.dh_dt(VV, hh) yield self.dn_dt(VV, nn)
from jitcode import jitcode, y import pdb substances = Ca, Na, Ko = [y(i) for i in range(3)] diffusion_rate = {Ca: 0.3, Na: 0.4, Ko: 0.5} def diffusion_loss(substance): return -diffusion_rate[substance] * substance pdb.set_trace() f = {substance: diffusion_loss(substance) for substance in substances} ODE = jitcode(f)
def Paci2018(tDrugApplication, INaFRedMed, ICaLRedMed, IKrRedMed, IKsRedMed): dY = [None] * 23 VmaxUp = 0.5113 # millimolar_per_second (in calcium_dynamics) g_irel_max = 62.5434 # millimolar_per_second (in calcium_dynamics) RyRa1 = 0.05354 # uM RyRa2 = 0.0488 # uM RyRahalf = 0.02427 # uM RyRohalf = 0.01042 # uM RyRchalf = 0.00144 # uM kNaCa = 3917.0463 # A_per_F (in i_NaCa) PNaK = 2.6351 # A_per_F (in i_NaK) Kup = 3.1928e-4 # millimolar (in calcium_dynamics) V_leak = 4.7279e-4 # per_second (in calcium_dynamics) alpha = 2.5371 # dimensionless (in i_NaCa) ## Constants F = 96485.3415 # coulomb_per_mole (in model_parameters) R = 8.314472 # joule_per_mole_kelvin (in model_parameters) T = 310.0 # kelvin (in model_parameters) ## Cell geometry V_SR = 583.73 # micrometre_cube (in model_parameters) Vc = 8800.0 # micrometre_cube (in model_parameters) Cm = 9.87109e-11 # farad (in model_parameters) ## Extracellular concentrations Nao = 151.0 # millimolar (in model_parameters) Ko = 5.4 # millimolar (in model_parameters) Cao = 1.8 #3#5#1.8 # millimolar (in model_parameters) ## Intracellular concentrations # Naio = 10 mM y(17) Ki = 150.0 # millimolar (in model_parameters) # Cai = 0.0002 mM y(2) # caSR = 0.3 mM y(1) # time (second) ## Nernst potential E_Na = R * T / F * symengine.log(Nao / y(17)) E_Ca = 0.5 * R * T / F * symengine.log(Cao / y(2)) E_K = R * T / F * log(Ko / Ki) PkNa = 0.03 # dimensionless (in electric_potentials) E_Ks = R * T / F * symengine.log((Ko + PkNa * Nao) / (Ki + PkNa * y(17))) ## INa g_Na = 3671.2302 # S_per_F (in i_Na) drug_no_drug_na = [ g_Na * y(13)**3.0 * y(11) * y(12) * (y(0) - E_Na), INaFRedMed * g_Na * y(13)**3.0 * y(11) * y(12) * (y(0) - E_Na) ] i_Na = drug_no_drug_na[0] h_inf = 1.0 / symengine.sqrt(1.0 + symengine.exp((y(0) * 1000.0 + 72.1) / 5.7)) alpha_h = 0.057 * symengine.exp(-(y(0) * 1000.0 + 80.0) / 6.8) beta_h = 2.7 * symengine.exp( 0.079 * y(0) * 1000.0) + 3.1 * 10.0**5.0 * symengine.exp( 0.3485 * y(0) * 1000.0) tau_h = sigmoid_generator(y(0), -0.0385, -1) * (1.5 / ( (alpha_h + beta_h) * 1000.0)) + sigmoid_generator( y(0), -0.0385, 1) * (1.5 * 1.6947 / 1000.0) dY[11] = (h_inf - y(11)) / tau_h j_inf = 1.0 / symengine.sqrt(1.0 + symengine.exp((y(0) * 1000.0 + 72.1) / 5.7)) alpha_j = sigmoid_generator(y(0), -0.04, -1) * ( -25428.0 * symengine.exp(0.2444 * y(0) * 1000.0) - 6.948 * 10.0**-6.0 * symengine.exp(-0.04391 * y(0) * 1000.0)) * (y(0) * 1000.0 + 37.78) / ( 1.0 + symengine.exp(0.311 * (y(0) * 1000.0 + 79.23))) + sigmoid_generator( y(0), -0.04, 1) * 0 beta_j = sigmoid_generator(y(0), -0.04, -1) * ( (0.02424 * symengine.exp(-0.01052 * y(0) * 1000) / (1 + symengine.exp(-0.1378 * (y(0) * 1000 + 40.14))))) + sigmoid_generator( y(0), -0.04, 1) * ( (0.6 * symengine.exp( (0.057) * y(0) * 1000) / (1 + symengine.exp(-0.1 * (y(0) * 1000 + 32))))) tau_j = 7.0 / ((alpha_j + beta_j) * 1000.0) dY[12] = (j_inf - y(12)) / tau_j m_inf = 1.0 / (1.0 + symengine.exp( (-y(0) * 1000.0 - 34.1) / 5.9))**(1.0 / 3.0) alpha_m = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 - 60.0) / 5.0)) beta_m = 0.1 / (1.0 + symengine.exp( (y(0) * 1000.0 + 35.0) / 5.0)) + 0.1 / (1.0 + symengine.exp( (y(0) * 1000.0 - 50.0) / 200.0)) tau_m = 1.0 * alpha_m * beta_m / 1000.0 dY[13] = (m_inf - y(13)) / tau_m ## INaL myCoefTauM = 1 tauINaL = 200 #ms GNaLmax = 2.3 * 7.5 #(S/F) Vh_hLate = 87.61 i_NaL = GNaLmax * y(18)**(3) * y(19) * (y(0) - E_Na) m_inf_L = 1 / (1 + symengine.exp(-(y(0) * 1000 + 42.85) / (5.264))) alpha_m_L = 1 / (1 + symengine.exp((-60 - y(0) * 1000) / 5)) beta_m_L = 0.1 / (1 + symengine.exp( (y(0) * 1000 + 35) / 5)) + 0.1 / (1 + symengine.exp( (y(0) * 1000 - 50) / 200)) tau_m_L = 1 / 1000 * myCoefTauM * alpha_m_L * beta_m_L dY[18] = (m_inf_L - y(18)) / tau_m_L h_inf_L = 1 / (1 + symengine.exp((y(0) * 1000 + Vh_hLate) / (7.488))) tau_h_L = 1 / 1000 * tauINaL dY[19] = (h_inf_L - y(19)) / tau_h_L ## If E_f = -0.017 # volt (in i_f) g_f = 30.10312 # S_per_F (in i_f) i_f = g_f * y(14) * (y(0) - E_f) i_fNa = 0.42 * g_f * y(14) * (y(0) - E_Na) Xf_infinity = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 77.85) / 5.0)) tau_Xf = 1900.0 / (1.0 + symengine.exp( (y(0) * 1000.0 + 15.0) / 10.0)) / 1000.0 dY[14] = (Xf_infinity - y(14)) / tau_Xf ## ICaL g_CaL = 8.635702e-5 # metre_cube_per_F_per_s (in i_CaL) drug_no_drug_CaL = [ g_CaL * 4.0 * y(0) * F**2.0 / (R * T) * (y(2) * symengine.exp(2.0 * y(0) * F / (R * T)) - 0.341 * Cao) / (symengine.exp(2.0 * y(0) * F / (R * T)) - 1.0) * y(4) * y(5) * y(6) * y(7), ICaLRedMed * g_CaL * 4.0 * y(0) * F**2.0 / (R * T) * (y(2) * symengine.exp(2.0 * y(0) * F / (R * T)) - 0.341 * Cao) / (symengine.exp(2.0 * y(0) * F / (R * T)) - 1.0) * y(4) * y(5) * y(6) * y(7) ] i_CaL = drug_no_drug_CaL[0] d_infinity = 1.0 / (1.0 + symengine.exp(-(y(0) * 1000.0 + 9.1) / 7.0)) alpha_d = 0.25 + 1.4 / (1.0 + symengine.exp( (-y(0) * 1000.0 - 35.0) / 13.0)) beta_d = 1.4 / (1.0 + symengine.exp((y(0) * 1000.0 + 5.0) / 5.0)) gamma_d = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 + 50.0) / 20.0)) tau_d = (alpha_d * beta_d + gamma_d) * 1.0 / 1000.0 dY[4] = (d_infinity - y(4)) / tau_d f1_inf = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 26.0) / 3.0)) constf1 = sigmoid_generator(f1_inf - y(5), 0, 1) * 1.0 + 1433.0 * ( y(2) - 50.0 * 1.0e-6) + sigmoid_generator(f1_inf - y(5), 0, -1) * 1.0 tau_f1 = (20.0 + 1102.5 * symengine.exp(-( (y(0) * 1000.0 + 27.0)**2.0 / 15.0)**2.0) + 200.0 / (1.0 + symengine.exp((13.0 - y(0) * 1000.0) / 10.0)) + 180.0 / (1.0 + symengine.exp( (30.0 + y(0) * 1000.0) / 10.0))) * constf1 / 1000.0 dY[5] = (f1_inf - y(5)) / tau_f1 f2_inf = 0.33 + 0.67 / (1.0 + symengine.exp((y(0) * 1000.0 + 32.0) / 4.0)) constf2 = 1.0 tau_f2 = (600.0 * symengine.exp(-(y(0) * 1000.0 + 25.0)**2.0 / 170.0) + 31.0 / (1.0 + symengine.exp( (25.0 - y(0) * 1000.0) / 10.0)) + 16.0 / (1.0 + symengine.exp( (30.0 + y(0) * 1000.0) / 10.0))) * constf2 / 1000.0 dY[6] = (f2_inf - y(6)) / tau_f2 alpha_fCa = 1.0 / (1.0 + (y(2) / 0.0006)**8.0) beta_fCa = 0.1 / (1.0 + symengine.exp((y(2) - 0.0009) / 0.0001)) gamma_fCa = 0.3 / (1.0 + symengine.exp((y(2) - 0.00075) / 0.0008)) fCa_inf = (alpha_fCa + beta_fCa + gamma_fCa) / 1.3156 constfCa = sigmoid_generator(y(0), -0.06, 1) * sigmoid_generator( fCa_inf, y(7), 1) * 0 + (sigmoid_generator(y(0), -0.06, -1) + sigmoid_generator(fCa_inf, y(7), -1)) * 1.0 tau_fCa = 0.002 # second (in i_CaL_fCa_gate) dY[7] = constfCa * (fCa_inf - y(7)) / tau_fCa ## Ito g_to = 29.9038 # S_per_F (in i_to) i_to = g_to * (y(0) - E_K) * y(15) * y(16) q_inf = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 53.0) / 13.0)) tau_q = (6.06 + 39.102 / (0.57 * symengine.exp(-0.08 * (y(0) * 1000.0 + 44.0)) + 0.065 * symengine.exp(0.1 * (y(0) * 1000.0 + 45.93)))) / 1000.0 dY[15] = (q_inf - y(15)) / tau_q r_inf = 1.0 / (1.0 + symengine.exp(-(y(0) * 1000.0 - 22.3) / 18.75)) tau_r = (2.75352 + 14.40516 / (1.037 * symengine.exp(0.09 * (y(0) * 1000.0 + 30.61)) + 0.369 * symengine.exp(-0.12 * (y(0) * 1000.0 + 23.84)))) / 1000.0 dY[16] = (r_inf - y(16)) / tau_r ## IKs g_Ks = 2.041 # S_per_F (in i_Ks) drug_no_drug_Ks = [ g_Ks * (y(0) - E_Ks) * y(10)**2.0 * (1.0 + 0.6 / (1.0 + (3.8 * 0.00001 / y(2))**1.4)), IKsRedMed * g_Ks * (y(0) - E_Ks) * y(10)**2.0 * (1.0 + 0.6 / (1.0 + (3.8 * 0.00001 / y(2))**1.4)) ] i_Ks = drug_no_drug_Ks[0] Xs_infinity = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 - 20.0) / 16.0)) alpha_Xs = 1100.0 / symengine.sqrt(1.0 + symengine.exp( (-10.0 - y(0) * 1000.0) / 6.0)) beta_Xs = 1.0 / (1.0 + symengine.exp((-60.0 + y(0) * 1000.0) / 20.0)) tau_Xs = 1.0 * alpha_Xs * beta_Xs / 1000.0 dY[10] = (Xs_infinity - y(10)) / tau_Xs ## IKr L0 = 0.025 # dimensionless (in i_Kr_Xr1_gate) Q = 2.3 # dimensionless (in i_Kr_Xr1_gate) g_Kr = 29.8667 # S_per_F (in i_Kr) drug_no_drug_Kr = [ g_Kr * (y(0) - E_K) * y(8) * y(9) * sqrt(Ko / 5.4), IKrRedMed * g_Kr * (y(0) - E_K) * y(8) * y(9) * sqrt(Ko / 5.4) ] i_Kr = drug_no_drug_Kr[0] V_half = 1000.0 * (-R * T / (F * Q) * log( (1.0 + Cao / 2.6)**4.0 / (L0 * (1.0 + Cao / 0.58)**4.0)) - 0.019) Xr1_inf = 1.0 / (1.0 + symengine.exp((V_half - y(0) * 1000.0) / 4.9)) alpha_Xr1 = 450.0 / (1.0 + symengine.exp((-45.0 - y(0) * 1000.0) / 10.0)) beta_Xr1 = 6.0 / (1.0 + symengine.exp((30.0 + y(0) * 1000.0) / 11.5)) tau_Xr1 = 1.0 * alpha_Xr1 * beta_Xr1 / 1000.0 dY[8] = (Xr1_inf - y(8)) / tau_Xr1 Xr2_infinity = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 88.0) / 50.0)) alpha_Xr2 = 3.0 / (1.0 + symengine.exp((-60.0 - y(0) * 1000.0) / 20.0)) beta_Xr2 = 1.12 / (1.0 + symengine.exp((-60.0 + y(0) * 1000.0) / 20.0)) tau_Xr2 = 1.0 * alpha_Xr2 * beta_Xr2 / 1000.0 dY[9] = (Xr2_infinity - y(9)) / tau_Xr2 ## IK1 alpha_K1 = 3.91 / (1.0 + symengine.exp(0.5942 * (y(0) * 1000.0 - E_K * 1000.0 - 200.0))) beta_K1 = (-1.509 * symengine.exp(0.0002 * (y(0) * 1000.0 - E_K * 1000.0 + 100.0)) + symengine.exp(0.5886 * (y(0) * 1000.0 - E_K * 1000.0 - 10.0)) ) / (1.0 + symengine.exp(0.4547 * (y(0) * 1000.0 - E_K * 1000.0))) XK1_inf = alpha_K1 / (alpha_K1 + beta_K1) g_K1 = 28.1492 # S_per_F (in i_K1) i_K1 = g_K1 * XK1_inf * (y(0) - E_K) * sqrt(Ko / 5.4) ## INaCa KmCa = 1.38 # millimolar (in i_NaCa) KmNai = 87.5 # millimolar (in i_NaCa) Ksat = 0.1 # dimensionless (in i_NaCa) gamma = 0.35 # dimensionless (in i_NaCa) kNaCa1 = kNaCa # A_per_F (in i_NaCa) i_NaCa = kNaCa1 * (symengine.exp(gamma * y(0) * F / (R * T)) * y(17)**3.0 * Cao - symengine.exp( (gamma - 1.0) * y(0) * F / (R * T)) * Nao**3.0 * y(2) * alpha) / ( (KmNai**3.0 + Nao**3.0) * (KmCa + Cao) * (1.0 + Ksat * symengine.exp( (gamma - 1.0) * y(0) * F / (R * T)))) ## INaK Km_K = 1.0 # millimolar (in i_NaK) Km_Na = 40.0 # millimolar (in i_NaK) PNaK1 = PNaK # A_per_F (in i_NaK) i_NaK = PNaK1 * Ko / (Ko + Km_K) * y(17) / (y(17) + Km_Na) / ( 1.0 + 0.1245 * symengine.exp(-0.1 * y(0) * F / (R * T)) + 0.0353 * symengine.exp(-y(0) * F / (R * T))) ## IpCa KPCa = 0.0005 # millimolar (in i_PCa) g_PCa = 0.4125 # A_per_F (in i_PCa) i_PCa = g_PCa * y(2) / (y(2) + KPCa) ## Background currents g_b_Na = 0.95 # S_per_F (in i_b_Na) i_b_Na = g_b_Na * (y(0) - E_Na) g_b_Ca = 0.727272 # S_per_F (in i_b_Ca) i_b_Ca = g_b_Ca * (y(0) - E_Ca) ## Sarcoplasmic reticulum i_up = VmaxUp / (1.0 + Kup**2.0 / y(2)**2.0) i_leak = (y(1) - y(2)) * V_leak dY[3] = 0 # RyR RyRSRCass = (1 - 1 / (1 + symengine.exp((y(1) - 0.3) / 0.1))) i_rel = g_irel_max * RyRSRCass * y(21) * y(22) * (y(1) - y(2)) RyRainfss = RyRa1 - RyRa2 / (1 + symengine.exp( (1000 * y(2) - (RyRahalf)) / 0.0082)) RyRtauadapt = 1 #s dY[20] = (RyRainfss - y(20)) / RyRtauadapt RyRoinfss = (1 - 1 / (1 + symengine.exp( (1000 * y(2) - (y(20) + RyRohalf)) / 0.003))) RyRtauact = sigmoid_generator( RyRoinfss, y(21), 1) * 18.75e-3 + 0.1 * 18.75e-3 * sigmoid_generator( RyRoinfss, y(21), -1) dY[21] = (RyRoinfss - y(21)) / RyRtauact RyRcinfss = (1 / (1 + symengine.exp( (1000 * y(2) - (y(20) + RyRchalf)) / 0.001))) RyRtauinact = sigmoid_generator(RyRcinfss, y(22), 1) * 2 * 87.5e-3 + sigmoid_generator( RyRcinfss, y(22), -1) * 87.5e-3 dY[22] = (RyRcinfss - y(22)) / RyRtauinact ## Ca2+ buffering Buf_C = 0.25 # millimolar (in calcium_dynamics) Buf_SR = 10.0 # millimolar (in calcium_dynamics) Kbuf_C = 0.001 # millimolar (in calcium_dynamics) Kbuf_SR = 0.3 # millimolar (in calcium_dynamics) Cai_bufc = 1.0 / (1.0 + Buf_C * Kbuf_C / (y(2) + Kbuf_C)**2.0) Ca_SR_bufSR = 1.0 / (1.0 + Buf_SR * Kbuf_SR / (y(1) + Kbuf_SR)**2.0) ## Ionic concentrations #Nai dY[17] = -Cm * (i_Na + i_NaL + i_b_Na + 3.0 * i_NaK + 3.0 * i_NaCa + i_fNa) / (F * Vc * 1.0e-18) #caSR dY[2] = Cai_bufc * (i_leak - i_up + i_rel - (i_CaL + i_b_Ca + i_PCa - 2.0 * i_NaCa) * Cm / (2.0 * Vc * F * 1.0e-18)) #Cai dY[1] = Ca_SR_bufSR * Vc / V_SR * (i_up - (i_rel + i_leak)) ## Stimulation i_stim_Amplitude = 7.5e-10 # ampere (in stim_mode) i_stim_End = 1000.0 # second (in stim_mode) i_stim_PulseDuration = 0.005 # second (in stim_mode) i_stim_Start = 0.0 # second (in stim_mode) i_stim_frequency = 60.0 # per_second (in stim_mode) stim_flag = 0.0 # dimensionless (in stim_mode) i_stim_Period = 60.0 / i_stim_frequency i_stim = 0 #(sigmoid_generator(time, i_stim_Start, 1) * sigmoid_generator(time, i_stim_End, -1) * (sigmoid_generator(time-i_stim_Start-symengine.floor((time-i_stim_Start)/i_stim_Period)*i_stim_Period, i_stim_PulseDuration, -1) ))*stim_flag*i_stim_Amplitude/Cm+0.0 ## Membrane potential dY[0] = -(i_K1 + i_to + i_Kr + i_Ks + i_CaL + i_NaK + i_Na + i_NaL + i_NaCa + i_PCa + i_f + i_b_Na + i_b_Ca - i_stim) ## Output variables IK1 = i_K1 Ito = i_to IKr = i_Kr IKs = i_Ks ICaL = i_CaL INaK = i_NaK INa = i_Na INaCa = i_NaCa IpCa = i_PCa If = i_f IbNa = i_b_Na IbCa = i_b_Ca Irel = i_rel Iup = i_up Ileak = i_leak Istim = i_stim INaL = i_NaL dati = [ INa, If, ICaL, Ito, IKs, IKr, IK1, INaCa, INaK, IpCa, IbNa, IbCa, Irel, Iup, Ileak, Istim, E_K, E_Na, INaL ] return dY # 1 - evaluate function at Y... # 2 - loop over Y, perturb each element by a small percent of its total # 3 - during each loop, find dY/dt, given the perturbation # 4 - find the change in Y as a function of the change in the perturbation # Conditionals # tau_h = 1.5*1.6947/1000.0 # alpha_j = 0.0 # beta_j = ((0.6*exp((0.057)*Y[0]*1000)/(1+exp(-0.1*(Y[0]*1000+32))))) # constf1 = 1.0 # constfCa = 1.0 # RyRtauact = 0.1*18.75e-3 #s # RyRtauinact = 87.5e-3 #s # i_stim = 0.0 '''
def set_integration_index(self, i): self.ii = i self.r = y(i) self.s = y(i + 1) self.G = y(i + 2)
def set_integration_index(self, i): self.ii = i # integration index #self.syn_weight = y(i) self.reduced_weight = y(i) self.rho_gate = y(i + 1) self.ca = y(i + 2) ###
def test_check_index_negative(self): ODE = jitcode([y(-1)]) with self.assertRaises(ValueError): ODE.check()
current_time = time state = I.y yield state result = np.vstack(solutions()) # Using compiled functions to make things faster def get_compiled_function(f): dummy = jitcode(f,verbose=False) dummy.compile_C() return dummy.f # The actual scenarios test_scenario( name = "two coupled FitzHugh–Nagumo oscillators", fun = get_compiled_function([ y(0)*(-0.025794-y(0))*(y(0)-1.0)-y(1)+0.128*(y(2)-y(0)), 0.0065*y(0)-0.02*y(1), y(2)*(-0.025794-y(2))*(y(2)-1.0)-y(3)+0.128*(y(0)-y(2)), 0.0135*y(2)-0.02*y(3) ]), initial = np.array([1.,2.,3.,4.]), times = 2000+np.arange(0,100000,10), rtol = 1e-5, atol = 1e-8, ) n, c, q = 100, 3.0, 0.2 A = choice( [1,0], size=(n,n), p=[q,1-q] ) omega = uniform(-0.5,0.5,n) def kuramotos_f():
result = np.vstack(list(solutions())) # Using compiled functions to make things faster def get_compiled_function(f): dummy = jitcode(f, verbose=False) dummy.compile_C() return dummy.f # The actual scenarios test_scenario( name="two coupled FitzHugh–Nagumo oscillators", fun=get_compiled_function([ y(0) * (-0.025794 - y(0)) * (y(0) - 1.0) - y(1) + 0.128 * (y(2) - y(0)), 0.0065 * y(0) - 0.02 * y(1), y(2) * (-0.025794 - y(2)) * (y(2) - 1.0) - y(3) + 0.128 * (y(0) - y(2)), 0.0135 * y(2) - 0.02 * y(3) ]), initial=np.array([1., 2., 3., 4.]), times=2000 + np.arange(0, 100000, 10), rtol=1e-5, atol=1e-8, ) n, c, q = 100, 3.0, 0.2 A = choice([1, 0], size=(n, n), p=[q, 1 - q]) omega = uniform(-0.5, 0.5, n)
0.0195744683782066, -0.0057801623466600, ]) lyaps = [0.00710, 0, -0.0513, -0.187] # vanilla a = -0.025794 b1 = 0.0065 b2 = 0.0135 c = 0.02 k = 0.128 f = [ y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)), b1 * y(0) - c * y(1), y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(0) - y(2)), b2 * y(2) - c * y(3) ] vanilla = {"f_sym": f} # as dictionary f_dict = {y(i): entry for i, entry in reversed(list(enumerate(f)))} with_dictionary = {"f_sym": f_dict} # with generator def f_generator():
Note that the initial state (line 17) is reduced in dimensionality and there is only one component for each synchronisation group. """ if __name__ == "__main__": # example-start from jitcode import jitcode_transversal_lyap, y from scipy.stats import sem import numpy as np a = -0.025794 b = 0.01 c = 0.02 k = 0.128 f = [ y(0) * ( a-y(0) ) * ( y(0)-1.0 ) - y(1) + k * (y(2) - y(0)), b*y(0) - c*y(1), y(2) * ( a-y(2) ) * ( y(2)-1.0 ) - y(3) + k * (y(0) - y(2)), b*y(2) - c*y(3) ] initial_state = np.array([1.,2.]) groups = [ [0,2], [1,3] ] ODE = jitcode_transversal_lyap(f, groups=groups) ODE.set_integrator("lsoda") ODE.set_initial_value(initial_state,0.0) times = range(10,100000,10) lyaps = [] for time in times:
:start-after: example-st\u0061rt :dedent: 1 :linenos: """ if __name__ == "__main__": # example-start from jitcode import y, jitcode import numpy as np γ = 0.6 φ = 1.0 ω = 0.5 ν = 0.5 R,B = [ y(i) for i in range(2) ] lotka_volterra_diff = { B: γ*B - φ*R*B, R: -ω*R + ν*R*B, } ODE = jitcode(lotka_volterra_diff) ODE.set_integrator("dopri5") initial_state = np.array(np.random.random(2)) ODE.set_initial_value(initial_state,0.0) times = np.arange(0.0,100,0.1) data = [] for time in times: state = ODE.integrate(time)
0.0195744683782066, -0.0057801623466600, ]) lyaps = [0.00710, 0, -0.0513, -0.187] # vanilla a = -0.025794 b1 = 0.0065 b2 = 0.0135 c = 0.02 k = 0.128 f = [ y(0) * ( a-y(0) ) * ( y(0)-1.0 ) - y(1) + k * (y(2) - y(0)), b1*y(0) - c*y(1), y(2) * ( a-y(2) ) * ( y(2)-1.0 ) - y(3) + k * (y(0) - y(2)), b2*y(2) - c*y(3) ] vanilla = {"f_sym": f} # as dictionary f_dict = { y(i):entry for i,entry in reversed(list(enumerate(f))) } with_dictionary = {"f_sym": f_dict} # with generator def f_generator(): for entry in f:
from itertools import combinations from jitcode import jitcode_restricted_lyap, y, jitcode_transversal_lyap import numpy as np from scipy.stats import sem from symengine import Symbol a = -0.025794 b = 0.01 c = 0.02 k = Symbol("k") scenarios = [ { "f": [ y(0) * (a - y(0)) * (y(0) - 1.0) - y(3) + k * (y(1) - y(0)), y(1) * (a - y(1)) * (y(1) - 1.0) - y(4) + k * (y(2) - y(1)), y(2) * (a - y(2)) * (y(2) - 1.0) - y(5) + k * (y(0) - y(2)), b * y(0) - c * y(3), b * y(1) - c * y(4), b * y(2) - c * y(5), ], "vectors": [[1., 1., 1., 0., 0., 0.], [0., 0., 0., 1., 1., 1.]], "groups": ([0, 1, 2], [3, 4, 5]) }, { "f": [ y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)), b * y(0) - c * y(1), y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(4) - y(2)), b * y(2) - c * y(3),
def set_integration_index(self, i): self.ii = i self.r = y(i)
def set_integration_index(self, i): self.ii = i # integration index self.syn_weight = y(i) self.rho_gate = y(i + 1)
from itertools import combinations from jitcode import jitcode_restricted_lyap, y, jitcode_transversal_lyap import numpy as np from scipy.stats import sem from symengine import Symbol a = -0.025794 b = 0.01 c = 0.02 k = Symbol("k") scenarios = [ { "f": [ y(0)*(a-y(0))*(y(0)-1.0) - y(3) + k*(y(1)-y(0)), y(1)*(a-y(1))*(y(1)-1.0) - y(4) + k*(y(2)-y(1)), y(2)*(a-y(2))*(y(2)-1.0) - y(5) + k*(y(0)-y(2)), b*y(0) - c*y(3), b*y(1) - c*y(4), b*y(2) - c*y(5), ], "vectors": [ [1.,1.,1.,0.,0.,0.], [0.,0.,0.,1.,1.,1.] ], "groups": ( [0,1,2], [3,4,5] ) }, {
def kuramotos_f(): for i in range(n): coupling_sum = sum( sin(y(j) - y(i)) for j in range(n) if networkMatrix[j, i]) yield omegas[i] + couplingConstant * coupling_sum
def test_check_index_too_high(self): ODE = jitcode([y(1)]) with self.assertRaises(ValueError): ODE.check()
def kuramotos_f(): for i in range(n): coupling_sum = sum(sin(y(j) - y(i)) for j in range(n) if A[j, i]) yield omega[i] + c / (n - 1) * coupling_sum
b = 0.2 c = 10.0 k = 0.01 # get adjacency matrix of a small-world network A = small_world_network( number_of_nodes = N, nearest_neighbours = 20, rewiring_probability = 0.1 ) # generate differential equations # ------------------------------- sum_z = symengine.Symbol("sum_z") helpers = [( sum_z, sum( y(3*j+2) for j in range(N) ) )] def f(): for i in range(N): coupling_sum = sum( y(3*j)-y(3*i) for j in range(N) if A[i,j] ) coupling_term = k * symengine.sin(t) * coupling_sum yield -ω[i] * y(3*i+1) - y(3*i+2) + coupling_term yield ω[i] * y(3*i) + a*y(3*i+1) coupling_term_2 = k * (sum_z-N*y(3*i+2)) yield b + y(3*i+2) * (y(3*i) - c) + coupling_term_2 # integrate # --------- initial_state = np.random.random(3*N)
ω = np.random.uniform(0.8, 1.0, N) a = 0.165 b = 0.2 c = 10.0 k = 0.01 # get adjacency matrix of a small-world network A = small_world_network(number_of_nodes=N, nearest_neighbours=20, rewiring_probability=0.1) # generate differential equations # ------------------------------- sum_z = symengine.Symbol("sum_z") helpers = [(sum_z, sum(y(3 * j + 2) for j in range(N)))] def f(): for i in range(N): coupling_sum = sum( y(3 * j) - y(3 * i) for j in range(N) if A[i, j]) coupling_term = k * symengine.sin(t) * coupling_sum yield -ω[i] * y(3 * i + 1) - y(3 * i + 2) + coupling_term yield ω[i] * y(3 * i) + a * y(3 * i + 1) coupling_term_2 = k * (sum_z - N * y(3 * i + 2)) yield b + y(3 * i + 2) * (y(3 * i) - c) + coupling_term_2 # integrate # --------- initial_state = np.random.random(3 * N)
def test_initalise_with_dict(self): self.ODE = jitcode(**vanilla) initial_value = {y(i): y0[i] for i in range(n)} self.ODE.set_initial_value(initial_value) self.ODE.set_integrator("dop853") self.assertTrue(_is_C(self.ODE.f))
#!/usr/bin/python3 # -*- coding: utf-8 -*- from jitcode import jitcode_restricted_lyap, y import numpy as np from scipy.stats import sem a = -0.025794 b1 = 0.01 b2 = 0.01 c = 0.02 k = 0.128 f = [ y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)), b1 * y(0) - c * y(1), y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(0) - y(2)), b2 * y(2) - c * y(3) ] initial_state = np.random.random(4) vectors = [np.array([1., 0., 1., 0.]), np.array([0., 1., 0., 1.])] ODE = jitcode_restricted_lyap(f, vectors=vectors) ODE.set_integrator("dopri5") ODE.set_initial_value(initial_state, 0.0) data = np.hstack(ODE.integrate(T)[1] for T in range(10, 100000, 10)) print(np.average(data[500:]), sem(data[500:]))
:start-after: example-st\u0061rt :dedent: 1 :linenos: """ if __name__ == "__main__": # example-start from jitcode import y, jitcode import numpy as np γ = 0.6 φ = 1.0 ω = 0.5 ν = 0.5 R, B = dynvars = [y(i) for i in range(2)] lotka_volterra_diff = { B: γ * B - φ * R * B, R: -ω * R + ν * R * B, } ODE = jitcode(lotka_volterra_diff) ODE.set_integrator("dopri5") initial_state = {R: 0.2, B: 0.5} ODE.set_initial_value(initial_state, 0.0) times = np.arange(0.0, 100, 0.1) values = {R: [], B: []} for time in times: ODE.integrate(time)
def Paci2018(tDrugApplication, INaFRedMed,ICaLRedMed, IKrRedMed, IKsRedMed): dY = [None]*23 ''' Parameters from optimizer VmaxUp = param(1) g_irel_max = param(2) RyRa1 = param(3) RyRa2 = param(4) RyRahalf = param(5) RyRohalf = param(6) RyRchalf = param(7) kNaCa = param(8) PNaK = param(9) Kup = param(10) V_leak = param(11) alpha = param(12) ''' VmaxUp = 0.5113 # millimolar_per_second (in calcium_dynamics) g_irel_max = 62.5434 # millimolar_per_second (in calcium_dynamics) RyRa1 = 0.05354 # uM RyRa2 = 0.0488 # uM RyRahalf = 0.02427 # uM RyRohalf = 0.01042 # uM RyRchalf = 0.00144 # uM kNaCa = 3917.0463 # A_per_F (in i_NaCa) PNaK = 2.6351 # A_per_F (in i_NaK) Kup = 3.1928e-4 # millimolar (in calcium_dynamics) V_leak = 4.7279e-4 # per_second (in calcium_dynamics) alpha = 2.5371 # dimensionless (in i_NaCa) ## Constants F = 96485.3415 # coulomb_per_mole (in model_parameters) R = 8.314472 # joule_per_mole_kelvin (in model_parameters) T = 310 # kelvin (in model_parameters) ## Cell geometry V_SR = 583.73 # micrometre_cube (in model_parameters) Vc = 8800 # micrometre_cube (in model_parameters) Cm = 9.87109e-11 # farad (in model_parameters) ## Extracellular concentrations Nao = 151 # millimolar (in model_parameters) Ko = 5.4 # millimolar (in model_parameters) Cao = 1.8 #3#5#1.8 # millimolar (in model_parameters) ## Intracellular concentrations # Naio = 10 mM y(17) Ki = 150 # millimolar (in model_parameters) # Cai = 0.0002 mM y(2) # caSR = 0.3 mM y(1) ## Nernst potential E_Na = R*T/F*log(Nao/y(17)) E_Ca = 0.5*R*T/F*log(Cao/y(2)) E_K = R*T/F*log(Ko/Ki) PkNa = 0.03 # dimensionless (in electric_potentials) E_Ks = R*T/F*log((Ko+PkNa*Nao)/(Ki+PkNa*y(17))) ## INa g_Na = 3671.2302 # S_per_F (in i_Na) i_Na = g_Na*y(13)**3*y(11)*y(12)*(y(0)-E_Na) h_inf = 1/sqrt(1+exp((y(0)*1000+72.1)/5.7)) alpha_h = 0.057*exp(-(y(0)*1000+80)/6.8) beta_h = 2.7*exp(0.079*y(0)*1000)+3.1*10**5*exp(0.3485*y(0)*1000) tau_h = conditional(y(0),-0.0385,1.5/((alpha_h+beta_h)*1000),1.5*1.6947/1000) dY[11] = (h_inf-y(11))/tau_h j_inf = 1/sqrt(1+exp((y(0)*1000+72.1)/5.7)) alpha_j = conditional(y(0),-0.04,(-25428*exp(0.2444*y(0)*1000)-6.948*10**-6*exp(-0.04391*y(0)*1000))*(y(0)*1000+37.78)/(1+exp(0.311*(y(0)*1000+79.23))),0) beta_j = conditional( y(0),-0.04, 0.02424*exp(-0.01052*y(0)*1000)/(1+exp(-0.1378*(y(0)*1000+40.14))), 0.6*exp((0.057)*y(0)*1000)/(1+exp(-0.1*(y(0)*1000+32))), ) tau_j = 7/((alpha_j+beta_j)*1000) dY[12] = (j_inf-y(12))/tau_j m_inf = 1/(1+exp((-y(0)*1000-34.1)/5.9))**(1/3) alpha_m = 1/(1+exp((-y(0)*1000-60)/5)) beta_m = 0.1/(1+exp((y(0)*1000+35)/5))+0.1/(1+exp((y(0)*1000-50)/200)) tau_m = 1*alpha_m*beta_m/1000 dY[13] = (m_inf-y(13))/tau_m ## INaL myCoefTauM = 1 tauINaL = 200 #ms GNaLmax = 2.3*7.5 #(S/F) Vh_hLate = 87.61 i_NaL = GNaLmax* y(18)**(3)*y(19)*(y(0)-E_Na) m_inf_L = 1/(1+exp(-(y(0)*1000+42.85)/(5.264))) alpha_m_L = 1/(1+exp((-60-y(0)*1000)/5)) beta_m_L = 0.1/(1+exp((y(0)*1000+35)/5))+0.1/(1+exp((y(0)*1000-50)/200)) tau_m_L = 1/1000 * myCoefTauM*alpha_m_L*beta_m_L dY[18] = (m_inf_L-y(18))/tau_m_L h_inf_L = 1/(1+exp((y(0)*1000+Vh_hLate)/(7.488))) tau_h_L = 1/1000 * tauINaL dY[19] = (h_inf_L-y(19))/tau_h_L ## If E_f = -0.017 # volt (in i_f) g_f = 30.10312 # S_per_F (in i_f) i_f = g_f*y(14)*(y(0)-E_f) i_fNa = 0.42*g_f*y(14)*(y(0)-E_Na) Xf_infinity = 1/(1+exp((y(0)*1000+77.85)/5)) tau_Xf = 1900/(1+exp((y(0)*1000+15)/10))/1000 dY[14] = (Xf_infinity-y(14))/tau_Xf ## ICaL g_CaL = 8.635702e-5 # metre_cube_per_F_per_s (in i_CaL) i_CaL = g_CaL*4*y(0)*F**2/(R*T)*(y(2)*exp(2*y(0)*F/(R*T))-0.341*Cao)/(exp(2*y(0)*F/(R*T))-1)*y(4)*y(5)*y(6)*y(7) d_infinity = 1/(1+exp(-(y(0)*1000+9.1)/7)) alpha_d = 0.25+1.4/(1+exp((-y(0)*1000-35)/13)) beta_d = 1.4/(1+exp((y(0)*1000+5)/5)) gamma_d = 1/(1+exp((-y(0)*1000+50)/20)) tau_d = (alpha_d*beta_d+gamma_d)*1/1000 dY[4] = (d_infinity-y(4))/tau_d f1_inf = 1/(1+exp((y(0)*1000+26)/3)) constf1 = 1 + 1433*(y(2)-50*1e-6) tau_f1 = (20+1102.5*exp(-((y(0)*1000+27)**2/15)**2)+200/(1+exp((13-y(0)*1000)/10))+180/(1+exp((30+y(0)*1000)/10)))*constf1/1000 dY[5] = (f1_inf-y(5))/tau_f1 f2_inf = 0.33+0.67/(1+exp((y(0)*1000+32)/4)) constf2 = 1 tau_f2 = (600*exp(-(y(0)*1000+25)**2/170)+31/(1+exp((25-y(0)*1000)/10))+16/(1+exp((30+y(0)*1000)/10)))*constf2/1000 dY[6] = (f2_inf-y(6))/tau_f2 alpha_fCa = 1/(1+(y(2)/0.0006)**8) beta_fCa = 0.1/(1+exp((y(2)-0.0009)/0.0001)) gamma_fCa = 0.3/(1+exp((y(2)-0.00075)/0.0008)) fCa_inf = (alpha_fCa+beta_fCa+gamma_fCa)/1.3156 constfCa = conditional( y(0), -0.06, 1, conditional(fCa_inf,y(7),1,0) ) tau_fCa = 0.002 # second (in i_CaL_fCa_gate) dY[7] = constfCa*(fCa_inf-y(7))/tau_fCa ## Ito g_to = 29.9038 # S_per_F (in i_to) i_to = g_to*(y(0)-E_K)*y(15)*y(16) q_inf = 1/(1+exp((y(0)*1000+53)/13)) tau_q = (6.06+39.102/(0.57*exp(-0.08*(y(0)*1000+44))+0.065*exp(0.1*(y(0)*1000+45.93))))/1000 dY[15] = (q_inf-y(15))/tau_q r_inf = 1/(1+exp(-(y(0)*1000-22.3)/18.75)) tau_r = (2.75352+14.40516/(1.037*exp(0.09*(y(0)*1000+30.61))+0.369*exp(-0.12*(y(0)*1000+23.84))))/1000 dY[16] = (r_inf-y(16))/tau_r ## IKs g_Ks = 2.041 # S_per_F (in i_Ks) i_Ks = g_Ks*(y(0)-E_Ks)*y(10)**2*(1+0.6/(1+(3.8*0.00001/y(2))**1.4)) Xs_infinity = 1/(1+exp((-y(0)*1000-20)/16)) alpha_Xs = 1100/sqrt(1+exp((-10-y(0)*1000)/6)) beta_Xs = 1/(1+exp((-60+y(0)*1000)/20)) tau_Xs = 1*alpha_Xs*beta_Xs/1000 dY[10] = (Xs_infinity-y(10))/tau_Xs ## IKr L0 = 0.025 # dimensionless (in i_Kr_Xr1_gate) Q = 2.3 # dimensionless (in i_Kr_Xr1_gate) g_Kr = 29.8667 # S_per_F (in i_Kr) i_Kr = g_Kr*(y(0)-E_K)*y(8)*y(9)*sqrt(Ko/5.4) V_half = 1000*(-R*T/(F*Q)*log((1+Cao/2.6)**4/(L0*(1+Cao/0.58)**4))-0.019) Xr1_inf = 1/(1+exp((V_half-y(0)*1000)/4.9)) alpha_Xr1 = 450/(1+exp((-45-y(0)*1000)/10)) beta_Xr1 = 6/(1+exp((30+y(0)*1000)/11.5)) tau_Xr1 = 1*alpha_Xr1*beta_Xr1/1000 dY[8] = (Xr1_inf-y(8))/tau_Xr1 Xr2_infinity = 1/(1+exp((y(0)*1000+88)/50)) alpha_Xr2 = 3/(1+exp((-60-y(0)*1000)/20)) beta_Xr2 = 1.12/(1+exp((-60+y(0)*1000)/20)) tau_Xr2 = 1*alpha_Xr2*beta_Xr2/1000 dY[9] = (Xr2_infinity-y(9))/tau_Xr2 ## IK1 alpha_K1 = 3.91/(1+exp(0.5942*(y(0)*1000-E_K*1000-200))) beta_K1 = (-1.509*exp(0.0002*(y(0)*1000-E_K*1000+100))+exp(0.5886*(y(0)*1000-E_K*1000-10)))/(1+exp(0.4547*(y(0)*1000-E_K*1000))) XK1_inf = alpha_K1/(alpha_K1+beta_K1) g_K1 = 28.1492 # S_per_F (in i_K1) i_K1 = g_K1*XK1_inf*(y(0)-E_K)*sqrt(Ko/5.4) ## INaCa KmCa = 1.38 # millimolar (in i_NaCa) KmNai = 87.5 # millimolar (in i_NaCa) Ksat = 0.1 # dimensionless (in i_NaCa) gamma = 0.35 # dimensionless (in i_NaCa) kNaCa1 = kNaCa # A_per_F (in i_NaCa) i_NaCa = kNaCa1*(exp(gamma*y(0)*F/(R*T))*y(17)**3*Cao-exp((gamma-1)*y(0)*F/(R*T))*Nao**3*y(2)*alpha)/((KmNai**3+Nao**3)*(KmCa+Cao)*(1+Ksat*exp((gamma-1)*y(0)*F/(R*T)))) ## INaK Km_K = 1 # millimolar (in i_NaK) Km_Na = 40 # millimolar (in i_NaK) PNaK1 = PNaK # A_per_F (in i_NaK) i_NaK = PNaK1*Ko/(Ko+Km_K)*y(17)/(y(17)+Km_Na)/(1+0.1245*exp(-0.1*y(0)*F/(R*T))+0.0353*exp(-y(0)*F/(R*T))) ## IpCa KPCa = 0.0005 # millimolar (in i_PCa) g_PCa = 0.4125 # A_per_F (in i_PCa) i_PCa = g_PCa*y(2)/(y(2)+KPCa) ## Background currents g_b_Na = 0.95 # S_per_F (in i_b_Na) i_b_Na = g_b_Na*(y(0)-E_Na) g_b_Ca = 0.727272 # S_per_F (in i_b_Ca) i_b_Ca = g_b_Ca*(y(0)-E_Ca) ## Sarcoplasmic reticulum i_up = VmaxUp/(1+Kup**2/y(2)**2) i_leak = (y(1)-y(2))*V_leak dY[3] = 0 # RyR RyRSRCass = (1 - 1/(1 + exp((y(1)-0.3)/0.1))) i_rel = g_irel_max*RyRSRCass*y(21)*y(22)*(y(1)-y(2)) RyRainfss = RyRa1-RyRa2/(1 + exp((1000*y(2)-(RyRahalf))/0.0082)) RyRtauadapt = 1 #s dY[20] = (RyRainfss- y(20))/RyRtauadapt RyRoinfss = (1 - 1/(1 + exp((1000*y(2)-(y(20)+ RyRohalf))/0.003))) RyRtauact = conditional(RyRoinfss,y(21),0.1,1)*18.75e-3 dY[21] = (RyRoinfss- y(21))/RyRtauact RyRcinfss = (1/(1 + exp((1000*y(2)-(y(20)+RyRchalf))/0.001))) RyRtauinact = conditional(RyRcinfss,y(22),1,2)*87.5e-3 dY[22] = (RyRcinfss- y(22))/RyRtauinact ## Ca2+ buffering Buf_C = 0.25 # millimolar (in calcium_dynamics) Buf_SR = 10 # millimolar (in calcium_dynamics) Kbuf_C = 0.001 # millimolar (in calcium_dynamics) Kbuf_SR = 0.3 # millimolar (in calcium_dynamics) Cai_bufc = 1/(1+Buf_C*Kbuf_C/(y(2)+Kbuf_C)**2) Ca_SR_bufSR = 1/(1+Buf_SR*Kbuf_SR/(y(1)+Kbuf_SR)**2) ## Ionic concentrations #Nai dY[17] = -Cm*(i_Na+i_NaL+i_b_Na+3*i_NaK+3*i_NaCa+i_fNa)/(F*Vc*1e-18) #caSR dY[2] = Cai_bufc*(i_leak-i_up+i_rel-(i_CaL+i_b_Ca+i_PCa-2*i_NaCa)*Cm/(2*Vc*F*1e-18)) #Cai dY[1] = Ca_SR_bufSR*Vc/V_SR*(i_up-(i_rel+i_leak)) i_stim = 0 ## Membrane potential dY[0] = -(i_K1+i_to+i_Kr+i_Ks+i_CaL+i_NaK+i_Na+i_NaL+i_NaCa+i_PCa+i_f+i_b_Na+i_b_Ca-i_stim) return dY
#cdc25 and wee1 activity depend on cdk1, but also on their total def cdc25(cdk, cdc25T=1): return cdc25T * (p['acdc25'] + p['bcdc25'] * cdk**p['ncdc25'] / (p['Kcdc25']**p['ncdc25'] + cdk**p['ncdc25'])) def wee1(cdk, wee1T=1): return wee1T * (p['awee1'] + p['bwee1'] * p['Kwee1']**p['nwee1'] / (p['Kwee1']**p['nwee1'] + cdk**p['nwee1'])) #solve #order: cyc, cdk, cdc #nucleus cytoplasm cycn = y(0) cycc = y(1) cdkn = y(2) cdkc = y(3) cdcn = y(4) cdcc = y(5) #import rates depend on Cdk1 levels impcdc = .1 + cdkc / 30 #import factor for cdc25 impcyc = 1 + cdkn / 60 #import factor for cyclin # derivatives dcycn = pr['kncyc'] * impcyc * cycc - pr['kccyc'] * cycn dcycc = -pr['kncyc'] * impcyc * cycc + pr['kccyc'] * cycn + p['ks']
def f(): for n in range(NUM_NEURON): coupling_sum = sum(symengine.sin(y(m)-y(n)) for m in A_list[n]) # nonlinearity! coupling_term = couple_const * coupling_sum yield int_freqs[n] + coupling_term