method.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. double* create_grid_even(int n, double a, double b) {
  5. double* h = malloc(sizeof(double) * n);
  6. if (h == NULL) {
  7. exit(16);
  8. }
  9. for (int i = 0; i < n;i++) {
  10. h[i] = a + ((b - a) / (n - 1)) * i;
  11. }
  12. return h;
  13. }
  14. double* euler_method(double y0, double a, double b, double(*f)(double,double),int n) {
  15. //(x[0], y0) - ďĺđâŕ˙, čěĺţůŕ˙ń˙ ó íŕń ňî÷ęŕ ňŕáëč÷íîé ôóíęöčč
  16. double h = (b-a)/(n-1);
  17. double* y = malloc(sizeof(double) * n);
  18. if (y == NULL) {
  19. exit(16);
  20. }
  21. y[0] = y0;
  22. for (int i = 0;i < n-1;i++) {
  23. y[i + 1] = y[i] + h * f(a + i*h, y[i]);
  24. }
  25. return y;
  26. }
  27. double max_dif(double* r2, double* r1,int n) {
  28. double m = 0;
  29. double dif;
  30. for (int i = 0;i < (int)n/2-1;i++) {
  31. dif = fabs(r2[2 * i + 2] - r1[i + 1]);
  32. if (m < dif) {
  33. m = dif;
  34. }
  35. }
  36. return m;
  37. }
  38. double** runge(double eps, double y0, double a, double b, double(*f)(double, double), int* n_, int* len_h) {
  39. double* x = malloc(sizeof(double));
  40. double* y = malloc(sizeof(double));
  41. long double* h_all = malloc(sizeof(long double));// đĺăčńňđčđóĺň âńĺ çíŕ÷ĺíč˙ řŕăîâ
  42. long double* h_made = malloc(sizeof(long double));// đĺăčńňđčđóĺň çíŕ÷ĺíč˙ řŕăŕ, ńîîňâĺňńňâóţůčĺ ńäĺëŕíűě řŕăŕě
  43. long double h = (b - a) / 2;
  44. y[0] = y0;
  45. x[0] = a;
  46. h_all[0] = h;
  47. double y_i_1 = 0;
  48. double y_i_2 = 0;
  49. double y_i_2_2 = 0;
  50. int k = 1, i = 1;
  51. double f_prev,dif;
  52. printf("eps = %e\n", eps);
  53. eps = pow(eps, (double)3 / 2);
  54. while (x[i-1] + h <= b) {
  55. h_all = realloc(h_all, sizeof(long double) * (k + 1));
  56. h_all[k] = h;
  57. // ďîäőîä, ęîňîđűé ˙ îńňŕâčë íčćĺ â ęîěěĺíňĺ äë˙ äîńňčćĺíč˙ çŕäŕííîé ňî÷íîńňč íĺ ńîâńĺě ďîäőîäčň: äë˙ îňíîńčňĺëüíî áîëüřîăî çíŕ÷ĺíč˙ řŕăŕ çíŕ÷ĺíč˙ ňŕáëč÷íîé ôóíęöčč ďî÷ňč íĺ ěĺí˙ţňń˙
  58. /*f_prev = f(a + (i - 1) * h, y[i - 1]);
  59. y_i_1 = y[i - 1] + h * f_prev;
  60. y_i_2 = y[i - 1] + (h / 2) * f_prev;
  61. y_i_2_2 = y_i_2 + (h / 2) * f(a + (i - 1 / 2) * h, y_i_2);*/
  62. // âěĺńňî íĺăî ďîëüçóţńü ďîäőîäîě íčćĺ: ńđŕâíčâŕţ çíŕ÷ĺíčĺ đĺřĺíč˙ ěĺňîäŕ áĺç đŕçáčĺíč˙ č ń đŕçáčĺíčĺě íŕ 9 ňî÷ĺę (h -> h/8)
  63. y_i_1 = euler_method(y[i - 1], x[i-1], x[i-1]+h, f, 2)[1];
  64. y_i_2_2 = euler_method(y[i - 1], x[i - 1], x[i - 1] + h, f, 9)[8];
  65. dif = fabs(y_i_2_2 - y_i_1);
  66. if (dif > eps) {
  67. // ňŕęćĺ, äë˙ óńęîđĺíč˙ đŕáîňű ěĺňîäŕ h äĺëţ íŕ 8 â ńëó÷ŕĺ íĺâűďîëíĺíč˙ óńëîâč˙
  68. h = h/8;
  69. }
  70. else if (dif < eps/100) {
  71. x = realloc(x, sizeof(double) * (i + 1));
  72. x[i] = x[i - 1] + h;
  73. y = realloc(y, sizeof(double) * (i + 1));
  74. y[i] = y_i_2_2;
  75. h_made = realloc(h_made, sizeof(long double) * (i + 1));
  76. h_made[i - 1] = h;
  77. if (x[i] + h * 2 <= b) {
  78. h *= 2;
  79. }
  80. i += 1;
  81. }//řŕă âűďîëíĺí, óäâŕčâŕĺňń˙
  82. else if(dif < eps) {
  83. x = realloc(x, sizeof(double) * (i + 1));
  84. x[i] = x[i-1] + h;
  85. y = realloc(y, sizeof(double) * (i + 1));
  86. y[i] = y_i_2_2;
  87. h_made = realloc(h_made, sizeof(long double) * (i + 1));
  88. h_made[i - 1] = h;
  89. i += 1;
  90. }//řŕă âűďîëíĺí, íĺ čçěĺí˙ĺňń˙
  91. k++;
  92. }
  93. h_all[k-1] = h;
  94. h_made[i - 1] = h;
  95. *len_h = k;
  96. *n_ = i;
  97. double** ans = malloc(sizeof(double*) * 4);
  98. ans[0] = x;
  99. ans[1] = y;
  100. ans[2] = h_all;
  101. ans[3] = h_made;
  102. return ans;
  103. }
  104. double uglify_initial(double initial, int max_procent,int min_procent) {
  105. double procent = min_procent + (double)(max_procent-min_procent)*((double)rand()/(RAND_MAX));
  106. return initial - procent * initial / 100;
  107. }