SpaceQuester

Untitled

Feb 19th, 2017
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.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.  
  8. #define N 1000
  9. #define K 5
  10.  
  11. const int w_rand_glial_min = 3;
  12. const int w_rand_glial_max = 4;
  13.  
  14. const int w_rand_neuron_min = 5;
  15. const int w_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 w[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 w[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. void main()
  77. {
  78. srand(time(NULL));
  79.  
  80. for (int i = 0; i < N/2; i++)
  81. {
  82. w[i] = ((double)rand() / RAND_MAX) * (w_rand_glial_max - w_rand_glial_min) + w_rand_glial_min;
  83. }
  84.  
  85. for (int i = N/2 +1 ; i < N; i++)
  86. {
  87. w[i] = ((double)rand() / RAND_MAX) * (w_rand_neuron_max - w_rand_neuron_min) + w_rand_neuron_min;
  88. }
  89.  
  90. /*w[0] = 5;
  91. w[1] = 5;
  92. w[2] = 5;
  93. w[3] = 5;
  94. w[4] = 5;*/
  95.  
  96. for (int i = 0; i < N; i++)
  97. {
  98. theta[i] = ((double)rand() / RAND_MAX) * (theta_rand_max - theta_rand_min) + theta_rand_min;
  99. }
  100.  
  101. /*theta[0] = 0;
  102. theta[1] = M_PI / 2;
  103. theta[2] = M_PI;
  104. theta[3] = ((double)3 / 2) * M_PI;
  105. theta[4] = 2 * M_PI;*/
  106.  
  107. /*{
  108. A[0][0] = 0;
  109. A[0][1] = 1;
  110. A[0][2] = 0;
  111. A[0][3] = 0;
  112. A[0][4] = 1;
  113.  
  114. A[1][0] = 1;
  115. A[1][1] = 0;
  116. A[1][2] = 1;
  117. A[1][3] = 0;
  118. A[1][4] = 0;
  119.  
  120. A[2][0] = 0;
  121. A[2][1] = 1;
  122. A[2][2] = 0;
  123. A[2][3] = 1;
  124. A[2][4] = 0;
  125.  
  126. A[3][0] = 0;
  127. A[3][1] = 0;
  128. A[3][2] = 1;
  129. A[3][3] = 0;
  130. A[3][4] = 1;
  131.  
  132. A[4][0] = 1;
  133. A[4][1] = 0;
  134. A[4][2] = 0;
  135. A[4][3] = 1;
  136. A[4][4] = 0;
  137. }*/
  138.  
  139. /*{
  140. A[0][0] = 1;
  141. A[0][1] = 1;
  142. A[0][2] = 1;
  143. A[0][3] = 1;
  144. A[0][4] = 1;
  145.  
  146. A[1][0] = 1;
  147. A[1][1] = 1;
  148. A[1][2] = 1;
  149. A[1][3] = 1;
  150. A[1][4] = 1;
  151.  
  152. A[2][0] = 1;
  153. A[2][1] = 1;
  154. A[2][2] = 1;
  155. A[2][3] = 1;
  156. A[2][4] = 1;
  157.  
  158. A[3][0] = 1;
  159. A[3][1] = 1;
  160. A[3][2] = 1;
  161. A[3][3] = 1;
  162. A[3][4] = 1;
  163.  
  164. A[4][0] = 1;
  165. A[4][1] = 1;
  166. A[4][2] = 1;
  167. A[4][3] = 1;
  168. A[4][4] = 1;
  169. }*/
  170.  
  171. for (int i = 0; i < N; i++)
  172. {
  173. for (int j = 0; j < N; j++)
  174. {
  175. A[i][j] = 1;
  176. }
  177. }
  178.  
  179.  
  180. const double t_start = 0;
  181. const double t_max = 10;
  182. const double dt = 0.1;
  183.  
  184. double t = t_start;
  185.  
  186. FILE *fp;
  187. fp = fopen("results.txt", "w+");
  188. //setlocale(LC_NUMERIC, "French_Canada.1252");
  189.  
  190. while (t < t_max)
  191. {
  192. fprintf(fp, "%f\t", t);
  193. for (int i = 0; i < N; i++)
  194. {
  195. fprintf(fp, i == N - 1 ? "%f" : "%f\t", theta[i]);
  196. }
  197. fprintf(fp, "\n");
  198.  
  199. double theta_next[N];
  200.  
  201. RungeKutta(dt, theta, theta_next);
  202. CopyArray(theta_next, theta);
  203.  
  204. t += dt;
  205. printf("Progress: %d%%\n", (int)(100 * t / t_max));
  206. }
  207.  
  208. fclose(fp);
  209. }
Advertisement
Add Comment
Please, Sign In to add comment