SpaceQuester

Untitled

Jun 20th, 2017
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 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. 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 = -12;
  25. double E_Na = 115;
  26. double E_L = 10;
  27.  
  28. const double I_stim = 20;
  29.  
  30. int RandomI(int min, int max)
  31. {
  32. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  33. }
  34.  
  35. double RandomD(double min, double max)
  36. {
  37. return ((double)rand() / RAND_MAX) * (max - min) + min;
  38. }
  39.  
  40. double alpha_n(double f[N])
  41. {
  42. //return 0.01 * (V + 55) / (1 - exp(-(V + 55) / 10));
  43. return (10 - V) / (100*(exp((10-V)/10)) - 1);
  44. }
  45.  
  46. double beta_n(double f[N])
  47. {
  48. //return 0.125 * exp(-(V + 65) / 80);
  49. return 0.125 * exp(-V/80);
  50. }
  51.  
  52. double alpha_m(double f[N])
  53. {
  54. //return 0.1 * (V + 40) / (1 - exp(-(V + 40) / 10));
  55. return (25 - V) / (10*(exp((25-V)/10) - 1));
  56. }
  57.  
  58. double beta_m(double f[N])
  59. {
  60. //return 4 * exp(-(V + 65) / 18);
  61. return 4 * exp(-V/18);
  62. }
  63.  
  64. double alpha_h(double f[N])
  65. {
  66. //return 0.07 * exp(-(V + 65) / 20);
  67. return 0.07 * exp(-V/20);
  68. }
  69.  
  70. double beta_h(double f[N])
  71. {
  72. //return 1 / (exp(-(V + 35) / 10) + 1);
  73. return 1 / (exp((30-V)/10) + 1);
  74. }
  75.  
  76. double HodgkinHuxley(int i, double f[N])
  77. {
  78. switch (i)
  79. {
  80. case 0:
  81. 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_stim) / C;
  82.  
  83. case 1:
  84. return alpha_m(f) * (1 - m) - beta_m(f) * m;
  85.  
  86. case 2:
  87. return alpha_n(f) * (1 - n) - beta_n(f) * n;
  88.  
  89. case 3:
  90. return alpha_h(f) * (1 - h) - beta_m(f) * h;
  91. }
  92. return 0;
  93. }
  94.  
  95. void RungeKutta(double dt, double f[N], double f_next[N])
  96. {
  97. double k[N][4];
  98.  
  99. // k1
  100. for (int i = 0; i < N; i++)
  101. k[i][0] = HodgkinHuxley(i, f) * dt;
  102.  
  103. double phi_k1[N];
  104. for (int i = 0; i < N; i++)
  105. phi_k1[i] = f[i] + k[i][0] / 2;
  106.  
  107. // k2
  108. for (int i = 0; i < N; i++)
  109. k[i][1] = HodgkinHuxley(i, phi_k1) * dt;
  110.  
  111. double phi_k2[N];
  112. for (int i = 0; i < N; i++)
  113. phi_k2[i] = f[i] + k[i][1] / 2;
  114.  
  115. // k3
  116. for (int i = 0; i < N; i++)
  117. k[i][2] = HodgkinHuxley(i, phi_k2) * dt;
  118.  
  119. double phi_k3[N];
  120. for (int i = 0; i < N; i++)
  121. phi_k3[i] = f[i] + k[i][2] / 2;
  122.  
  123. // k4
  124. for (int i = 0; i < N; i++)
  125. k[i][3] = HodgkinHuxley(i, phi_k3) * dt;
  126.  
  127. for (int i = 0; i < N; i++)
  128. f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  129. }
  130.  
  131. void CopyArray(double source[N], double target[N])
  132. {
  133. for (int i = 0; i < N; i++)
  134. target[i] = source[i];
  135. }
  136.  
  137. bool Approximately(double a, double b)
  138. {
  139. if (a < 0)
  140. a = -a;
  141.  
  142. if (b < 0)
  143. b = -b;
  144.  
  145. return a - b <= 0.000001;
  146. }
  147.  
  148. int main(int argc, char *argv[])
  149. {
  150. FILE *fp0;
  151. srand(time(NULL));
  152.  
  153. for (int i = 0; i < N; i++)
  154. f[i] = RandomD(0, M_PI);
  155.  
  156. const double t_start = 0;
  157. const double t_max = 200; //2000
  158. const double dt = 0.00025; //0.05
  159.  
  160. double t = t_start;
  161.  
  162. fp0 = fopen("results.txt", "w+");
  163. //setlocale(LC_NUMERIC, "French_Canada.1252");
  164.  
  165. clock_t start_rk4, end_rk4;
  166. start_rk4 = clock();
  167. int lastPercent = -1;
  168.  
  169. while (t < t_max || Approximately(t, t_max))
  170. {
  171. fprintf(fp0, "%f\t", t);
  172. for (int i = 0; i < N; i++)
  173. {
  174. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", f[i]);
  175. }
  176. fprintf(fp0, "\n");
  177.  
  178. double phi_next[N];
  179.  
  180. RungeKutta(dt, f, phi_next);
  181. CopyArray(phi_next, f);
  182.  
  183. t += dt;
  184.  
  185. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  186. if (percent != lastPercent)
  187. {
  188. printf("Progress: %d%%\n", percent);
  189. lastPercent = percent;
  190. }
  191. }
  192.  
  193. end_rk4 = clock();
  194. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  195. int minutes = (int)extime_rk4 / 60;
  196. int seconds = (int)extime_rk4 % 60;
  197. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  198.  
  199. fclose(fp0);
  200.  
  201. fp0 = fopen("time_exec.txt", "w+");
  202. fprintf(fp0, "%f\n", extime_rk4);
  203. fclose(fp0);
  204. }
Advertisement
Add Comment
Please, Sign In to add comment