Решение дифференциального уравнения методом Рунге-Кутта четвертого порядка - Pascal
Формулировка задачи:
Решить дифференциальное уравнение
y'-(y/x) = x*sin(x)
X принадлежит [пи/2;пи/2 + 1]
y(пи/2)= пи
y= 2x-x*cos(x)
Решение задачи: «Решение дифференциального уравнения методом Рунге-Кутта четвертого порядка»
textual
Листинг программы
- program RungeKutta4;
- function f(x, y: real): real;
- begin
- f := x * sin(x) + y / x;
- end;
- function Yetalon(x: real): real;
- begin
- Yetalon := 2 * x - x * cos(x);
- end;
- procedure RungeKutta4Step(var t, y: real; h: real);
- var
- k1, k2, k3, k4: real;
- begin
- k1 := f(t, y);
- k2 := f(t + (h / 2), y + k1 * (h / 2));
- k3 := f(t + (h / 2), y + k2 * (h / 2));
- k4 := f(t + h, y + k3 * h);
- y := y + (k1 + 2 * k2 + 2 * k3 + k4) * h / 6;
- t := t + h;
- end;
- procedure RungeKutta4(t0, tfin, h, y0: real; var yfin: real; Nprint: integer);
- var
- t: real;
- y: real;
- Tprint: real;
- begin
- t := t0;
- y := y0;
- if Nprint > 0 then
- begin
- Tprint := t + (tfin - t0) / Nprint;
- writeln('x': 9, 'y': 12, 'Yetalon': 15);
- writeln(t: 12: 5, y: 12: 5, Yetalon(t): 12: 5);
- end;
- while (t + h) <= (tfin + h / 2) do
- begin
- RungeKutta4Step(t, y, h);
- if (Nprint > 0) and (abs(t - Tprint) < h / 2) then
- begin
- writeln(t: 12: 5, y: 12: 5, Yetalon(t): 12: 5);
- Tprint := Tprint + (tfin - t0) / Nprint;
- end;
- end;
- yfin := y;
- end;
- procedure Differ(t0, tfin, y0: real; eps: real; Nprint: integer);
- var
- h: real;
- y1, y2: real;
- begin
- if Nprint <= 0 then
- exit;
- h := (tfin - t0) / Nprint;
- RungeKutta4(t0, tfin, h, y0, y2, 0);
- repeat
- y1 := y2;
- h := h / 2;
- RungeKutta4(t0, tfin, h, y0, y2, 0);
- until abs(y2 - y1) < eps;
- RungeKutta4(t0, tfin, h, y0, y2, Nprint);
- end;
- const
- a = Pi / 2;
- b = Pi / 2 + 1;
- Ya = Pi;
- Eps = 0.01;
- Nprint = 10;
- var
- yfin: real;
- begin
- writeln('Решение с фиксированным шагом ', (b - a) / Nprint: 0: 5);
- RungeKutta4(a, b, (b - a) / Nprint, Ya, yfin, Nprint);
- writeln('Решение с заданной точностью Eps=', Eps: 0: 5);
- Differ(a, b, Ya, Eps, Nprint);
- end.
Объяснение кода листинга программы
- Объявление функции f с аргументами x и y, возвращающей значение типа real
- Определение функции f как x * sin(x) + y / x
- Объявление функции Yetalon с аргументом x, возвращающей значение типа real
- Определение функции Yetalon как 2 x - x cos(x)
- Объявление процедуры RungeKutta4Step с аргументами t, y, h типа real и переменными k1, k2, k3, k4 типа real
- Запись k1, k2, k3, k4 по формулам метода Рунге-Кутта
- Изменение значения y и t в соответствии с методом Рунге-Кутта
- Объявление процедуры RungeKutta4 с аргументами t0, tfin, h, y0 типа real и переменной yfin типа real
- Инициализация переменных t и y
- Вывод на экран х и y, если Nprint больше нуля
- Выполнение цикла для вычисления значений методом Рунге-Кутта и вывода результатов, если Nprint больше нуля
- Объявление процедуры Differ с аргументами t0, tfin, y0 типа real, eps типа real и Nprint типа integer
- Вычисление значения h, y1 и y2, используя метод Рунге-Кутта
- Повторение вычислений при делении шага на 2 и сравнении результатов с заданной точностью
- Вызов метода Рунге-Кутта с целью достижения заданной точности
- Объявление констант и переменных
- Вывод на экран результатов вычислений с фиксированным шагом и с заданной точностью, используя метод Рунге-Кутта.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д