Advertisement
SpaceQuester

Untitled

Mar 15th, 2017
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.77 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;
  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 omega[N];
  25. double theta[N];
  26. double sigma[N];
  27.  
  28. int RandomI(int min, int max)
  29. {
  30. return ((double)rand() / (RAND_MAX - 1)) * (max - min) + min;
  31. }
  32.  
  33. double RandomD(double min, double max)
  34. {
  35. return ((double)rand() / RAND_MAX) * (max - min) + min;
  36. }
  37.  
  38. double kuramoto(int i, double theta[N])
  39. {
  40. double sum = 0;
  41.  
  42. for (int j = 0; j < N; j++)
  43. {
  44. sum += A[i][j] * sin(theta[j] - theta[i]);
  45. }
  46.  
  47. return omega[i] + (double)sigma[i] * sum;
  48. }
  49.  
  50. void RungeKutta(double dt, double theta[N], double theta_next[N])
  51. {
  52. double k[N][4];
  53.  
  54. // k1
  55. for (int i = 0; i < N; i++)
  56. k[i][0] = kuramoto(i, theta) * dt;
  57.  
  58. double theta_k1[N];
  59. for (int i = 0; i < N; i++)
  60. theta_k1[i] = theta[i] + k[i][0] / 2;
  61.  
  62. // k2
  63. for (int i = 0; i < N; i++)
  64. k[i][1] = kuramoto(i, theta_k1) * dt;
  65.  
  66. double theta_k2[N];
  67. for (int i = 0; i < N; i++)
  68. theta_k2[i] = theta[i] + k[i][1] / 2;
  69.  
  70. // k3
  71. for (int i = 0; i < N; i++)
  72. k[i][2] = kuramoto(i, theta_k2) * dt;
  73.  
  74. double theta_k3[N];
  75. for (int i = 0; i < N; i++)
  76. theta_k3[i] = theta[i] + k[i][2] / 2;
  77.  
  78. // k4
  79. for (int i = 0; i < N; i++)
  80. k[i][3] = kuramoto(i, theta_k3) * dt;
  81.  
  82. for (int i = 0; i < N; i++)
  83. theta_next[i] = theta[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  84. }
  85.  
  86. void CopyArray(double source[N], double target[N])
  87. {
  88. for (int i = 0; i < N; i++)
  89. target[i] = source[i];
  90. }
  91.  
  92. bool CheckSameLine(int i, int j)
  93. {
  94. return i / WireWidth == j / WireWidth;
  95. }
  96.  
  97. bool IsWireNeighbors(int i, int j)
  98. {
  99. if (CheckSameLine(i, j) && (i == j - 1 || i == j + 1))
  100. return true;
  101.  
  102. if (i == j - WireWidth || i == j + WireWidth)
  103. return true;
  104.  
  105. return false;
  106. }
  107.  
  108. void FillWireMatrix()
  109. {
  110. for (int i = 0; i < NHalf; i++)
  111. {
  112. for (int j = 0; j < NHalf; j++)
  113. {
  114. if (i == j)
  115. {
  116. A[i][j] = 0;
  117. continue;
  118. }
  119.  
  120. if (i > j)
  121. {
  122. A[i][j] = A[j][i];
  123. continue;
  124. }
  125.  
  126. A[i][j] = IsWireNeighbors(i, j) ? 1 : 0;
  127. }
  128. }
  129. }
  130.  
  131. void FillRandomMatrix()
  132. {
  133. for (int k = 0; k < N; k++)
  134. {
  135. int i, j;
  136.  
  137. do
  138. {
  139. i = RandomI(NHalf, N);
  140. j = RandomI(NHalf, N);
  141. } while (i == j);
  142.  
  143. A[i][j] = 1;
  144. A[j][i] = 1;
  145. }
  146. }
  147.  
  148. void Connect(int i, int j)
  149. {
  150. A[i][j] = 1;
  151. A[j][i] = 1;
  152. }
  153.  
  154. void FillLayerConnectionMatrix()
  155. {
  156. //int min = 0;
  157. //int max = NHalf;
  158. //int layerOffset = NHalf;
  159.  
  160. int min = NHalf;
  161. int max = N;
  162. int layerOffset = -NHalf;
  163.  
  164. for (int i = min; i < max; i++)
  165. {
  166. int nextLayerIndex = i + layerOffset;
  167. Connect(i, nextLayerIndex);
  168.  
  169. int leftIndex = i - 1;
  170. if (leftIndex >= min && CheckSameLine(leftIndex, i))
  171. Connect(leftIndex, nextLayerIndex);
  172.  
  173. int rightIndex = i + 1;
  174. if (rightIndex < max && CheckSameLine(rightIndex, i))
  175. Connect(rightIndex, nextLayerIndex);
  176.  
  177. int upIndex = i - WireWidth;
  178. if (upIndex >= min)
  179. Connect(upIndex, nextLayerIndex);
  180.  
  181. int downIndex = i + WireWidth;
  182. if (downIndex < max)
  183. Connect(downIndex, nextLayerIndex);
  184. }
  185. }
  186.  
  187. int main()
  188. {
  189. srand(time(NULL));
  190.  
  191. for (int i = 0; i < N / 2; i++)
  192. omega[i] = RandomD(omega_rand_glial_min, omega_rand_glial_max);
  193.  
  194. for (int i = N / 2; i < N; i++)
  195. omega[i] = RandomD(omega_rand_neuron_min, omega_rand_neuron_max);
  196.  
  197. for (int i = 0; i < N / 2; i++)
  198. sigma[i] = 1.900;
  199.  
  200. for (int i = N / 2; i < N; i++)
  201. sigma[i] = 1.900;
  202.  
  203. for (int i = 0; i < N; i++)
  204. theta[i] = RandomD(theta_rand_min, theta_rand_max);
  205.  
  206. FILE *fp0;
  207. fp0 = fopen("A.txt", "w+");
  208.  
  209. FillWireMatrix();
  210. FillRandomMatrix();
  211. //FillLayerConnectionMatrix();
  212.  
  213. for (int i = 0; i < N; i++)
  214. {
  215. for (int j = 0; j < N; j++)
  216. {
  217. /*printf("i: %d\n", i);
  218. printf("j: %d\n", j);
  219. printf("A: %d\n", A[i][j]);*/
  220. fprintf(fp0, "%d\t", (int)A[i][j]);
  221. }
  222. fprintf(fp0, "\n");
  223. }
  224. fclose(fp0);
  225.  
  226. //Пишем в файл число связей у каждого осциллятора в четвертом квадранте
  227. FILE *fp3;
  228. fp3 = fopen("links.txt", "w+");
  229. for (int i = NHalf; i < N; i++)
  230. {
  231. int links_count = 0;
  232. for (int j = NHalf; j < N; j++)
  233. {
  234. if (A[i][j] == 1)
  235. {
  236. links_count++;
  237. }
  238. }
  239. fprintf(fp3, "%d\n", (int)links_count);
  240.  
  241. }
  242. fclose(fp3);
  243.  
  244. const double t_start = 0;
  245. const double t_max = 10; //2000
  246. const double dt = 0.05; //0.05
  247.  
  248. double t = t_start;
  249.  
  250. FILE *fp1;
  251. fp1 = fopen("omega.txt", "w+");
  252. for (int i = 0; i < N; i++)
  253. {
  254. fprintf(fp1, "%f\n", omega[i]);
  255. }
  256. fclose(fp1);
  257.  
  258. FILE *fp2;
  259. fp2 = fopen("results.txt", "w+");
  260. //setlocale(LC_NUMERIC, "French_Canada.1252");
  261.  
  262. clock_t start_rk4, end_rk4;
  263. start_rk4 = clock();
  264.  
  265. while (t < t_max + dt)
  266. {
  267. fprintf(fp2, "%f\t", t);
  268. for (int i = 0; i < N; i++)
  269. {
  270. fprintf(fp2, i == N - 1 ? "%f" : "%f\t", theta[i]);
  271. }
  272. fprintf(fp2, "\n");
  273.  
  274. double theta_next[N];
  275.  
  276. RungeKutta(dt, theta, theta_next);
  277. CopyArray(theta_next, theta);
  278.  
  279. t += dt;
  280. printf("Progress: %d%%\n", (int)(100 * (t - t_start) / (t_max - t_start)));
  281. }
  282.  
  283. end_rk4 = clock();
  284. double extime_rk4 = (double)(end_rk4 - start_rk4) / CLOCKS_PER_SEC;
  285. printf("\nExecution time is %f seconds\n ", extime_rk4);
  286.  
  287.  
  288. fclose(fp2);
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement