Идея методов Рунге-Кутты

Метод Эйлера честно делает шаг, но смотрит только в одну сторону — в начало отрезка. Методы Рунге-Кутты подсматривают наклон в нескольких точках и усредняют его, и за это платят кратным ростом точности.

Метод Рунге-Кутты — семейство одношаговых явных методов решения задачи Коши, в которых приращение за шаг считается как взвешенная сумма нескольких пробных значений правой части (наклонов), вычисленных в специально подобранных точках внутри шага.

Вспомним, в чём состоит задача. У нас есть уравнение 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-го порядка цена точности растёт быстрее.
Проверьте себя
1. Чем принципиально метод Рунге-Кутты отличается от метода Эйлера?
AОн использует переменный шаг вместо постоянного
BОн вычисляет несколько пробных наклонов внутри шага и берёт их взвешенную сумму
CОн решает уравнение точно, без приближения
DОн не требует вычислять правую часть f(t, y)
2. Какой глобальный порядок точности у метода RK2 (средней точки)?
AПервый, O(h)
BВторой, O(h^2)
CТретий, O(h^3)
DЧетвёртый, O(h^4)
3. Что описывает нижняя строка b-коэффициентов в таблице Бутчера?
AТочки по оси t, где измеряются наклоны
BСдвиги аргумента y при вычислении наклонов
CВеса, с которыми наклоны складываются в итоговое приращение
DРазмер шага h