Решение дифференциального уравнения методом Рунге-Кутта четвертого порядка - Pascal

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

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

Решить дифференциальное уравнение y'-(y/x) = x*sin(x) X принадлежит [пи/2;пи/2 + 1] y(пи/2)= пи y= 2x-x*cos(x)

Решение задачи: «Решение дифференциального уравнения методом Рунге-Кутта четвертого порядка»

textual
Листинг программы
  1. program RungeKutta4;
  2.  
  3.   function f(x, y: real): real;
  4.   begin
  5.     f := x * sin(x) + y / x;
  6.   end;
  7.  
  8.   function Yetalon(x: real): real;
  9.   begin
  10.     Yetalon := 2 * x - x * cos(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.     Tprint: real;
  30.   begin
  31.     t := t0;
  32.     y := y0;
  33.     if Nprint > 0 then
  34.     begin
  35.       Tprint := 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 + h) <= (tfin + h / 2) do
  40.     begin
  41.       RungeKutta4Step(t, y, h);
  42.       if (Nprint > 0) and (abs(t - Tprint) < h / 2) then
  43.       begin
  44.         writeln(t: 12: 5, y: 12: 5, Yetalon(t): 12: 5);
  45.         Tprint := Tprint + (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  = Pi / 2;
  70.   b  = Pi / 2 + 1;
  71.   Ya = Pi;
  72.   Eps = 0.01;
  73.   Nprint = 10;
  74. var
  75.   yfin: real;
  76. begin
  77.   writeln('Решение с фиксированным шагом ', (b - a) / Nprint: 0: 5);
  78.   RungeKutta4(a, b, (b - a) / Nprint, Ya, yfin, Nprint);
  79.   writeln('Решение с заданной точностью Eps=', Eps: 0: 5);
  80.   Differ(a, b, Ya, Eps, Nprint);
  81. end.

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

  1. Объявление функции f с аргументами x и y, возвращающей значение типа real
  2. Определение функции f как x * sin(x) + y / x
  3. Объявление функции Yetalon с аргументом x, возвращающей значение типа real
  4. Определение функции Yetalon как 2 x - x cos(x)
  5. Объявление процедуры RungeKutta4Step с аргументами t, y, h типа real и переменными k1, k2, k3, k4 типа real
  6. Запись k1, k2, k3, k4 по формулам метода Рунге-Кутта
  7. Изменение значения y и t в соответствии с методом Рунге-Кутта
  8. Объявление процедуры RungeKutta4 с аргументами t0, tfin, h, y0 типа real и переменной yfin типа real
  9. Инициализация переменных t и y
  10. Вывод на экран х и y, если Nprint больше нуля
  11. Выполнение цикла для вычисления значений методом Рунге-Кутта и вывода результатов, если Nprint больше нуля
  12. Объявление процедуры Differ с аргументами t0, tfin, y0 типа real, eps типа real и Nprint типа integer
  13. Вычисление значения h, y1 и y2, используя метод Рунге-Кутта
  14. Повторение вычислений при делении шага на 2 и сравнении результатов с заданной точностью
  15. Вызов метода Рунге-Кутта с целью достижения заданной точности
  16. Объявление констант и переменных
  17. Вывод на экран результатов вычислений с фиксированным шагом и с заданной точностью, используя метод Рунге-Кутта.

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


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

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

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

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

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

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