Advertisement
SpaceQuester

Untitled

Feb 20th, 2017
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 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.  
  8. #define N 4000
  9. #define K 10
  10.  
  11. const int omega_rand_glial_min = 0;
  12. const int omega_rand_glial_max = 1;
  13.  
  14. const int omega_rand_neuron_min = 5;
  15. const int omega_rand_neuron_max = 6;
  16.  
  17. const int theta_rand_min = 0;
  18. const int theta_rand_max = 2 * M_PI;
  19.  
  20. double A[N][N];
  21. double omega[N];
  22. double theta[N];
  23.  
  24. double kuramoto(int i, double theta[N])
  25. {
  26. double sum = 0;
  27.  
  28. for (int j = 0; j < N; j++)
  29. sum += A[i][j] * sin(theta[j] - theta[i]);
  30.  
  31. return omega[i] + sum * (double)K / N;
  32. }
  33.  
  34. void RungeKutta(double dt, double theta[N], double theta_next[N])
  35. {
  36. double k[N][4];
  37.  
  38. // k1
  39. for (int i = 0; i < N; i++)
  40. k[i][0] = kuramoto(i, theta) * dt;
  41.  
  42. double theta_k1[N];
  43. for (int i = 0; i < N; i++)
  44. theta_k1[i] = theta[i] + k[i][0] / 2;
  45.  
  46. // k2
  47. for (int i = 0; i < N; i++)
  48. k[i][1] = kuramoto(i, theta_k1) * dt;
  49.  
  50. double theta_k2[N];
  51. for (int i = 0; i < N; i++)
  52. theta_k2[i] = theta[i] + k[i][1] / 2;
  53.  
  54. // k3
  55. for (int i = 0; i < N; i++)
  56. k[i][2] = kuramoto(i, theta_k2) * dt;
  57.  
  58. double theta_k3[N];
  59. for (int i = 0; i < N; i++)
  60. theta_k3[i] = theta[i] + k[i][2] / 2;
  61.  
  62. // k4
  63. for (int i = 0; i < N; i++)
  64. k[i][3] = kuramoto(i, theta_k3) * dt;
  65.  
  66. for (int i = 0; i < N; i++)
  67. theta_next[i] = theta[i] + (k[i][0] + 2 * k[i][1] + 2 * k[i][2] + k[i][3]) / 6;
  68. }
  69.  
  70. void CopyArray(double source[N], double target[N])
  71. {
  72. for (int i = 0; i < N; i++)
  73. target[i] = source[i];
  74. }
  75.  
  76. int main()
  77. {
  78. srand(time(NULL));
  79.  
  80. for (int i = 0; i < N/2; i++)
  81. {
  82. omega[i] = ((double)rand() / RAND_MAX) * (omega_rand_glial_max - omega_rand_glial_min) + omega_rand_glial_min;
  83. }
  84.  
  85. for (int i = N/2; i < N; i++)
  86. {
  87. omega[i] = ((double)rand() / RAND_MAX) * (omega_rand_neuron_max - omega_rand_neuron_min) + omega_rand_neuron_min;
  88. }
  89.  
  90. for (int i = 0; i < N; i++)
  91. {
  92. theta[i] = ((double)rand() / RAND_MAX) * (theta_rand_max - theta_rand_min) + theta_rand_min;
  93. }
  94.  
  95. //Зачищаем матрицу до нулей
  96. for (int i = 0; i < N; i++)
  97. {
  98. for (int j = 0; j < N; j++)
  99. {
  100. A[i][j] = 0;
  101. }
  102. }
  103.  
  104. //Накидываем 2*N связей в обе стороны
  105. for (int k = 0; k < 2*N; k++)
  106. {
  107. int i = ((double)rand() / RAND_MAX) * N;
  108. int j = ((double)rand() / RAND_MAX) * N;
  109. A[i][j] = 1;
  110. A[j][i] = 1;
  111. }
  112.  
  113. //Считаем связи и пишем в матрицу
  114. FILE *fp0;
  115. fp0 = fopen("A.txt", "w+");
  116. for (int i = 0; i < N; i++)
  117. {
  118. for (int j = 0; j < N; j++)
  119. {
  120. if (i == j)
  121. {
  122. A[i][j] = 0;
  123. }
  124. fprintf(fp0, "%d\t", (int)A[i][j]);
  125. }
  126. fprintf(fp0, "\n");
  127. }
  128. fclose(fp0);
  129.  
  130. //Пишем в файл число связей у каждого осциллятора
  131. FILE *fp3;
  132. fp3 = fopen("links.txt", "w+");
  133. for (int i = 0; i < N; i++)
  134. {
  135. int links_count = 0;
  136. for (int j = 0; j < N; j++)
  137. {
  138. if (A[i][j] == 1)
  139. {
  140. links_count++;
  141. }
  142. }
  143. fprintf(fp3, "%d\t", (int)links_count);
  144. fprintf(fp3, "\n");
  145. }
  146. fclose(fp3);
  147.  
  148. const double t_start = 0;
  149. const double t_max = 100;
  150. const double dt = 0.5;
  151.  
  152. double t = t_start;
  153.  
  154. FILE *fp1;
  155. fp1 = fopen("omega.txt", "w+");
  156. for (int i = 0; i < N; i++)
  157. {
  158. fprintf(fp1, "%f\n", omega[i]);
  159. }
  160. fclose(fp1);
  161.  
  162. FILE *fp2;
  163. fp2 = fopen("results.txt", "w+");
  164. //setlocale(LC_NUMERIC, "French_Canada.1252");
  165.  
  166. while (t < t_max + dt)
  167. {
  168. fprintf(fp2, "%f\t", t);
  169. for (int i = 0; i < N; i++)
  170. {
  171. fprintf(fp2, i == N - 1 ? "%f" : "%f\t", theta[i]);
  172. }
  173. fprintf(fp2, "\n");
  174.  
  175. double theta_next[N];
  176.  
  177. RungeKutta(dt, theta, theta_next);
  178. CopyArray(theta_next, theta);
  179.  
  180. t += dt;
  181. //printf("Progress: %d%%\n", (int)(100 * (t - t_start) / (t_max - t_start)));
  182. }
  183.  
  184. fclose(fp2);
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement