SpaceQuester

Untitled

Jul 22nd, 2017
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.83 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 15*15*2 // должно быть таким, что бы из этого числа, разделенного на два, извлекался корень
  10. #define NHalf N / 2
  11. #define WireWidth (int)sqrt(NHalf) // число осциляторов в строке/столбце одного слоя
  12. //#define K 1
  13.  
  14. const double omega_rand_glial_min = 0.5;
  15. const double omega_rand_glial_max = 1.5;
  16.  
  17. const double omega_rand_neuron_min = 9.5;
  18. const double omega_rand_neuron_max = 10.5;
  19.  
  20. const double theta_rand_min = 0;
  21. const double theta_rand_max = 2 * M_PI;
  22.  
  23. const double sigma_G = 0.5;
  24. double sigma_GN;
  25. const double sigma_N = 0.5;
  26.  
  27. double** A;
  28. double** B;
  29. double* C;
  30. double* omega;
  31. double* theta;
  32. double** sigma;
  33.  
  34. double p = 1.0;
  35.  
  36. /*double sinux_x[N];
  37. double cosinus_x[N];
  38. double sinus_y[N];
  39. double cosinus_y[N];*/
  40.  
  41. int RandomI(int min, int max)
  42. {
  43. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  44. }
  45.  
  46. double RandomD(double min, double max)
  47. {
  48. return ((double)rand() / RAND_MAX) * (max - min) + min;
  49. }
  50.  
  51. /*double kuramoto(int i, double theta[N]) // Без оптимизации
  52. {
  53. double sum = 0;
  54.  
  55. for (int j = 0; j < N; j++)
  56. {
  57. sum += A[i][j] * sin(theta[j] - theta[i]);
  58. }
  59.  
  60. return omega[i] + (double)sigma[i] * sum;
  61. }*/
  62.  
  63. double kuramoto(int i, double theta[N]) // С оптимизацией 1
  64. {
  65. double sum = 0;
  66.  
  67. for (int j = 0; j < C[i]; j++)
  68. {
  69. sum += sigma[i][(int)B[i][j]] * sin(theta[(int)B[i][j]] - theta[i]);
  70. }
  71.  
  72. return omega[i] + sum;
  73. }
  74.  
  75. /*double kuramoto(int i, double theta[N]) // С оптимизацией 2
  76. {
  77. double sum = 0;
  78. for (int j = 0; j < C[i]; j++)
  79. {
  80. sinux_x[j] = sin(theta[(int)B[i][j]]);
  81. cosinus_x[j] = cos(theta[(int)B[i][j]]);
  82. sinus_y[j] = sin(theta[i]);
  83. cosinus_y[j] = cos(theta[i]);
  84. }
  85.  
  86. for (int j = 0; j < C[i]; j++)
  87. {
  88. sum += sigma[i][(int)B[i][j]] * ( sinux_x[j] * cosinus_y[j] - cosinus_x[j] * sinus_y[j] );
  89. }
  90.  
  91. return omega[i] + sum;
  92. }*/
  93.  
  94. void RungeKutta(double dt, double theta[N], double theta_next[N])
  95. {
  96. double k[N][4];
  97.  
  98. // k1
  99. for (int i = 0; i < N; i++)
  100. k[i][0] = kuramoto(i, theta) * dt;
  101.  
  102. double theta_k1[N];
  103. for (int i = 0; i < N; i++)
  104. theta_k1[i] = theta[i] + k[i][0] / 2;
  105.  
  106. // k2
  107. for (int i = 0; i < N; i++)
  108. k[i][1] = kuramoto(i, theta_k1) * dt;
  109.  
  110. double theta_k2[N];
  111. for (int i = 0; i < N; i++)
  112. theta_k2[i] = theta[i] + k[i][1] / 2;
  113.  
  114. // k3
  115. for (int i = 0; i < N; i++)
  116. k[i][2] = kuramoto(i, theta_k2) * dt;
  117.  
  118. double theta_k3[N];
  119. for (int i = 0; i < N; i++)
  120. theta_k3[i] = theta[i] + k[i][2] / 2;
  121.  
  122. // k4
  123. for (int i = 0; i < N; i++)
  124. k[i][3] = kuramoto(i, theta_k3) * dt;
  125.  
  126. for (int i = 0; i < N; i++)
  127. theta_next[i] = theta[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  128. }
  129.  
  130. void CopyArray(double source[N], double target[N])
  131. {
  132. for (int i = 0; i < N; i++)
  133. target[i] = source[i];
  134. }
  135.  
  136. int GetLineIndex(int i)
  137. {
  138. return i / WireWidth;
  139. }
  140.  
  141. bool CheckSameLine(int i, int j)
  142. {
  143. return GetLineIndex(i) == GetLineIndex(j);
  144. }
  145.  
  146. bool CheckAdjacentLine(int i, int j)
  147. {
  148. return abs(GetLineIndex(i) - GetLineIndex(j)) == 1;
  149. }
  150.  
  151. bool IsWireNeighbors(int i, int j)
  152. {
  153. if (CheckSameLine(i, j) && (i == j - 1 || i == j + 1))
  154. return true;
  155.  
  156. if (i == j - WireWidth || i == j + WireWidth)
  157. return true;
  158.  
  159. if (CheckAdjacentLine(i, j))
  160. {
  161. if (i == j - WireWidth - 1)
  162. return true;
  163.  
  164. if (i == j - WireWidth + 1)
  165. return true;
  166.  
  167. if (i == j + WireWidth - 1)
  168. return true;
  169.  
  170. if (i == j + WireWidth + 1)
  171. return true;
  172. }
  173.  
  174. return false;
  175. }
  176.  
  177. void FillAMatrixZero()
  178. {
  179. for (int i = 0; i < N; i++)
  180. {
  181. for (int j = 0; j < N; j++)
  182. {
  183. A[i][j] = 0;
  184. }
  185. }
  186. }
  187.  
  188. void FillGlialWireMatrix()
  189. {
  190. for (int i = 0; i < NHalf; i++)
  191. {
  192. for (int j = 0; j < NHalf; j++)
  193. {
  194. if (i == j)
  195. {
  196. A[i][j] = 0;
  197. continue;
  198. }
  199.  
  200. if (i > j)
  201. {
  202. A[i][j] = A[j][i];
  203. continue;
  204. }
  205.  
  206. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  207. }
  208. }
  209. }
  210.  
  211. void FillNetworkWireMatrix()
  212. {
  213. for (int i = NHalf; i < N; i++)
  214. {
  215. for (int j = NHalf; j < N; j++)
  216. {
  217. if (i == j)
  218. {
  219. A[i][j] = 0;
  220. continue;
  221. }
  222.  
  223. if (i > j)
  224. {
  225. A[i][j] = A[j][i];
  226. continue;
  227. }
  228.  
  229. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  230. }
  231. }
  232. }
  233.  
  234. void RandomizeWireMatrix()
  235. {
  236. for (int i = NHalf; i < N; i++)
  237. {
  238. for (int j = NHalf; j < N; j++)
  239. {
  240. if (A[i][j] == 0)
  241. continue;
  242.  
  243. //if (i > j)
  244. // continue;
  245.  
  246. double x = RandomD(0, 1);
  247.  
  248. if (x > p)
  249. continue;
  250.  
  251. int rndJ;
  252. int rndI;
  253.  
  254. do
  255. {
  256. rndJ = RandomI(NHalf, N);
  257. rndI = RandomI(NHalf, N);
  258. } while (IsWireNeighbors(rndI, rndJ) || j == rndJ || i == rndI || A[rndI][rndJ] == 1);
  259.  
  260. A[i][j] = 0;
  261. A[j][i] = 0;
  262.  
  263. A[rndI][rndJ] = 1;
  264. A[rndJ][rndI] = 1;
  265. }
  266. }
  267. }
  268.  
  269. void FillRandomMatrix()
  270. {
  271. for (int k = 0; k < 4 * NHalf; k++)
  272. {
  273. int i, j;
  274.  
  275. do
  276. {
  277. i = RandomI(NHalf, N);
  278. j = RandomI(NHalf, N);
  279. } while ((i == j) || (A[i][j] == 1));
  280.  
  281. A[i][j] = 1;
  282. A[j][i] = 1;
  283. }
  284. }
  285.  
  286. void Connect(int i, int j)
  287. {
  288. A[i][j] = 1;
  289. A[j][i] = 1;
  290. }
  291.  
  292. void FillLayerConnectionMatrix()
  293. {
  294. //int min = 0;
  295. //int max = NHalf;
  296. //int layerOffset = NHalf;
  297.  
  298. int min = NHalf;
  299. int max = N;
  300. int layerOffset = -NHalf;
  301.  
  302. for (int i = min; i < max; i++)
  303. {
  304. int nextLayerIndex = i + layerOffset;
  305. Connect(i, nextLayerIndex);
  306.  
  307. int leftIndex = i - 1;
  308. if (leftIndex >= min && CheckSameLine(leftIndex, i))
  309. Connect(leftIndex, nextLayerIndex);
  310.  
  311. int rightIndex = i + 1;
  312. if (rightIndex < max && CheckSameLine(rightIndex, i))
  313. Connect(rightIndex, nextLayerIndex);
  314.  
  315. int upIndex = i - WireWidth;
  316. if (upIndex >= min)
  317. Connect(upIndex, nextLayerIndex);
  318.  
  319. int downIndex = i + WireWidth;
  320. if (downIndex < max)
  321. Connect(downIndex, nextLayerIndex);
  322.  
  323. int leftUpIndex = i - WireWidth - 1;
  324. if (leftUpIndex >= min && CheckAdjacentLine(leftUpIndex, i))
  325. Connect(leftUpIndex, nextLayerIndex);
  326.  
  327. int rightUpIndex = i - WireWidth + 1;
  328. if (rightUpIndex >= min && CheckAdjacentLine(rightUpIndex, i))
  329. Connect(rightUpIndex, nextLayerIndex);
  330.  
  331. int leftDownIndex = i + WireWidth - 1;
  332. if (leftDownIndex < max && CheckAdjacentLine(leftDownIndex, i))
  333. Connect(leftDownIndex, nextLayerIndex);
  334.  
  335. int rightDownIndex = i + WireWidth + 1;
  336. if (rightDownIndex < max && CheckAdjacentLine(rightDownIndex, i))
  337. Connect(rightDownIndex, nextLayerIndex);
  338. }
  339. }
  340.  
  341. void FillFullNetworkNeuronMatrix()
  342. {
  343. for (int i = NHalf; i < N; i++)
  344. {
  345. for (int j = NHalf; j < N; j++)
  346. {
  347. A[i][j] = 1;
  348. if (i == j)
  349. {
  350. A[i][j] = 0;
  351. }
  352. }
  353. }
  354. }
  355.  
  356. void FillsigmaMatrix()
  357. {
  358. for (int i = 0; i < N; i++)
  359. {
  360. for (int j = 0; j < N; j++)
  361. {
  362. if ((i >= 0 && i < NHalf) && (j >= 0 || j < NHalf))
  363. {
  364. sigma[i][j] = sigma_G;
  365. }
  366. if ((((i >= NHalf && i < N) && (j >= 0 && j < NHalf)) || ((i >= 0 && i < NHalf) && (j >= NHalf && j < N))))
  367. {
  368. sigma[i][j] = sigma_GN;
  369. }
  370. if ((i >= NHalf && i < N) && (j >= NHalf && j < N))
  371. {
  372. sigma[i][j] = sigma_N;
  373. }
  374. }
  375. }
  376. }
  377.  
  378. bool Approximately(double a, double b)
  379. {
  380. if (a < 0)
  381. a = -a;
  382.  
  383. if (b < 0)
  384. b = -b;
  385.  
  386. return a - b <= 0.000001;
  387. }
  388.  
  389. void FillBCMatrix()
  390. {
  391. for (int i = 0; i < N; i++)
  392. {
  393. int bIndex = 0;
  394. C[i] = 0;
  395. for (int j = 0; j < N; j++)
  396. {
  397. if (A[i][j] == 1)
  398. {
  399. B[i][bIndex] = j;
  400. bIndex++;
  401. C[i]++;
  402. }
  403. }
  404. }
  405. }
  406.  
  407. int main()
  408. {
  409. sigma_GN = sigma_G;
  410.  
  411. FILE *fp0;
  412. srand(time(NULL));
  413.  
  414. A = malloc(N * sizeof(double));
  415. for (int i = 0; i < N; i++)
  416. A[i] = malloc(N * sizeof(double));
  417.  
  418. B = malloc(N * sizeof(double));
  419. for (int i = 0; i < N; i++)
  420. B[i] = malloc(N * sizeof(double));
  421.  
  422. C = malloc(N * sizeof(double));
  423.  
  424. sigma = malloc(N * sizeof(double));
  425. for (int i = 0; i < N; i++)
  426. sigma[i] = malloc(N * sizeof(double));
  427.  
  428. omega = malloc(N * sizeof(double));
  429.  
  430. theta = malloc(N * sizeof(double));
  431.  
  432. // omega_init open for write. begin
  433. for (int i = 0; i < NHalf; i++)
  434. omega[i] = RandomD(omega_rand_glial_min, omega_rand_glial_max);
  435.  
  436. for (int i = NHalf; i < N; i++)
  437. omega[i] = RandomD(omega_rand_neuron_min, omega_rand_neuron_max);
  438.  
  439. fp0 = fopen("omega_init.txt", "w+");
  440. for (int i = 0; i < N; i++)
  441. {
  442. fprintf(fp0, "%f\n", omega[i]);
  443. }
  444. fclose(fp0);
  445. // omega_init open for write. end
  446.  
  447. // omega_init open for read. begin
  448. /*fp0 = fopen("omega_init.txt", "r");
  449. for (int i = 0; i < N; i++)
  450. {
  451. fscanf(fp0, "%lf", &omega[i]);
  452. }*/
  453. // omega_init open for read. end
  454.  
  455. // theta_init open for write. begin
  456. for (int i = 0; i < N; i++)
  457. theta[i] = RandomD(theta_rand_min, theta_rand_max);
  458.  
  459. fp0 = fopen("theta_init.txt", "w+");
  460. for (int i = 0; i < N; i++)
  461. {
  462. fprintf(fp0, "%f\n", theta[i]);
  463. }
  464. fclose(fp0);
  465. // theta_init open for write.end
  466.  
  467. // theta_init open for read. begin
  468. /*fp0 = fopen("theta_init.txt", "r");
  469. for (int i = 0; i < N; i++)
  470. {
  471. fscanf(fp0, "%lf", &theta[i]);
  472. }
  473. fclose(fp0);*/
  474. // theta_init open for read.end
  475.  
  476. fp0 = fopen("A.txt", "w+");
  477.  
  478. FillAMatrixZero();
  479. FillGlialWireMatrix();
  480. //FillNetworkWireMatrix();
  481. FillLayerConnectionMatrix();
  482. FillRandomMatrix();
  483. RandomizeWireMatrix();
  484.  
  485. FillBCMatrix();
  486.  
  487. for (int i = 0; i < N; i++)
  488. {
  489. for (int j = 0; j < N; j++)
  490. {
  491. /*printf("i: %d\n", i);
  492. printf("j: %d\n", j);
  493. printf("A: %d\n", A[i][j]);*/
  494. fprintf(fp0, "%d\t", (int)A[i][j]);
  495. }
  496. fprintf(fp0, "\n");
  497. }
  498. fclose(fp0);
  499.  
  500. fp0 = fopen("B.txt", "w+");
  501.  
  502. for (int i = 0; i < N; i++)
  503. {
  504. for (int j = 0; j < C[i]; j++)
  505. {
  506. fprintf(fp0, "%d\t", (int)B[i][j]);
  507. }
  508. fprintf(fp0, "\n");
  509. }
  510.  
  511. fclose(fp0);
  512.  
  513. fp0 = fopen("C.txt", "w+");
  514.  
  515. for (int i = 0; i < N; i++)
  516. {
  517. fprintf(fp0, "%d\n", (int)C[i]);
  518. }
  519.  
  520. fclose(fp0);
  521.  
  522. FillsigmaMatrix();
  523.  
  524. fp0 = fopen("sigma.txt", "w+");
  525. for (int i = 0; i < N; i++)
  526. {
  527. for (int j = 0; j < N; j++)
  528. {
  529. fprintf(fp0, "%f\t", sigma[i][j]);
  530. }
  531. fprintf(fp0, "\n");
  532. }
  533.  
  534. fclose(fp0);
  535.  
  536. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  537. fp0 = fopen("links.txt", "w+");
  538. for (int i = NHalf; i < N; i++)
  539. {
  540. int links_count = 0;
  541. for (int j = NHalf; j < N; j++)
  542. {
  543. if (A[i][j] == 1)
  544. {
  545. links_count++;
  546. }
  547. }
  548. fprintf(fp0, "%d\n", (int)links_count);
  549.  
  550. }
  551. fclose(fp0);
  552.  
  553. const double t_start = 0;
  554. const double t_max = 200; //2000
  555. const double dt = 0.05; //0.05
  556.  
  557. double t = t_start;
  558.  
  559. fp0 = fopen("results.txt", "w+");
  560. //setlocale(LC_NUMERIC, "French_Canada.1252");
  561.  
  562. clock_t start_rk4, end_rk4;
  563. start_rk4 = clock();
  564. int lastPercent = -1;
  565.  
  566. while (t < t_max || Approximately(t, t_max))
  567. {
  568. fprintf(fp0, "%f\t", t);
  569. for (int i = 0; i < N; i++)
  570. {
  571. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", theta[i]);
  572. }
  573. fprintf(fp0, "\n");
  574.  
  575. double theta_next[N];
  576.  
  577. RungeKutta(dt, theta, theta_next);
  578. CopyArray(theta_next, theta);
  579.  
  580. t += dt;
  581.  
  582. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  583. if (percent != lastPercent)
  584. {
  585. printf("Progress: %d%%\n", percent);
  586. lastPercent = percent;
  587. }
  588. }
  589.  
  590. fp0 = fopen("s_G_s_N_Delta_rho.txt", "a");
  591. fprintf(fp0, "%f\t%f\t", sigma_G, sigma_N);
  592. fclose(fp0);
  593.  
  594. end_rk4 = clock();
  595. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  596. int minutes = (int)extime_rk4 / 60;
  597. int seconds = (int)extime_rk4 % 60;
  598. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  599.  
  600. fclose(fp0);
  601.  
  602. fp0 = fopen("time_exec.txt", "w+");
  603. fprintf(fp0, "%f\n", extime_rk4);
  604. fclose(fp0);
  605.  
  606. for (int i = 0; i < N; i++)
  607. free(A[i]);
  608. free(A);
  609.  
  610. for (int i = 0; i < N; i++)
  611. free(B[i]);
  612. free(B);
  613.  
  614. for (int i = 0; i < N; i++)
  615. free(sigma[i]);
  616. free(sigma);
  617.  
  618. free(C);
  619.  
  620. free(omega);
  621.  
  622. free(theta);
  623.  
  624. }
Advertisement
Add Comment
Please, Sign In to add comment