SpaceQuester

Untitled

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