function Epileptor(lngth) {
Math.nrand = function() {
var x1, x2, rad, y1;
do {
x1 = 2 * this.random() - 1;
x2 = 2 * this.random() - 1;
rad = x1 * x1 + x2 * x2;
} while(rad >= 1 || rad == 0);
var c = this.sqrt(-2 * Math.log(rad) / rad);
return x1 * c;
};
function VK(Kconc){
return 26.6 * Math.log(Kconc / 130.)
}
function u_over_gL(K, v, x){
eta = Math.nrand();//om.normal(0, 1)
vkk = VK(K);
return g_K * (vkk - vkk0) + G_syn * v * (x - 0.5)
+ sigma * eta / Math.sqrt(dt) / Math.sqrt(1000)
}
//**************************************************************** */
function dots(states){
// K, Na, x, V, U = states
K = states[1];
Na = states[2];
x = states[3];
V = states[4];
U = states[5];
dotK = (Kbath - K) / tau_K - 2 * gamma * Ipi + deltaK * vi;
dotNa = (Na_0 - Na) / tau_Na - 3 * Ipi + deltaNa * vi;
dotV = (ui - V) / tau_m;
dotx = (1 - x) / tau_x - deltax * x * vi;
dotU = 1000 * ((gU / CU) * (U - U1) * (U - U2) + gL * ui / CU);
dots[1]=dotK;
dots[2]=dotNa;
dots[3]=dotx;
dots[4]=dotV;
dots[5]=dotU;
return dots
}
//**************************************************************** */
function v(V){
scc = 2. / (1 + Math.exp(2 * (Vth - V) / K_v)) - 1;
if (scc<0) {scc=0};
return vmax * scc
}
function I_pump(K, Na){
return rho / ((1 + Math.exp(3.5 - K)) * (1 + Math.exp((25 - Na) / 3)))
}
// in ms
tau_K = 100; // s
tau_Na = 20; // s
tau_m = 0.01; // s
tau_x = 2; // s
deltaK = 0.02;
deltaNa = 0.03;
deltax = 0.01;
rho = 0.2;
gamma = 10.0;
// input terms devided by gL
sigma = 25.0;
G_syn = 5.0; // 5.*gL
g_K = 0.5;
K_0 = 3.0;
// V
Kbath1 = 3;
Kbath2 = 8.5;
Na_0 = 10.0;
vmax = 100;
Vth = 25.0;
K_v = 20.0;
gL = 1; // from their mathematica notebook
// parameters of the observer:
gU = 0.4;
CU = 200.0;
Uth = 25.0;
Vr = -50.0;
U1 = -60.0;
U2 = -40.0;
U_0 = -70.0;
Ur = Vr;
// x0 not given
V_0 = 0;
x_0 = 1.0;
v_0 = 1;
Ip_0 = 0;
vkk0 = VK(K_0);
// K_Na_x_V_v_U
dt = 0.005; // resolution in second
u_0 = u_over_gL(K_0, v_0, x_0);
tt = lngth*dt; // duration in second
var xax =[];
var arbig = [];
var ii; var k;
for (ii=0; ii<=lngth; ii++){
xax[ii] = dt*ii;
arbig[ii] = [];
for (k=1; k<=9; k++){
arbig[ii][k] = 0;
}
}
y_0 = 0.0; // recovery
// Math.random.seed(124)
// states0 =
arbig[0][1] = K_0;
arbig[0][2] = Na_0;
arbig[0][3] = x_0;
arbig[0][4] = V_0;
arbig[0][5] = U_0;
arbig[0][6] = 0;
arbig[0][7] = v_0;
arbig[0][8] = Ip_0;
arbig[0][9] = u_0;
Ki = arbig[0][1];
Nai = arbig[0][2];
xi = arbig[0][3];
Vi = arbig[0][4];
Ui = arbig[0][5];
time = arbig[0][6];
vi = arbig[0][7];
Ipi = arbig[0][8];
ui = arbig[0][9];
var state=[];
var ii;
for (ii = 1; ii <= lngth; ii++) {
time = ii*dt;
if (time <= 50) { Kbath = Kbath1 }
else { Kbath = Kbath2 }
for (k=1; k<=5; k++){
state[k] = arbig[ii-1][k];
}
//************************************************* */
var_dots = dots(state);
//************************************************* */
Ki = state[1] + dt * var_dots[1];
Nai = state[2] + dt * var_dots[2];
xi = state[3] + dt * var_dots[3];
Vi = state[4] + dt * var_dots[4];
Ui = state[5] + dt * var_dots[5];
//************************************************* */
Ipi = I_pump(Ki, Nai);
vi = v(Vi);
ui = u_over_gL(Ki, vi, xi);
if (Ui > Vth){ Ui = Vr; }
arbig[ii][1] = Ki;
arbig[ii][2] = Nai;
arbig[ii][3] = xi;
arbig[ii][4] = Vi;
arbig[ii][5] = Ui;
arbig[ii][6] = time;
arbig[ii][7] = vi;
arbig[ii][8] = Ipi;
arbig[ii][9] = ui;
}
return arbig;
}