Идея методов Рунге-Кутты
Метод Эйлера честно делает шаг, но смотрит только в одну сторону — в начало отрезка. Методы Рунге-Кутты подсматривают наклон в нескольких точках и усредняют его, и за это платят кратным ростом точности.
Метод Рунге-Кутты — семейство одношаговых явных методов решения задачи Коши, в которых приращение за шаг считается как взвешенная сумма нескольких пробных значений правой части (наклонов), вычисленных в специально подобранных точках внутри шага.
Вспомним, в чём состоит задача. У нас есть уравнение y' = f(t, y) и начальное условие y(t₀) = y₀. Мы движемся по сетке с шагом h и на каждом шаге хотим из текущей точки (tₙ, yₙ) попасть в следующую (tₙ₊₁, yₙ₊₁). Точное решение за этот шаг изменилось бы ровно на интеграл от f вдоль траектории — но интеграл мы взять не можем, потому что подынтегральная функция зависит от самого неизвестного решения. Значит, его надо чем-то приблизить.
От одного наклона к нескольким
Метод Эйлера берёт единственный наклон — в начале шага: yₙ₊₁ = yₙ + h·f(tₙ, yₙ). Геометрически это значит, что мы экстраполируем по касательной, проведённой в левом конце отрезка. Если функция искривляется внутри шага (а она почти всегда искривляется), касательная уводит нас в сторону, и ошибка за шаг ведёт себя как O(h²), а накопленная за весь отрезок — как O(h). Чтобы вдвое снизить ошибку, приходится вдвое уменьшать шаг и делать вдвое больше работы. Это дорого.
Идея Рунге и Кутты (рубеж XIX-XX веков) проста и гениальна: раз касательная в одной точке врёт, давайте измерим наклон в нескольких точках внутри шага и возьмём их взвешенное среднее. Тогда мы как бы «чувствуем» кривизну функции и можем учесть её. Чем больше пробных наклонов и чем хитрее подобраны точки и веса, тем больше членов ряда Тейлора мы воспроизводим точно — и тем выше порядок метода.
RK2: два наклона
Простейший представитель семейства после Эйлера — методы второго порядка с двумя наклонами. Возьмём метод средней точки. Сначала делаем пробный полушаг Эйлера до середины отрезка, измеряем там наклон, и уже этим «серединным» наклоном делаем полный шаг:
k₁ = f(tₙ, yₙ) наклон в начале k₂ = f(tₙ + h/2, yₙ + (h/2)·k₁) наклон в середине (по пробному полушагу) yₙ₊₁ = yₙ + h·k₂
Здесь весь вес отдан второму наклону, а первый нужен только чтобы добраться до середины. Глобальная ошибка такого метода — O(h²): уменьшили шаг вдвое — ошибка упала вчетверо. Это уже принципиально лучше Эйлера за всего один лишний вызов f.
Таблица Бутчера: единый язык семейства
Все явные методы Рунге-Кутты записываются одинаково. Есть s наклонов, каждый следующий вычисляется в точке, сдвинутой по t на cₙ·h и по y на линейную комбинацию уже найденных наклонов с коэффициентами aₙ₃, а итог собирается с весами bₙ. Удобно сложить эти числа в компактную таблицу — таблицу Бутчера (Butcher tableau):
c1 |
c2 | a21
c3 | a31 a32
. | . .
cs | as1 as2 ... as,s-1
-----+----------------------
| b1 b2 ... bs
Общая формула:
k_i = f( t + c_i*h , y + h * sum_{j<i} a_ij * k_j )
y_next = y + h * sum_i b_i * k_iДля метода средней точки таблица крошечная: c = (0, 1/2), a₂₁ = 1/2, b = (0, 1). Левый нижний треугольник a-коэффициентов отвечает за то, «куда смотреть», нижняя строка b — за то, «с каким весом учесть». Для явных методов матрица a строго нижнетреугольная: каждый наклон опирается только на предыдущие, поэтому считается явно, без решения уравнений. Эта таблица — не формальность: глядя на неё, специалист сразу видит порядок метода и его свойства. Классический RK4, которым мы займёмся дальше, — это просто таблица 4×4 с весами 1/6, 2/6, 2/6, 1/6.
Как работает под капотом
Почему вообще несколько наклонов дают более высокий порядок? Запишем точное решение через ряд Тейлора: y(t+h) = y + h·y' + (h²/2)·y'' + (h³/6)·y''' + ... Эйлер воспроизводит только первые два члена, поэтому первая отброшенная величина — порядка h². Метод с двумя наклонами при правильно подобранных весах гасит и член с h² (первая ошибка уходит в h³ на шаг, то есть O(h²) глобально). Чтобы это случилось, коэффициенты должны удовлетворять так называемым условиям порядка — алгебраическим уравнениям, связывающим a, b, c. Для второго порядка их всего два: сумма весов равна 1 и «центр тяжести» пробных точек совпадает с серединой. Метод средней точки им удовлетворяет, поэтому он второго порядка. Чем выше порядок, тем больше условий — и тем больше наклонов нужно, чтобы их выполнить.
Запустим прямое сравнение Эйлера и RK2 на эталонной задаче y' = y, y(0) = 1, точное решение которой — eᵗ. Возьмём заведомо крупный шаг h = 0.5, чтобы разница бросалась в глаза.
import math
def f(t, y):
return y # y' = y, точное решение e^t
t, y_euler, y_rk2 = 0.0, 1.0, 1.0
h = 0.5
print(f"{'t':>4} {'Эйлер':>10} {'RK2':>10} {'точно':>10}")
print(f"{t:4.1f} {y_euler:10.6f} {y_rk2:10.6f} {math.exp(t):10.6f}")
for _ in range(4):
# шаг Эйлера: один наклон в начале
y_euler = y_euler + h * f(t, y_euler)
# шаг RK2 (средняя точка): пробуем середину
k1 = f(t, y_rk2)
k2 = f(t + h/2, y_rk2 + h/2 * k1)
y_rk2 = y_rk2 + h * k2
t = t + h
print(f"{t:4.1f} {y_euler:10.6f} {y_rk2:10.6f} {math.exp(t):10.6f}")
Вывод:
t Эйлер RK2 точно 0.0 1.000000 1.000000 1.000000 0.5 1.500000 1.625000 1.648721 1.0 2.250000 2.640625 2.718282 1.5 3.375000 4.291016 4.481689 2.0 5.062500 6.972900 7.389056
К моменту t = 2 Эйлер отстал почти на 2.33 (5.06 вместо 7.39), а RK2 — всего на 0.42. Один лишний вызов f на каждом шаге сократил ошибку примерно в пять раз. Это и есть обещание семейства: больше наклонов — резко выше точность при том же h.
Частые ошибки
- Считать, что «больше наклонов = всегда лучше» линейно. Выигрыш не пропорционален числу наклонов: после четвёртого порядка стоимость растёт быстрее точности (нужно больше наклонов, чем единиц порядка), поэтому RK4 — золотая середина, а не «возьмём RK20».
- Путать порядок метода с числом наклонов. У RK2 два наклона и второй порядок, но это совпадение: у RK4 четыре наклона и тоже четвёртый порядок, а вот метода RK с пятью наклонами и пятым порядком уже не существует — нужно шесть.
- Использовать пробный наклон k₁ как итог. В RK2 шаг делается серединным наклоном k₂, а не k₁. Если по ошибке взять y + h·k₁, получится обычный Эйлер.
- Забывать, что внутри шага y тоже сдвигается. Аргумент второго наклона — это yₙ + (h/2)·k₁, а не сам yₙ. Сдвиг только по t, без сдвига по y, ломает порядок.
Итоги
- Метод Эйлера использует один наклон в начале шага и потому имеет всего первый порядок точности.
- Методы Рунге-Кутты берут несколько пробных наклонов внутри шага и складывают их с весами — это гасит старшие члены ряда Тейлора.
- RK2 (средняя точка) за один лишний вызов f даёт второй порядок: вдвое меньший шаг уменьшает ошибку вчетверо.
- Любой метод семейства задаётся таблицей Бутчера — набором коэффициентов c (точки), a (сдвиги по y) и b (веса итога).
- Число наклонов и порядок связаны, но не равны: после 4-го порядка цена точности растёт быстрее.