method.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <Windows.h>
  6. #include "header.h"
  7. vector* find_initials(double A, double alpha_0, double alpha_1) {
  8. vector u = { alpha_0*A/(pow(alpha_0,2)+ pow(alpha_1,2)),alpha_1*A / (pow(alpha_0,2) + pow(alpha_1,2)) };
  9. vector v = { alpha_1,-alpha_0 };
  10. vector* ans= malloc(sizeof(vector)*2);
  11. ans[0] = u;
  12. ans[1] = v;
  13. return ans;
  14. }
  15. vector* euler_method(vector y0, double a, double b, vector(*F)(double, vector), int n) {
  16. //(x[0], y0) - ïåðâàÿ, èìåþùàÿñÿ ó íàñ òî÷êà òàáëè÷íîé ôóíêöèè
  17. double h = (b - a) / (n - 1);
  18. vector* y = malloc(sizeof(vector) * n);
  19. if (y == NULL) {
  20. exit(16);
  21. }
  22. y[0] = y0;
  23. for (int i = 0;i < n - 1;i++) {
  24. vector res = F(a + i * h, y[i]);
  25. y[i + 1].y1 = y[i].y1 + h * res.y1;
  26. y[i + 1].y2 = y[i].y2 + h * res.y2;
  27. }
  28. return y;
  29. }
  30. double* solve(vector* initials,double betta_0,double betta_1, double B,double a,double b,vector(*F)(double, vector), vector(*F_0)(double, vector),int n) {
  31. vector u0 = initials[0];
  32. vector v0 = initials[1];
  33. vector* u = euler_method(u0, a, b, F, n);
  34. vector* v = euler_method(v0, a, b, F_0, n);
  35. double* y = malloc(sizeof(double) * n);
  36. double C = (B - betta_0 * u[n - 1].y1 - betta_1 * u[n - 1].y2) / (betta_0 * v[n - 1].y1 + betta_1 * v[n - 1].y2);
  37. for (int i = 0;i < n;i++) {
  38. y[i] = u[i].y1 + C * v[i].y1;
  39. }
  40. return y;
  41. }
  42. double** solve_runge(vector* initials, double betta_0, double betta_1, double B, double a, double b, vector(*F)(double, vector), vector(*F_0)(double, vector), double eps, int* n_, int* len_h){
  43. printf("eps = %e\n", eps);
  44. double* x = malloc(sizeof(double));
  45. long double* h_all = malloc(sizeof(long double));// ðåãèñòðèðóåò âñå çíà÷åíèÿ øàãîâ
  46. long double* h_made = malloc(sizeof(long double));// ðåãèñòðèðóåò çíà÷åíèÿ øàãà, ñîîòâåòñòâóþùèå ñäåëàíûì
  47. long double h = (b - a) / 2;
  48. x[0] = a;
  49. h_all[0] = h;
  50. vector res;
  51. double c1,c2;
  52. vector *u1 = malloc(sizeof(vector)*2), * v1 = malloc(sizeof(vector) * 2), u2, v2;
  53. u1[0] = initials[0];
  54. v1[0] = initials[1];
  55. u2 = initials[0];
  56. v2 = initials[1];
  57. int i = 1, k = 1, n = 10000;
  58. vector* u = malloc(sizeof(vector));
  59. vector* v = malloc(sizeof(vector));
  60. u[0] = initials[0];
  61. v[0] = initials[1];
  62. eps = pow(eps, 3.0/2);
  63. double difu,difv,dif;
  64. while (x[i - 1] + h <= b) {
  65. h_all = realloc(h_all, sizeof(long double) * (k + 1));
  66. h_all[k] = h;
  67. u1[1] = euler_method(u1[0], x[i - 1], x[i - 1] + h, F, 3)[2];
  68. v1[1] = euler_method(v1[0], x[i - 1], x[i - 1] + h, F_0, 3)[2];
  69. u2 = euler_method(u1[0], x[i - 1], x[i - 1] + h, F, 5)[4];
  70. v2 = euler_method(v1[0], x[i - 1], x[i - 1] + h, F_0, 5)[4];
  71. difu = fabs(u1[1].y1 - u2.y1);
  72. difv = fabs(v1[1].y1 - v2.y1);
  73. //printf("difv = %e, v1[1].y1 = %e, v2.y1 = %e, i = %i,h = %e\n", difv, v1[1].y1, v2.y1,i,h);
  74. if (difu > eps/100 || difv > eps/100) {
  75. h /= 2;
  76. }
  77. else if (difu < eps / 500 && difv < eps / 500) {
  78. x = realloc(x, sizeof(double) * (i + 1));
  79. x[i] = x[i - 1] + h;
  80. u = realloc(u, sizeof(vector) * (i + 1));
  81. u[i] = u2;
  82. v = realloc(v, sizeof(vector) * (i + 1));
  83. v[i] = v2;
  84. h_made = realloc(h_made, sizeof(long double) * (i + 1));
  85. h_made[i - 1] = h;
  86. i += 1;
  87. u1[0] = u2;
  88. v1[0] = v2;
  89. if (x[i] + h * 2 <= b) {
  90. h *= 2;
  91. }
  92. }
  93. else {
  94. x = realloc(x, sizeof(double) * (i + 1));
  95. x[i] = x[i - 1] + h;
  96. u = realloc(u, sizeof(vector) * (i + 1));
  97. u[i] = u2;
  98. v = realloc(v, sizeof(vector) * (i + 1));
  99. v[i] = v2;
  100. h_made = realloc(h_made, sizeof(long double) * (i + 1));
  101. h_made[i-1] = h;
  102. i += 1;
  103. u1[0] = u2;
  104. v1[0] = v2;
  105. }
  106. k++;
  107. }
  108. h_all[k - 1] = h;
  109. h_made[i - 1] = h;
  110. *len_h = k;
  111. *n_ = i;
  112. double C = (B - betta_0 * u[i - 1].y1 - betta_1 * u[i - 1].y2) / (betta_0 * v[i - 1].y1 + betta_1 * v[i - 1].y2);
  113. double* y = malloc(sizeof(double) * i);
  114. for (int l = 0;l < i;l++) {
  115. y[l] = u[l].y1 + C * v[l].y1;
  116. }
  117. double** ans = malloc(sizeof(double*) * 4);
  118. ans[0] = x;
  119. ans[1] = y;
  120. ans[2] = h_all;
  121. ans[3] = h_made;
  122. return ans;
  123. }