Advertisement
SpaceQuester

Untitled

Oct 18th, 2017
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.18 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include "math.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <locale.h>
  6. #include <time.h>
  7. #include <stdbool.h>
  8.  
  9. #define N 4
  10.  
  11. #define V f[0]
  12. #define m f[1]
  13. #define n f[2]
  14. #define h f[3]
  15.  
  16. double f[N];
  17.  
  18. const double C = 1;
  19.  
  20. double g_K = 36;
  21. double g_Na = 120;
  22. double g_L = 0.3;
  23.  
  24. double E_K = -77; // -77 // -12
  25. double E_Na = 55; // 55 // 115
  26. double E_L = -54.4; // -54.4 // 10
  27.  
  28. double I_app = 8.65;
  29.  
  30. bool Random_meander = true;
  31. const double Min_freq = 50;
  32. const double Max_freq = 500;
  33. const double Min_magintude = -1.5;
  34. const double Max_magintude = 1.5;
  35. const double Duration = 0.001;
  36.  
  37. double Meander_start_from_zero = 5;
  38. double Meander_width = 1;
  39. double Meander_height = 2;
  40. double Meander_interval = 3;
  41.  
  42. int RandomI(int min, int max)
  43. {
  44. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  45. }
  46.  
  47. double RandomD(double min, double max)
  48. {
  49. return ((double)rand() / RAND_MAX) * (max - min) + min;
  50. }
  51.  
  52. double Min(double a, double b)
  53. {
  54. return a > b ? b : a;
  55. }
  56.  
  57. double Max(double a, double b)
  58. {
  59. return a > b ? a : b;
  60. }
  61.  
  62. double alpha_n(double f[N])
  63. {
  64. return 0.01 * (V + 55) / (1 - exp(-(V + 55) / 10));
  65. //return (10 - V) / (100 * (exp((10 - V) / 10)) - 1);
  66. }
  67.  
  68. double beta_n(double f[N])
  69. {
  70. return 0.125 * exp(-(V + 65) / 80);
  71. //return 0.125 * exp(-V / 80);
  72. }
  73.  
  74. double alpha_m(double f[N])
  75. {
  76. return 0.1 * (V + 40) / (1 - exp(-(V + 40) / 10));
  77. //return (25 - V) / (10 * (exp((25 - V) / 10) - 1));
  78. }
  79.  
  80. double beta_m(double f[N])
  81. {
  82. return 4 * exp(-(V + 65) / 18);
  83. //return 4 * exp(-V / 18);
  84. }
  85.  
  86. double alpha_h(double f[N])
  87. {
  88. return 0.07 * exp(-(V + 65) / 20);
  89. //return 0.07 * exp(-V / 20);
  90. }
  91.  
  92. double beta_h(double f[N])
  93. {
  94. return 1 / (exp(-(V + 35) / 10) + 1);
  95. //return 1 / (exp((30 - V) / 10) + 1);
  96. }
  97.  
  98. double I_stim(double t)
  99. {
  100. if (t < Meander_start_from_zero)
  101. return 0;
  102.  
  103. t -= Meander_start_from_zero;
  104. t = fmod(t, Meander_width + Meander_interval);
  105.  
  106. return t < Meander_width ? Meander_height : 0;
  107. }
  108.  
  109. double HodgkinHuxley(int i, double f[N], double t)
  110. {
  111. switch (i)
  112. {
  113. case 0:
  114. return (g_Na * m * m * m * h * (E_Na - V) + g_K * n * n * n * n * (E_K - V) + g_L * (E_L - V) + I_app + I_stim(t)) / C;
  115.  
  116. case 1:
  117. return alpha_m(f) * (1 - m) - beta_m(f) * m;
  118.  
  119. case 2:
  120. return alpha_n(f) * (1 - n) - beta_n(f) * n;
  121.  
  122. case 3:
  123. return alpha_h(f) * (1 - h) - beta_h(f) * h;
  124. }
  125. return 0;
  126. }
  127.  
  128. void RungeKutta(double t, double dt, double f[N], double f_next[N])
  129. {
  130. double k[N][4];
  131.  
  132. // k1
  133. for (int i = 0; i < N; i++)
  134. k[i][0] = HodgkinHuxley(i, f, t) * dt;
  135.  
  136. double phi_k1[N];
  137. for (int i = 0; i < N; i++)
  138. phi_k1[i] = f[i] + k[i][0] / 2;
  139.  
  140. // k2
  141. for (int i = 0; i < N; i++)
  142. k[i][1] = HodgkinHuxley(i, phi_k1, t) * dt;
  143.  
  144. double phi_k2[N];
  145. for (int i = 0; i < N; i++)
  146. phi_k2[i] = f[i] + k[i][1] / 2;
  147.  
  148. // k3
  149. for (int i = 0; i < N; i++)
  150. k[i][2] = HodgkinHuxley(i, phi_k2, t) * dt;
  151.  
  152. double phi_k3[N];
  153. for (int i = 0; i < N; i++)
  154. phi_k3[i] = f[i] + k[i][2] / 2;
  155.  
  156. // k4
  157. for (int i = 0; i < N; i++)
  158. k[i][3] = HodgkinHuxley(i, phi_k3, t) * dt;
  159.  
  160. for (int i = 0; i < N; i++)
  161. f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  162. }
  163.  
  164. void CopyArray(double source[N], double target[N])
  165. {
  166. for (int i = 0; i < N; i++)
  167. target[i] = source[i];
  168. }
  169.  
  170. bool Approximately(double a, double b)
  171. {
  172. if (a < 0)
  173. a = -a;
  174.  
  175. if (b < 0)
  176. b = -b;
  177.  
  178. return a - b <= 0.000001;
  179. }
  180.  
  181. void GenerateRandomMeander(double min_start_time)
  182. {
  183. Meander_start_from_zero = min_start_time + RandomD(1. / Max_freq, 1. / Min_freq);
  184. Meander_width = Duration;
  185. Meander_height = RandomD(Min_magintude, Max_magintude);
  186. }
  187.  
  188. int main(int argc, char *argv[])
  189. {
  190. FILE *fp0;
  191. srand(time(NULL));
  192.  
  193. for (int i = 0; i < N; i++)
  194. f[i] = 0;
  195.  
  196. const double t_start = 0;
  197. const double t_max = 100; //2000
  198. const double dt = 0.0001; //0.05
  199.  
  200. double t = t_start;
  201.  
  202. fp0 = fopen("results.txt", "w+");
  203. //setlocale(LC_NUMERIC, "French_Canada.1252");
  204.  
  205. clock_t start_rk4, end_rk4;
  206. start_rk4 = clock();
  207. int lastPercent = -1;
  208.  
  209. double last_meander_end;
  210.  
  211. if (Random_meander)
  212. {
  213. GenerateRandomMeander(0);
  214. last_meander_end = Meander_start_from_zero + Duration;
  215. }
  216.  
  217. while (t < t_max || Approximately(t, t_max))
  218. {
  219. if (Random_meander && t > last_meander_end)
  220. {
  221. GenerateRandomMeander(t);
  222. last_meander_end = Meander_start_from_zero + Duration;
  223. }
  224.  
  225. fprintf(fp0, "%f\t", t);
  226. fprintf(fp0, "%f\t", I_stim(t));
  227.  
  228. for (int i = 0; i < N; i++)
  229. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  230.  
  231. fprintf(fp0, "\n");
  232.  
  233. double f_next[N];
  234.  
  235. RungeKutta(t, dt, f, f_next);
  236. CopyArray(f_next, f);
  237.  
  238. t += dt;
  239.  
  240. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  241. if (percent != lastPercent)
  242. {
  243. printf("Progress: %d%%\n", percent);
  244. lastPercent = percent;
  245. }
  246. }
  247.  
  248. end_rk4 = clock();
  249. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  250. int minutes = (int)extime_rk4 / 60;
  251. int seconds = (int)extime_rk4 % 60;
  252. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  253.  
  254. fclose(fp0);
  255.  
  256. fp0 = fopen("time_exec.txt", "w+");
  257. fprintf(fp0, "%f\n", extime_rk4);
  258. fclose(fp0);
  259. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement