SpaceQuester

Untitled

Aug 28th, 2017
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.44 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 Neuron_count 800
  10. #define Neuron_count_half Neuron_count / 2
  11.  
  12. #define Equations_per_neuron 4
  13. #define Equations_count Neuron_count * Equations_per_neuron
  14.  
  15. double f[Equations_count];
  16.  
  17. double C_m = 1;
  18.  
  19. double g_K = 36;
  20. double g_Na = 120;
  21. double g_L = 0.3;
  22.  
  23. double E_K = -77;
  24. double E_Na = 55;
  25. double E_L = -54.4;
  26.  
  27. double k_syn = 0.2;
  28.  
  29. double I_app[Equations_count];
  30.  
  31. const double sigma_G = 0.0;
  32. const double sigma_GN = 0.0;
  33. const double sigma_N = 0.1;
  34.  
  35. double** A;
  36. double** B;
  37. double* C;
  38. double** sigma;
  39.  
  40. double V(int i)
  41. {
  42. return f[i * 4];
  43. }
  44.  
  45. double m(int i)
  46. {
  47. return f[i * 4 + 1];
  48. }
  49.  
  50. double n(int i)
  51. {
  52. return f[i * 4 + 2];
  53. }
  54.  
  55. double h(int i)
  56. {
  57. return f[i * 4 + 3];
  58. }
  59.  
  60. int RandomI(int min, int max)
  61. {
  62. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  63. }
  64.  
  65. double RandomD(double min, double max)
  66. {
  67. return ((double)rand() / RAND_MAX) * (max - min) + min;
  68. }
  69.  
  70. double alpha_n(double* f, int i)
  71. {
  72. return 0.01 * (V(i) + 55) / (1 - exp(-(V(i) + 55) / 10));
  73. }
  74.  
  75. double beta_n(double* f, int i)
  76. {
  77. return 0.125 * exp(-(V(i) + 65) / 80);
  78. }
  79.  
  80. double alpha_m(double* f, int i)
  81. {
  82. return 0.1 * (V(i) + 40) / (1 - exp(-(V(i) + 40) / 10));
  83. }
  84.  
  85. double beta_m(double* f, int i)
  86. {
  87. return 4 * exp(-(V(i) + 65) / 18);
  88. }
  89.  
  90. double alpha_h(double* f, int i)
  91. {
  92. return 0.07 * exp(-(V(i) + 65) / 20);
  93. }
  94.  
  95. double beta_h(double* f, int i)
  96. {
  97. return 1 / (exp(-(V(i) + 35) / 10) + 1);
  98. }
  99.  
  100. double HodgkinHuxley(int i, double* f)
  101. {
  102. int in = i / 4;
  103. int il = i % 4;
  104.  
  105. switch (il)
  106. {
  107. case 0:
  108. {
  109. double sum = 0;
  110.  
  111. /*for (int j = 0; j < Neuron_count; j++)
  112. {
  113. sum += sigma[in][j] * A[in][j] * (V(j) - V(in));
  114. }*/
  115.  
  116. /*for (int j = 0; j < C[in]; j++)
  117. {
  118. sum += sigma[in][(int)B[in][j]] * (V((int)B[in][j]) - V(in));
  119. }*/
  120.  
  121. for (int j = 0; j < C[in]; j++)
  122. {
  123. sum += sigma[in][(int)B[in][j]] * V((int)B[in][j]) / (1 + exp(-V(in) / k_syn));
  124. }
  125.  
  126. return 1000 * ((g_Na * m(in) * m(in) * m(in) * h(in) * (E_Na - V(in)) + g_K * n(in) * n(in) * n(in) * n(in) * (E_K - V(in)) + g_L * (E_L - V(in)) + I_app[in] + sum) / C_m);
  127. }
  128.  
  129. case 1:
  130. {
  131. return 1000 * (alpha_m(f, in) * (1 - m(in)) - beta_m(f, in) * m(in));
  132. }
  133.  
  134. case 2:
  135. {
  136. return 1000 * (alpha_n(f, in) * (1 - n(in)) - beta_n(f, in) * n(in));
  137. }
  138.  
  139. case 3:
  140. {
  141. return 1000 * (alpha_h(f, in) * (1 - h(in)) - beta_h(f, in) * h(in));
  142. }
  143. }
  144.  
  145. return 0;
  146. }
  147.  
  148. void RungeKutta(double dt, double* f, double* f_next)
  149. {
  150. double k[Equations_count][4];
  151.  
  152. // k1
  153. for (int i = 0; i < Equations_count; i++)
  154. k[i][0] = HodgkinHuxley(i, f) * dt;
  155.  
  156. double phi_k1[Equations_count];
  157. for (int i = 0; i < Equations_count; i++)
  158. phi_k1[i] = f[i] + k[i][0] / 2;
  159.  
  160. // k2
  161. for (int i = 0; i < Equations_count; i++)
  162. k[i][1] = HodgkinHuxley(i, phi_k1) * dt;
  163.  
  164. double phi_k2[Equations_count];
  165. for (int i = 0; i < Equations_count; i++)
  166. phi_k2[i] = f[i] + k[i][1] / 2;
  167.  
  168. // k3
  169. for (int i = 0; i < Equations_count; i++)
  170. k[i][2] = HodgkinHuxley(i, phi_k2) * dt;
  171.  
  172. double phi_k3[Equations_count];
  173. for (int i = 0; i < Equations_count; i++)
  174. phi_k3[i] = f[i] + k[i][2] / 2;
  175.  
  176. // k4
  177. for (int i = 0; i < Equations_count; i++)
  178. k[i][3] = HodgkinHuxley(i, phi_k3) * dt;
  179.  
  180. for (int i = 0; i < Equations_count; i++)
  181. f_next[i] = f[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  182. }
  183.  
  184. void CopyArray(double* source, double* target, int N)
  185. {
  186. for (int i = 0; i < N; i++)
  187. target[i] = source[i];
  188. }
  189.  
  190. bool Approximately(double a, double b)
  191. {
  192. if (a < 0)
  193. a = -a;
  194.  
  195. if (b < 0)
  196. b = -b;
  197.  
  198. return a - b <= 0.000001;
  199. }
  200.  
  201. void FillAMatrixZero()
  202. {
  203. for (int i = 0; i < Neuron_count; i++)
  204. {
  205. for (int j = 0; j < Neuron_count; j++)
  206. {
  207. A[i][j] = 0;
  208. }
  209. }
  210. }
  211.  
  212. void FillBCMatrix()
  213. {
  214. for (int i = 0; i < Neuron_count; i++)
  215. {
  216. int bIndex = 0;
  217. C[i] = 0;
  218. for (int j = 0; j < Neuron_count; j++)
  219. {
  220. if (A[i][j] == 1)
  221. {
  222. B[i][bIndex] = j;
  223. bIndex++;
  224. C[i]++;
  225. }
  226. }
  227. }
  228. }
  229.  
  230. void FillSigmaMatrix()
  231. {
  232. for (int i = 0; i < Neuron_count; i++)
  233. {
  234. for (int j = 0; j < Neuron_count; j++)
  235. {
  236. if ((i >= 0 && i < Neuron_count_half) && (j >= 0 || j < Neuron_count_half))
  237. {
  238. sigma[i][j] = sigma_G;
  239. }
  240. if ((((i >= Neuron_count_half && i < Neuron_count) && (j >= 0 && j < Neuron_count_half)) || ((i >= 0 && i < Neuron_count_half) && (j >= Neuron_count_half && j < Neuron_count))))
  241. {
  242. sigma[i][j] = sigma_GN;
  243. }
  244. if ((i >= Neuron_count_half && i < Neuron_count) && (j >= Neuron_count_half && j < Neuron_count))
  245. {
  246. sigma[i][j] = sigma_N;
  247. }
  248. }
  249. }
  250. }
  251.  
  252. void FillRandomMatrix()
  253. {
  254. for (int k = 0; k < 2 * Neuron_count_half; k++)
  255. {
  256. int i, j;
  257.  
  258. do
  259. {
  260. i = RandomI(Neuron_count_half, Neuron_count);
  261. j = RandomI(Neuron_count_half, Neuron_count);
  262. } while ((i == j) || (A[i][j] == 1));
  263.  
  264. A[i][j] = 1;
  265. A[j][i] = 1;
  266. }
  267. }
  268.  
  269. int main(int argc, char *argv[])
  270. {
  271. FILE *fp0;
  272. srand(time(NULL));
  273.  
  274. A = malloc(Neuron_count * sizeof(double));
  275. for (int i = 0; i < Neuron_count; i++)
  276. A[i] = malloc(Neuron_count * sizeof(double));
  277.  
  278. B = malloc(Neuron_count * sizeof(double));
  279. for (int i = 0; i < Neuron_count; i++)
  280. B[i] = malloc(Neuron_count * sizeof(double));
  281.  
  282. C = malloc(Neuron_count * sizeof(double));
  283.  
  284. sigma = malloc(Neuron_count * sizeof(double));
  285. for (int i = 0; i < Neuron_count; i++)
  286. sigma[i] = malloc(Neuron_count * sizeof(double));
  287.  
  288. FillAMatrixZero();
  289. FillRandomMatrix();
  290. FillBCMatrix();
  291. FillSigmaMatrix();
  292.  
  293. fp0 = fopen("A.txt", "w+");
  294. for (int i = 0; i < Neuron_count; i++)
  295. {
  296. for (int j = 0; j < Neuron_count; j++)
  297. {
  298. fprintf(fp0, "%d\t", (int)A[i][j]);
  299. }
  300. fprintf(fp0, "\n");
  301. }
  302. fclose(fp0);
  303.  
  304. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  305. fp0 = fopen("links.txt", "w+");
  306. for (int i = Neuron_count_half; i < Neuron_count; i++)
  307. {
  308. int links_count = 0;
  309. for (int j = Neuron_count_half; j < Neuron_count; j++)
  310. {
  311. if (A[i][j] == 1)
  312. {
  313. links_count++;
  314. }
  315. }
  316. fprintf(fp0, "%d\n", (int)links_count);
  317.  
  318. }
  319. fclose(fp0);
  320.  
  321. fp0 = fopen("B.txt", "w+");
  322. for (int i = 0; i < Neuron_count; i++)
  323. {
  324. for (int j = 0; j < C[i]; j++)
  325. {
  326. fprintf(fp0, "%d\t", (int)B[i][j]);
  327. }
  328. fprintf(fp0, "\n");
  329. }
  330. fclose(fp0);
  331.  
  332. fp0 = fopen("C.txt", "w+");
  333. for (int i = 0; i < Neuron_count; i++)
  334. {
  335. fprintf(fp0, "%d\n", (int)C[i]);
  336. }
  337. fclose(fp0);
  338.  
  339. fp0 = fopen("sigma.txt", "w+");
  340. for (int i = 0; i < Neuron_count; i++)
  341. {
  342. for (int j = 0; j < Neuron_count; j++)
  343. {
  344. fprintf(fp0, "%f\t", sigma[i][j]);
  345. }
  346. fprintf(fp0, "\n");
  347. }
  348. fclose(fp0);
  349.  
  350. // Initial values
  351. for (int i = 0; i < Equations_count; i++)
  352. {
  353. f[i] = 0;
  354. }
  355.  
  356. for (int i = 0; i < Equations_count; i++)
  357. {
  358. I_app[i] = RandomD(9, 40);
  359. }
  360.  
  361. const double t_start = 0;
  362. const double t_max = 1; // 100 msec = 0.1 sec
  363. const double dt = 0.00001; // 0.01 msec = 0.00001 sec
  364.  
  365. double t = t_start;
  366.  
  367. fp0 = fopen("results.txt", "w+");
  368. //setlocale(LC_NUMERIC, "French_Canada.1252");
  369.  
  370. clock_t start_rk4, end_rk4;
  371. start_rk4 = clock();
  372. int lastPercent = -1;
  373.  
  374. while (t < t_max || Approximately(t, t_max))
  375. {
  376. fprintf(fp0, "%f\t", t);
  377.  
  378. for (int i = 0; i < Equations_count; i += 4)
  379. fprintf(fp0, i == Equations_count - 1 ? "%f" : "%f\t", f[i]);
  380.  
  381. fprintf(fp0, "\n");
  382.  
  383. double f_next[Equations_count];
  384.  
  385. RungeKutta(dt, f, f_next);
  386. CopyArray(f_next, f, Equations_count);
  387.  
  388. t += dt;
  389.  
  390. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  391. if (percent != lastPercent)
  392. {
  393. printf("Progress: %d%%\n", percent);
  394. lastPercent = percent;
  395. }
  396. }
  397.  
  398. fclose(fp0);
  399.  
  400. end_rk4 = clock();
  401. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  402. int minutes = (int)extime_rk4 / 60;
  403. int seconds = (int)extime_rk4 % 60;
  404. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  405.  
  406. fp0 = fopen("time_exec.txt", "w+");
  407. fprintf(fp0, "%f\n", extime_rk4);
  408. fclose(fp0);
  409.  
  410. for (int i = 0; i < Neuron_count; i++)
  411. free(A[i]);
  412. free(A);
  413.  
  414. for (int i = 0; i < Neuron_count; i++)
  415. free(B[i]);
  416. free(B);
  417.  
  418. for (int i = 0; i < Neuron_count; i++)
  419. free(sigma[i]);
  420. free(sigma);
  421.  
  422. free(C);
  423. }
Advertisement
Add Comment
Please, Sign In to add comment