-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhh.rs
97 lines (77 loc) · 2.07 KB
/
hh.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
extern crate gnuplot;
fn alpha_m(v: f64) -> f64{
(0.1*(25.0-v)) / (((25.0-v)/10.0).exp()-1.0)
}
fn alpha_h(v: f64) -> f64{
0.07*((-v/20.0).exp())
}
fn alpha_n(v: f64) -> f64{
(0.01*(10.0-v)) / (((10.0-v)/10.0).exp()-1.0)
}
fn beta_m(v: f64) -> f64{
4.0*((-v/18.0).exp())
}
fn beta_h(v: f64) -> f64{
1.0/(((30.0-v)/10.0).exp()+1.0)
}
fn beta_n(v: f64) -> f64{
0.125*((-v/80.0).exp())
}
fn rk4<F: Fn(f64)->f64>(f: F, y: f64, dt: f64) -> f64 {
let k1 = dt * f(y);
let k2 = dt * f(y + k1*0.5);
let k3 = dt * f(y + k2*0.5);
let k4 = dt * f(y + k3);
(k1 + 2.0*k2 + 2.0*k3 + k4) / 6.0
}
fn main(){
const E_NA: f64 = 115.0;
const E_K: f64 = -12.0;
const E_L: f64 = 10.613;
const G_NA: f64 = 120.0;
const G_K: f64 = 36.0;
const G_L: f64 = 0.3;
const C_M: f64 = 1.0;
let mut t = -100.0;
let dt = 0.001;
let mut i_ext ;
let mut v = -10.0;
let mut x_n = 0.0;
let mut x_m = 0.0;
let mut x_h = 0.0;
let mut x = Vec::new();
let mut y = Vec::new();
while t <= 100.0 {
if t > 30.0 && t < 70.0 {
i_ext = 10.0;
} else {
i_ext = 0.0;
}
let a_n = alpha_n(v);
let a_m = alpha_m(v);
let a_h = alpha_h(v);
let b_n = beta_n(v);
let b_m = beta_m(v);
let b_h = beta_h(v);
let d_n = |y: f64| a_n*(1.0-y) - b_n*y;
let d_m = |y: f64| a_m*(1.0-y) - b_m*y;
let d_h = |y: f64| a_h*(1.0-y) - b_h*y;
x_n += rk4(d_n, x_n, dt);
x_m += rk4(d_m, x_m, dt);
x_h += rk4(d_h, x_h, dt);
let i_na = G_NA *(x_m.powf(3.0))*x_h*(v- E_NA);
let i_k = G_K *(x_n.powf(4.0))*(v- E_K);
let i_l = G_L *(v- E_L);
let i_sum = i_na + i_k + i_l;
let d_v = |y:f64| (i_ext - i_sum) / C_M;
v += rk4(d_v, v, dt);
if t >= 0.0{
x.push(t);
y.push(v);
}
t += dt;
}
let mut fg = gnuplot::Figure::new();
fg.axes2d().lines(x.iter(), y.iter(), &[gnuplot::Color("blue")]);
fg.echo_to_file("hh.plt");
}