Численное решение задачи Коши, результат выводится неправильно - C (СИ)

Узнай цену своей работы

Формулировка задачи:

не понимаю в чем проблема задание было такое Построить алгоритмы численного решения задачи Коши явным, неявным методом Эйлера и методом Рунге-Кутта с автоматическим выбором шага интегрирования для достижения заданной локальной относительной погрешности  либо локальной абсолютной погрешности . Апостериорную оценку погрешности для явного метода Эйлера провести по правилу Рунге либо по оценке производной, входящей в выражение для погрешности. 2. Составить рабочую программу с использованием универсальных функций численного решения задачи Коши. Минимальный набор параметров функции решения задачи Коши должен включать: имя функции, вычисляющей производную неизвестной функции (правую часть дифференциального уравнения); интервал времени, на котором нужно найти решение; начальное условие; погрешность решения; массив временных отсчетов, в которых найдено решение; массив решений; максимальное число временных отсчетов; количество фактически полученных временных отсчетов, в которых найдены решения с заданной погрешностью.
Листинг программы
  1. #define _USE_MATH_DEFINES
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. int a1;
  6. float TEC(float t, float U)
  7. {
  8. float z, e, E = 5, id, i0 = 3e-9, f = 1000, R = 5000, c = 1e-6, m = 1.7, fi = 0.026;
  9. a1++;
  10. e = E*sin(2 * (M_PI)*f*t + (M_PI) / 4);
  11. id = i0*(exp((e - U) / (fi*m)) - 1);
  12. z = id / c - U / (R*c);
  13. return z;
  14. }
  15. int RungeKutt(float f(float x, float y), float *t, float *y, float A, float B, float ny, float E, int Nmax)
  16. {
  17. int i, j, n = 0;
  18. float q = 2, R, y1, y2, y3, t1, t2, t3, h, a[6] = { 0, (1. / 4), (3. / 8), (12. / 13), 1., (1. / 2) }, c[6] = { 16. / 135, 0, 6656. / 12825, 28561. / 56430, -9. / 50, 2. / 55 }, c1[6] = { 25. / 216, 0, 1408. / 2565, 2197. / 4104, -1. / 5, 0 }, b[5][5] = { { 1. / 4, 0, 0, 0, 0 }, { 3. / 32, 9. / 32, 0, 0, 0 }, { 1932. / 2197, -7200. / 2197, 7296. / 2197, 0, 0 }, { 439. / 216, -8., 3680. / 513, -845. / 4104, 0 }, { -8. / 27, 2., -3544. / 2565., 1859. / 4104, -11. / 40 } }, k[6];
  19. h = B - A;
  20. t1 = A;
  21. y1 = ny;
  22. do
  23. {
  24. y3 = y1;
  25. t3 = t1;
  26. for (i = 0; i<6; i++)
  27. {
  28. t2 = t1;
  29. y2 = y1;
  30. t2 += a[i] * h;
  31. for (j = 0; j<i; j++)
  32. {
  33. y2 += h*b[i - 1][j] * k[j];
  34. }
  35. k[i] = f(t2, y2);
  36. }
  37. for (i = 0; i<6; i++)
  38. y1 += h*c[i] * k[i];
  39. t1 += h;
  40. R = 0;
  41. for (i = 0; i<6; i++)
  42. R += (c[i] - c1[i])*k[i];
  43. R = h*R;
  44. if (fabs(R) <= E*fabs(y1))
  45. {
  46. y[n] = y1;
  47. t[n] = t1;
  48. if (fabs(R)<(E*fabs(y1) / 64))
  49. h = h*q;
  50. if ((t1 + h)>B)
  51. h = B - t1;
  52. n++;
  53. }
  54. else
  55. {
  56. h = h / q;
  57. y1 = y3;
  58. t1 = t3;
  59. }
  60. } while ((t1<B) && (n<Nmax));
  61. return n;
  62. }
  63. int yavniyEuler(float f(float x, float z), float *t, float *y, float a, float b, float ny, float E, float D, int Nmax)
  64. {
  65. int i, n = 0, q = 2;
  66. float h, y1, t1, y2, y3, ny1, nt1, d, k = 0, R;
  67. h = b - a;
  68. t1 = a;
  69. y1 = ny;
  70. do
  71. {
  72. ny1 = y1;
  73. nt1 = t1;
  74. if (k == 0)
  75. {
  76. d = f(t1, y1);
  77. y2 = y1 + h*d;
  78. }
  79. k = 1;
  80. for (i = 0; i<q; i++)
  81. {
  82. if (i == 0)
  83. {
  84. y1 = y1 + (h / q)*d;
  85. y3 = y1;
  86. }
  87. else
  88. y1 = y1 + (h / q)*f(t1, y1);
  89. t1 += (h / q);
  90. }
  91. R = E*fabs(y1);
  92. if (y2 == 0)
  93. {
  94. R = R + D;
  95. }
  96. if (fabs(y1 - y2) <= (R))
  97. {
  98. k = 0;
  99. y[n] = y1;
  100. t[n] = t1;
  101. if (fabs(y1 - y2)<E*fabs(y1) / 4)
  102. h = q*h;
  103. n++;
  104. }
  105. else
  106. {
  107. h = h / q;
  108. y2 = y3;
  109. y1 = ny1;
  110. t1 = nt1;
  111. }
  112. } while (t1<b && n<Nmax);
  113. return (n);
  114. }
  115. int neyavniyEuler(float f(float x, float z), float *t, float *y, float a, float b, float ny, float E, int Nmax)
  116. {
  117. int n = 0, q = 2;
  118. float h, h1, d, em = 0.000000119, y1, t1, y2, t2, y3, y4, f1, f2, v, R, R1;
  119. h = b - a;
  120. y1 = ny;
  121. t1 = a;
  122. y2 = a;
  123. d = f(a, ny);
  124. do
  125. {
  126. y4 = y1 + h*d;
  127. t2 = t1 + h;
  128. y3 = y2;
  129. if (y2 != 0)
  130. h1 = y2*sqrt(em);
  131. else
  132. h1 = sqrt(em);
  133. f1 = y2 - y1 - h*f(t2, y2);
  134. f2 = (y2 + h1) - y1 - h*f(t2, (y2 + h1));
  135. y2 = y2 - f1*h1 / (f2 - f1);
  136. while (fabs(y2 - y3)>E*fabs(y2))
  137. {
  138. f2 = f1;
  139. f1 = y2 - y1 - h*f(t2, y2);
  140. v = y2;
  141. y2 = y2 - (y2 - y3)*f1 / (f1 - f2);
  142. y3 = v;
  143. }
  144. R = (y4 - y2) / 2;
  145. if (fabs(R) <= E*fabs(y2))
  146. {
  147. y1 = y2;
  148. t1 = t2;
  149. y[n] = y2;
  150. t[n] = t2;
  151. d = f(t1, y1);
  152. if (fabs(R)<E*fabs(y2) / 4)
  153. h = h*q;
  154. if ((t2 + h)>b)
  155. h = b - t2;
  156. n++;
  157. }
  158. else
  159. {
  160. h = h / q;
  161. }
  162. } while (t1<b && n<Nmax);
  163. return n;
  164. }
  165. int main(void)
  166. {
  167. int j, i, Nmax = 10000;
  168. float *t, *y;
  169. t = malloc(Nmax*sizeof(float));
  170. y = malloc(Nmax*sizeof(float));
  171. a1 = 0;
  172. i = yavniyEuler(TEC, t, y, 0, 1.5e-3, 0, 1e-6, 0.01, 10000);
  173. printf("%.8f n=%d a1=%d\n\n", y[i - 1], i, a1);
  174. a1 = 0;
  175. i = neyavniyEuler(TEC, t, y, 0, 1.5e-3, 0, 1e-6, 0.01, 10000);
  176. printf("%.8f n=%d a1=%d\n\n", y[i - 1], i, a1);
  177. a1 = 0;
  178. i = RungeKutt(TEC, t, y, 0, 1.5e-3, 0, 1e-6, 10000);
  179. printf("%.8f n=%d a1=%d\n\n", y[i - 1], i, a1);
  180. }

Решение задачи: «Численное решение задачи Коши, результат выводится неправильно»

textual
Листинг программы
  1. float f(float x, float y)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы