SpaceQuester

Untitled

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