Метод Рунге-Кутта 4 порядка точности - Pascal

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

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

Уважаемые помогите решить задачу Коши для обыкновенного дифференциального уравнения y' =f(x, y) на промежутке [a, b] методом Рунге–Кутта четвертого порядка точности. f(x, y) = y + cos x –sin x, y(a) = 1, a = 0, b = 1. Точное решение задачи: y(x) = e^x + sin x.
Листинг программы
  1. {nmax максимальное число возможных уравнений
  2. x независимая переменная
  3. y вектор зависимых переменных (искомое решение)
  4. f вектор правых частей
  5. a начальное значение зависимой переменной
  6. b конечное значение независимой переменной
  7. h шаг интегрирования = (b-a)/10
  8. }
  9.  
  10. const
  11.  
  12. nmax=8;
  13. type
  14. vec=array[1..nmax] of real;
  15. var
  16. h,a,b,:real;
  17. procedure der(x:real;y:vec; var f:vec);
  18. begin
  19. {вектор правых частей};
  20. end;
  21. procedure rk4(n: integer; x, h: real; var y: vec); {готовая процедура метода Рунге-Кутта}
  22. var i, j: integer;
  23. h1, h2, q: real;
  24. y0, y1, f: vec;
  25. begin h1 := 0;
  26. h2 := h1/2;
  27. for i := 1 to n do begin
  28. y0[i] := y[i];
  29. y1[i] := y[i];
  30. end;
  31. for j := 1 to 4 do begin
  32. der(x+h1,y,f);
  33. if j = 3 then h1 := h else h1 := h2;
  34. for i := 1 to n do begin
  35. q := h1*f[i];
  36. y[i] := y0[i] + q;
  37. if j = 2 then q := 2*q;
  38. y1[i] := y1[i] + q/3;
  39. end ;
  40. end;
  41. for i := 1 to n do y[i] := y1[i];
  42. end;
  43. Процесс заканчивается по достижению верхней границы например:
  44. while x<b+0.00001 do begin
  45. rk4(1,x,h,y);
  46. x:=x+h;
  47. end;
как все связать вместе не знаю. выручайте

Решение задачи: «Метод Рунге-Кутта 4 порядка точности»

textual
Листинг программы
  1. program RungeKutta4;
  2.  
  3.   function f(x, y: real): real;
  4.   begin
  5.     f := y + cos(x) - sin(x);
  6.   end;
  7.  
  8.   function Yetalon(x: real): real;
  9.   begin
  10.     Yetalon := exp(x) + sin(x);
  11.   end;
  12.  
  13.   procedure RungeKutta4Step(var t, y: real; h: real);
  14.   var
  15.     k1, k2, k3, k4: real;
  16.   begin
  17.     k1 := f(t, y);
  18.     k2 := f(t + (h / 2), y + k1 * (h / 2));
  19.     k3 := f(t + (h / 2), y + k2 * (h / 2));
  20.     k4 := f(t + h, y + k3 * h);
  21.     y  := y + (k1 + 2 * k2 + 2 * k3 + k4) * h / 6;
  22.     t  := t + h;
  23.   end;
  24.  
  25.   procedure RungeKutta4(t0, tfin, h, y0: real; var yfin: real; Nprint: integer);
  26.   var
  27.     t: real;
  28.     y: real;
  29.     Xprint: real;
  30.   begin
  31.     t := t0;
  32.     y := y0;
  33.     if Nprint > 0 then
  34.     begin
  35.       Xprint := t + (tfin - t0) / Nprint;
  36.       writeln('x': 9, 'y': 12, 'Yetalon': 15);
  37.       writeln(t: 12: 5, y: 12: 5, Yetalon(t): 12: 5);
  38.     end;
  39.     while t <= tfin do
  40.     begin
  41.       RungeKutta4Step(t, y, h);
  42.       if (Nprint > 0) and (t >= Xprint) then
  43.       begin
  44.         writeln(t: 12: 5, y: 12: 5, Yetalon(t): 12: 5);
  45.         Xprint := Xprint + (tfin - t0) / Nprint;
  46.       end;
  47.     end;
  48.     yfin := y;
  49.   end;
  50.  
  51.   procedure Differ(t0, tfin, y0: real; eps: real; Nprint: integer);
  52.   var
  53.     h: real;
  54.     y1, y2: real;
  55.   begin
  56.     if Nprint <= 0 then
  57.       exit;
  58.     h := (tfin - t0) / Nprint;
  59.     RungeKutta4(t0, tfin, h, y0, y2, 0);
  60.     repeat
  61.       y1 := y2;
  62.       h  := h / 2;
  63.       RungeKutta4(t0, tfin, h, y0, y2, 0);
  64.     until abs(y2 - y1) < eps;
  65.     RungeKutta4(t0, tfin, h, y0, y2, Nprint);
  66.   end;
  67.  
  68. const
  69.   a  = 0;
  70.   b  = 1;
  71.   Ya = 1;
  72.   Eps = 0.1;
  73.   Nprint = 10;
  74. begin
  75.   Differ(a, b, Ya, Eps, Nprint);
  76. end.

Объяснение кода листинга программы

  1. Объявляются 2 функции:
    • названия и значения переменных:
      • f(x, y: real): возвращает значение функции y + cos(x) - sin(x)
      • Yetalon(x: real): возвращает значение функции exp(x) + sin(x)
  2. Объявляется процедура RungeKutta4Step, которая принимает на вход переменные t, y, h и вычисляет значения k1, k2, k3, k4 и обновляет переменные y и t по формуле метода Рунге-Кутта 4 порядка.
  3. Объявляется процедура RungeKutta4, которая вычисляет приближенное решение ОДУ методом Рунге-Кутта 4 порядка.
    • В данной процедуре происходит цикл, в котором вызывается процедура RungeKutta4Step для каждого шага, и происходит вывод результатов вычислений.
  4. Объявляется процедура Differ, которая реализует процесс уточнения решения до заданной точности. Используется метод половинного деления шага.
  5. Задаются константы для использования в программе:
    • названия и значения переменных:
      • a = 0: начальный момент времени
      • b = 1: конечный момент времени
      • Ya = 1: начальное значение функции
      • Eps = 0.1: заданная точность
      • Nprint = 10: количество точек для печати результатов
  6. Вызывается процедура Differ с передачей заданных значений констант в качестве параметров.

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


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

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

14   голосов , оценка 3.857 из 5

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

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

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