Advertisement
SpaceQuester

Untitled

Jul 20th, 2017
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.31 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.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 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 FillGlialWireMatrix()
  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 FilNetworklWireMatrix()
  185. {
  186. for (int i = NHalf; i < N; i++)
  187. {
  188. for (int j = NHalf; j < N; j++)
  189. {
  190. if (i == j)
  191. {
  192. A[i][j] = 0;
  193. continue;
  194. }
  195.  
  196. if (i > j)
  197. {
  198. A[i][j] = A[j][i];
  199. continue;
  200. }
  201.  
  202. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  203. }
  204. }
  205. }
  206.  
  207. void FillRandomMatrix()
  208. {
  209. for (int k = 0; k < 2 * NHalf; k++)
  210. {
  211. int i, j;
  212.  
  213. do
  214. {
  215. i = RandomI(NHalf, N);
  216. j = RandomI(NHalf, N);
  217. } while ((i == j) || (A[i][j] == 1));
  218.  
  219. A[i][j] = 1;
  220. A[j][i] = 1;
  221. }
  222. }
  223.  
  224. void Connect(int i, int j)
  225. {
  226. A[i][j] = 1;
  227. A[j][i] = 1;
  228. }
  229.  
  230. void FillLayerConnectionMatrix()
  231. {
  232. //int min = 0;
  233. //int max = NHalf;
  234. //int layerOffset = NHalf;
  235.  
  236. int min = NHalf;
  237. int max = N;
  238. int layerOffset = -NHalf;
  239.  
  240. for (int i = min; i < max; i++)
  241. {
  242. int nextLayerIndex = i + layerOffset;
  243. Connect(i, nextLayerIndex);
  244.  
  245. int leftIndex = i - 1;
  246. if (leftIndex >= min && CheckSameLine(leftIndex, i))
  247. Connect(leftIndex, nextLayerIndex);
  248.  
  249. int rightIndex = i + 1;
  250. if (rightIndex < max && CheckSameLine(rightIndex, i))
  251. Connect(rightIndex, nextLayerIndex);
  252.  
  253. int upIndex = i - WireWidth;
  254. if (upIndex >= min)
  255. Connect(upIndex, nextLayerIndex);
  256.  
  257. int downIndex = i + WireWidth;
  258. if (downIndex < max)
  259. Connect(downIndex, nextLayerIndex);
  260. }
  261. }
  262.  
  263. void FillFullNetworkNeuronMatrix()
  264. {
  265. for (int i = NHalf; i < N; i++)
  266. {
  267. for (int j = NHalf; j < N; j++)
  268. {
  269. A[i][j] = 1;
  270. if (i == j)
  271. {
  272. A[i][j] = 0;
  273. }
  274. }
  275. }
  276. }
  277.  
  278. void FillsigmaMatrix()
  279. {
  280. for (int i = 0; i < N; i++)
  281. {
  282. for (int j = 0; j < N; j++)
  283. {
  284. if ((i >= 0 && i < NHalf) && (j >= 0 || j < NHalf))
  285. {
  286. sigma[i][j] = sigma_G;
  287. }
  288. if ((((i >= NHalf && i < N) && (j >= 0 && j < NHalf)) || ((i >= 0 && i < NHalf) && (j >= NHalf && j < N))))
  289. {
  290. sigma[i][j] = sigma_GN;
  291. }
  292. if ((i >= NHalf && i < N) && (j >= NHalf && j < N))
  293. {
  294. sigma[i][j] = sigma_N;
  295. }
  296. }
  297. }
  298. }
  299.  
  300. bool Approximately(double a, double b)
  301. {
  302. if (a < 0)
  303. a = -a;
  304.  
  305. if (b < 0)
  306. b = -b;
  307.  
  308. return a - b <= 0.000001;
  309. }
  310.  
  311. void FillBCMatrix()
  312. {
  313. for (int i = 0; i < N; i++)
  314. {
  315. int bIndex = 0;
  316. C[i] = 0;
  317. for (int j = 0; j < N; j++)
  318. {
  319. if (A[i][j] == 1)
  320. {
  321. B[i][bIndex] = j;
  322. bIndex++;
  323. C[i]++;
  324. }
  325. }
  326. }
  327. }
  328.  
  329. int main()
  330. {
  331. sigma_GN = sigma_G;
  332.  
  333. FILE *fp0;
  334. srand(time(NULL));
  335.  
  336. A = malloc(N * sizeof(double));
  337. for (int i = 0; i < N; i++)
  338. A[i] = malloc(N * sizeof(double));
  339.  
  340. B = malloc(N * sizeof(double));
  341. for (int i = 0; i < N; i++)
  342. B[i] = malloc(N * sizeof(double));
  343.  
  344. C = malloc(N * sizeof(double));
  345.  
  346. sigma = malloc(N * sizeof(double));
  347. for (int i = 0; i < N; i++)
  348. sigma[i] = malloc(N * sizeof(double));
  349.  
  350. omega = malloc(N * sizeof(double));
  351.  
  352. theta = malloc(N * sizeof(double));
  353.  
  354. // omega_init open for write. begin
  355. for (int i = 0; i < NHalf; i++)
  356. omega[i] = RandomD(omega_rand_glial_min, omega_rand_glial_max);
  357.  
  358. for (int i = NHalf; i < N; i++)
  359. omega[i] = RandomD(omega_rand_neuron_min, omega_rand_neuron_max);
  360.  
  361. fp0 = fopen("omega_init.txt", "w+");
  362. for (int i = 0; i < N; i++)
  363. {
  364. fprintf(fp0, "%f\n", omega[i]);
  365. }
  366. fclose(fp0);
  367. // omega_init open for write. end
  368.  
  369. // omega_init open for read. begin
  370. /*fp0 = fopen("omega_init.txt", "r");
  371. for (int i = 0; i < N; i++)
  372. {
  373. fscanf(fp0, "%lf", &omega[i]);
  374. }*/
  375. // omega_init open for read. end
  376.  
  377. // theta_init open for write. begin
  378. for (int i = 0; i < N; i++)
  379. theta[i] = RandomD(theta_rand_min, theta_rand_max);
  380.  
  381. fp0 = fopen("theta_init.txt", "w+");
  382. for (int i = 0; i < N; i++)
  383. {
  384. fprintf(fp0, "%f\n", theta[i]);
  385. }
  386. fclose(fp0);
  387. // theta_init open for write.end
  388.  
  389. // theta_init open for read. begin
  390. /*fp0 = fopen("theta_init.txt", "r");
  391. for (int i = 0; i < N; i++)
  392. {
  393. fscanf(fp0, "%lf", &theta[i]);
  394. }
  395. fclose(fp0);*/
  396. // theta_init open for read.end
  397.  
  398. fp0 = fopen("A.txt", "w+");
  399.  
  400. FillAMatrixZero();
  401. FillGlialWireMatrix();
  402. FilNetworklWireMatrix();
  403. FillLayerConnectionMatrix();
  404.  
  405. FillBCMatrix();
  406.  
  407. for (int i = 0; i < N; i++)
  408. {
  409. for (int j = 0; j < N; j++)
  410. {
  411. /*printf("i: %d\n", i);
  412. printf("j: %d\n", j);
  413. printf("A: %d\n", A[i][j]);*/
  414. fprintf(fp0, "%d\t", (int)A[i][j]);
  415. }
  416. fprintf(fp0, "\n");
  417. }
  418. fclose(fp0);
  419.  
  420. fp0 = fopen("B.txt", "w+");
  421.  
  422. for (int i = 0; i < N; i++)
  423. {
  424. for (int j = 0; j < C[i]; j++)
  425. {
  426. fprintf(fp0, "%d\t", (int)B[i][j]);
  427. }
  428. fprintf(fp0, "\n");
  429. }
  430.  
  431. fclose(fp0);
  432.  
  433. fp0 = fopen("C.txt", "w+");
  434.  
  435. for (int i = 0; i < N; i++)
  436. {
  437. fprintf(fp0, "%d\n", (int)C[i]);
  438. }
  439.  
  440. fclose(fp0);
  441.  
  442. FillsigmaMatrix();
  443.  
  444. fp0 = fopen("sigma.txt", "w+");
  445. for (int i = 0; i < N; i++)
  446. {
  447. for (int j = 0; j < N; j++)
  448. {
  449. fprintf(fp0, "%f\t", sigma[i][j]);
  450. }
  451. fprintf(fp0, "\n");
  452. }
  453.  
  454. fclose(fp0);
  455.  
  456. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  457. /*fp0 = fopen("links.txt", "w+");
  458. for (int i = NHalf; i < N; i++)
  459. {
  460. int links_count = 0;
  461. for (int j = NHalf; j < N; j++)
  462. {
  463. if (A[i][j] == 1)
  464. {
  465. links_count++;
  466. }
  467. }
  468. fprintf(fp0, "%d\n", (int)links_count);
  469.  
  470. }
  471. fclose(fp0);*/
  472.  
  473. const double t_start = 0;
  474. const double t_max = 200; //2000
  475. const double dt = 0.05; //0.05
  476.  
  477. double t = t_start;
  478.  
  479. fp0 = fopen("results.txt", "w+");
  480. //setlocale(LC_NUMERIC, "French_Canada.1252");
  481.  
  482. clock_t start_rk4, end_rk4;
  483. start_rk4 = clock();
  484. int lastPercent = -1;
  485.  
  486. while (t < t_max || Approximately(t, t_max))
  487. {
  488. fprintf(fp0, "%f\t", t);
  489. for (int i = 0; i < N; i++)
  490. {
  491. fprintf(fp0, i == N - 1 ? "%f" : "%f\t", theta[i]);
  492. }
  493. fprintf(fp0, "\n");
  494.  
  495. double theta_next[N];
  496.  
  497. RungeKutta(dt, theta, theta_next);
  498. CopyArray(theta_next, theta);
  499.  
  500. t += dt;
  501.  
  502. int percent = (int)(100 * (t - t_start) / (t_max - t_start));
  503. if (percent != lastPercent)
  504. {
  505. printf("Progress: %d%%\n", percent);
  506. lastPercent = percent;
  507. }
  508. }
  509.  
  510. fp0 = fopen("s_G_s_N_Delta_rho.txt", "a");
  511. fprintf(fp0, "%f\t%f\t", sigma_G, sigma_N);
  512. fclose(fp0);
  513.  
  514. end_rk4 = clock();
  515. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  516. int minutes = (int)extime_rk4 / 60;
  517. int seconds = (int)extime_rk4 % 60;
  518. printf("\nExecution time is: %d minutes %d seconds\n ", minutes, seconds);
  519.  
  520. fclose(fp0);
  521.  
  522. fp0 = fopen("time_exec.txt", "w+");
  523. fprintf(fp0, "%f\n", extime_rk4);
  524. fclose(fp0);
  525.  
  526. for (int i = 0; i < N; i++)
  527. free(A[i]);
  528. free(A);
  529.  
  530. for (int i = 0; i < N; i++)
  531. free(B[i]);
  532. free(B);
  533.  
  534. for (int i = 0; i < N; i++)
  535. free(sigma[i]);
  536. free(sigma);
  537.  
  538. free(C);
  539.  
  540. free(omega);
  541.  
  542. free(theta);
  543.  
  544. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement