Адамс-Мултон и предиктор-корректор
Методы Адамса-Башфорта экстраполируют наклон вперёд — это всегда немного рискованно. Адамс-Мултон поступает аккуратнее: он включает в формулу наклон в самой новой точке. Платой становится неявность, и чтобы с ней справиться, рождается элегантная схема предиктор-корректор.
Метод Адамса-Мултона — неявный многошаговый метод, в формулу которого входит значение правой части f в искомой новой точке t_{n+1}; за счёт этого он точнее явного метода того же числа шагов, но требует решения уравнения относительно y_{n+1}.
Вернёмся к интерполяции наклонов. Адамс-Башфорт строил многочлен только по прошлым наклонам и продлевал его в будущее — это экстраполяция, а экстраполяция всегда менее надёжна, чем интерполяция. Адамс-Мултон делает шаг умнее: он включает в набор узлов и будущую точку t_{n+1}, то есть строит многочлен по наклонам, среди которых есть f_{n+1}. Теперь новая точка лежит внутри диапазона узлов, а не за его краем — это интерполяция, и она точнее. Например, двухшаговый Адамс-Мултон (он же знакомый нам метод трапеций) выглядит так:
AM2 (метод трапеций, порядок 2):
y_{n+1} = y_n + (h/2) * (f_{n+1} + f_n)
AM3 (порядок 3):
y_{n+1} = y_n + (h/12) * (5*f_{n+1} + 8*f_n - f_{n-1})Загвоздка бросается в глаза: в правой части стоит f_{n+1} = f(t_{n+1}, y_{n+1}), а y_{n+1} — именно то, что мы ищем. Неизвестное стоит по обе стороны равенства. Это и есть неявность. Для произвольной нелинейной f такое уравнение пришлось бы решать итерационно (например, методом Ньютона) на каждом шаге — дорого и громоздко.
Схема предиктор-корректор
Здесь и появляется красивая идея. Что если нам не нужно точно решать неявное уравнение — достаточно хорошего приближения для y_{n+1}, которое мы подставим в правую часть? Тогда план такой:
P (Predict): явным методом (AB) грубо предсказываем y*_{n+1}
E (Evaluate): вычисляем наклон f* = f(t_{n+1}, y*_{n+1})
C (Correct): неявным методом (AM), подставив f* вместо f_{n+1},
уточняем значение -> y_{n+1}
E (Evaluate): вычисляем итоговый наклон f(t_{n+1}, y_{n+1}) в историюЭта последовательность называется PECE (Predict-Evaluate-Correct-Evaluate). Предиктор — явный Адамс-Башфорт — даёт черновой прогноз. Корректор — неявный Адамс-Мултон — подставляет наклон из прогноза вместо настоящего f_{n+1} и уточняет ответ. Мы получаем почти всю точность неявного метода, но без итерационного решения уравнения: всего два вызова f на шаг (один в E после предиктора, один в финальном E). Это дороже чистого AB2, но всё равно вдвое дешевле RK4 — и точнее AB2.
Как работает под капотом
Соберём связку AB2 (предиктор) + AM2 (корректор) и сравним её с чистым AB2 на той же задаче y' = y, y_0 = 1, h = 0.1. Разгон — снова один шаг RK4.
import math
h = 0.1
f = lambda t, y: y
def rk4_step(t, y, h):
k1 = f(t, y)
k2 = f(t + h/2, y + h/2*k1)
k3 = f(t + h/2, y + h/2*k2)
k4 = f(t + h, y + h*k3)
return y + h/6*(k1 + 2*k2 + 2*k3 + k4)
# --- чистый AB2 ---
ts = [0.0]; ys = [1.0]
y1 = rk4_step(0.0, 1.0, h); ts.append(0.1); ys.append(y1)
fs = [f(0.0, 1.0), f(0.1, y1)]
for n in range(1, 10):
yn, fn, fn1 = ys[n], fs[n], fs[n-1]
ynew = yn + h/2*(3*fn - fn1)
tnew = ts[n] + h
ts.append(tnew); ys.append(ynew); fs.append(f(tnew, ynew))
ab2_final = ys[-1]
# --- предиктор-корректор PECE: AB2 + AM2 ---
ts2 = [0.0]; ys2 = [1.0]
y1b = rk4_step(0.0, 1.0, h); ts2.append(0.1); ys2.append(y1b)
fs2 = [f(0.0, 1.0), f(0.1, y1b)]
for n in range(1, 10):
yn, fn, fn1 = ys2[n], fs2[n], fs2[n-1]
tnew = ts2[n] + h
yp = yn + h/2*(3*fn - fn1) # P: предиктор AB2
fp = f(tnew, yp) # E: наклон в прогнозе
yc = yn + h/2*(fp + fn) # C: корректор AM2 (трапеции)
ts2.append(tnew); ys2.append(yc)
fs2.append(f(tnew, yc)) # E: итоговый наклон в историю
pc_final = ys2[-1]
exact = math.exp(1.0)
print(f'точное = {exact:.6f}')
print(f'чистый AB2 = {ab2_final:.6f} ошибка = {abs(ab2_final - exact):.2e}')
print(f'PECE = {pc_final:.6f} ошибка = {abs(pc_final - exact):.2e}')Вывод:
точное = 2.718282 чистый AB2 = 2.708814 ошибка = 9.47e-03 PECE = 2.719768 ошибка = 1.49e-03
Разница говорит сама за себя. Чистый AB2 ошибся на ~9.5 тысячных, а связка предиктор-корректор — всего на ~1.5 тысячных, то есть примерно в шесть раз точнее на том же шаге. Заплатили мы за это всего одним дополнительным вызовом f на шаг (два вместо одного). Корректор «гасит» систематическую ошибку экстраполяции предиктора: AB2 стабильно недооценивал растущее решение, а добавление неявного шага трапеций вернуло результат ближе к истине.
Когда многошаговые лучше Рунге-Кутты
Сложив всё вместе, можно дать практический ориентир. Многошаговые методы (в том числе в режиме предиктор-корректор) выигрывают у Рунге-Кутты, когда совпадают несколько условий:
- Дорогая правая часть f. Если один вызов f стоит дорого (тяжёлый физический расчёт, обращение к внешней модели), то экономия с четырёх вызовов до одного-двух на шаг напрямую сокращает время счёта.
- Гладкое решение. Интерполяция наклонов работает хорошо, когда f меняется плавно. На резких изломах прошлое плохо предсказывает будущее, и преимущество тает.
- Длинное интегрирование с равномерным шагом. Многошаговые методы не любят частую смену шага. Если задача позволяет идти долго и ровно, они раскрывают свою экономичность; если же нужен агрессивно адаптивный шаг — удобнее одношаговый RK45.
Там же, где правая часть дешёвая, решение негладкое или шаг приходится постоянно подстраивать, привычные методы Рунге-Кутты с адаптивным шагом обычно проще и надёжнее. Многошаговые методы — это инструмент для специфической, но очень распространённой ситуации: долгого аккуратного счёта гладкой задачи с дорогой правой частью.
Частые ошибки
- Путать предиктор и корректор. Предсказывает явный метод (AB), уточняет неявный (AM). Поменять их ролями нельзя: смысл схемы в том, чтобы дешёвый прогноз подставить в точную неявную формулу.
- Забыть шаг Evaluate перед корректором. Корректору нужен наклон f* в прогнозной точке. Без вычисления f(t_{n+1}, y*_{n+1}) подставлять в формулу AM нечего.
- Подставить в историю «не тот» наклон. В историю для следующих шагов кладут наклон, посчитанный в финальной (скорректированной) точке, а не в прогнозной — иначе накапливается ошибка.
- Ожидать выигрыша на дешёвой f. Если вызов f почти бесплатен, экономия вызовов ничего не даёт, и простой RK45 часто оказывается практичнее.
Итоги
- Адамс-Мултон — неявный метод: в формулу входит f_{n+1} в новой точке, поэтому он точнее явного AB того же числа шагов.
- AM2 — это метод трапеций: y_{n+1} = y_n + (h/2)(f_{n+1} + f_n).
- Схема предиктор-корректор PECE: AB предсказывает, AM уточняет — почти точность неявного метода без решения уравнения, два вызова f на шаг.
- На y' = y связка AB2/AM2 оказалась примерно в шесть раз точнее чистого AB2 при том же шаге.
- Многошаговые методы выгодны при дорогой правой части, гладком решении и длинном интегрировании равномерным шагом; иначе удобнее адаптивный RK.