SpaceQuester

Untitled

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