import Data.List -- Simulation parameters v_0 = -64.0 t_0 = 0.0 m_0 = 0.05 h_0 = 0.6 n_0 = 0.32 t_final = 100.0 dt = 0.001 -- Time constant functions alpha_m t = 0.1 * (v t + 40.0) / (1.0 - exp (-0.1 * (v t + 40.0))) beta_m t = 4.0 * exp (-0.0556 * (v t + 65.0)) alpha_h t = 0.07 * exp (-0.05 * (v t + 65.0)) beta_h t = 1.0 / (1.0 + exp (-0.1 * (v t + 35.0))) alpha_n t = 0.01 * (v t + 55.0) / (1.0 - exp (-0.1 * (v t + 55.0))) beta_n t = 0.125 * exp (-0.0125 * (v t + 65.0)) -- Steady-state functions m_inf t = alpha_m t / (alpha_m t + beta_m t) h_inf t = alpha_h t / (alpha_h t + beta_h t) n_inf t = alpha_n t / (alpha_n t + beta_n t) -- Voltage-dependent functions i_Na t v m h = 120.0 * m^3 * h * (v - 115.0) i_K t v n = 36.0 * n^4 * (v + 12.0) i_L t v = 0.3 * (v + 65.0) -- ODE functions v' t v m h n = (1.0 / cm) * (i_Stim t - i_Na t v m h - i_K t v n - i_L t v) m' t v m = alpha_m t * (1.0 - m) - beta_m t * m h' t v h = alpha_h t * (1.0 - h) - beta_h t * h n' t v n = alpha_n t * (1.0 - n) - beta_n t * n -- Stimulus current i_Stim t | t >= 10.0 && t <= 10.1 = 40.0 | otherwise = 0.0 -- Specific membrane capacitance cm = 1.0 -- Voltage-gated ion channels --v t = v t --m t = m t --h t = h t --n t = n t -- Time step for the simulation step t v m h n dt = (t + dt, v + dt * v', m + dt * m', h + dt * h', n + dt * n') -- Simulation function simulate :: Double -> Double -> Double -> Double -> Double -> Double -> Double -> ([Double], [Double], [Double], [Double], [Double]) simulate t v m h n t_final dt | t > t_final = ([], [], [], [], []) | otherwise = (t:ts, v:vs, m:ms, h:hs, n:ns) where t_next = t + dt v_next = v + dt * v_inf(t) * (v - v_rest) / tau_v(t) m_next = m + dt * alpha_m(v) * (1 - m) - dt * beta_m(v) * m h_next = h + dt * alpha_h(v) * (1 - h) - dt * beta_h(v) * h n_next = n + dt * alpha_n(v) * (1 - n) - dt * beta_n(v) * n (ts, vs, ms, hs, ns) = simulate t_next v_next m_next h_next n_next t_final dt showResult :: (Double, Double) -> String showResult (t, v) = (show t) ++ "\t\t" ++ (show v) -- Main function --main = do (time, v, m, h, n) = simulate t_0 v_0 m_0 h_0 n_0 t_final dt mapM_ (putStrLn . showResult) (zip time v)