Явный метод Эйлера: простейший интегратор
Метод Эйлера — это «прибавь скорость, умноженную на шаг» — простейший интегратор, с которого всё начинается.
Явный метод Эйлера — численный метод решения дифференциальных уравнений, в котором следующее состояние вычисляется по производным, взятым в текущей точке.
Что такое интегрирование движения
Физика даёт нам ускорение — как функцию положения, скорости и времени: $a = f(x, v, t)$. Например, для пружины $a = -\frac{k}{m} x$, для гравитации $a = -g$. Задача движка — по ускорению восстановить, как меняются скорость и положение. Это и называется интегрированием уравнений движения. Поскольку аналитически проинтегрировать удаётся редко, делаем это численно — по шагам.
Явный метод Эйлера — самый прямой подход. Зная состояние $(x_n, v_n)$, вычисляем ускорение $a_n = f(x_n, v_n)$ и делаем шаг:
$$x_{n+1} = x_n + v_n \, \Delta t, \qquad v_{n+1} = v_n + a_n \, \Delta t.$$
Обратите внимание: обе новые величины считаются по старым $x_n$ и $v_n$. Поэтому метод и называется «явным» — будущее выражено явно через настоящее, без неизвестных в правой части.
Реализация и проверка
Проверим метод на пружине — гармоническом осцилляторе $a = -x$ (взяли $k = m = 1$). Точное решение — косинус: $x(t) = \cos t$, и полная энергия $E = \frac{v^2}{2} + \frac{x^2}{2}$ должна сохраняться и быть равной $0.5$. Посмотрим, что покажет Эйлер.
x, v, dt = 1.0, 0.0, 0.1
for n in range(11):
E = 0.5*v*v + 0.5*x*x
if n % 2 == 0:
print(f"n={n:2d} x={x:6.3f} v={v:6.3f} E={E:.4f}")
a = -x
x_new = x + v*dt
v = v + a*dt
x = x_new
Вывод:
n= 0 x= 1.000 v= 0.000 E=0.5000 n= 2 x= 0.990 v=-0.200 E=0.5101 n= 4 x= 0.940 v=-0.396 E=0.5203 n= 6 x= 0.851 v=-0.580 E=0.5308 n= 8 x= 0.727 v=-0.745 E=0.5414 n=10 x= 0.571 v=-0.883 E=0.5523
Энергия, которая обязана быть постоянной, неуклонно растёт: с $0.5000$ до $0.5523$ всего за один период. Маятник в симуляции с каждым колебанием раскачивается всё сильнее, хотя никакой накачки энергии нет. Это фундаментальный изъян явного Эйлера, к которому мы вернёмся в отдельном уроке.
Порядок точности
За один шаг метод Эйлера ошибается на величину порядка $\Delta t^2$ (локальная ошибка). Но шагов на отрезке времени $T$ примерно $\frac{T}{\Delta t}$, поэтому ошибки накапливаются, и итоговая (глобальная) ошибка пропорциональна $\Delta t$. Говорят, что метод имеет первый порядок точности. Практический смысл: чтобы уменьшить ошибку в $10$ раз, нужно в $10$ раз уменьшить шаг и сделать в $10$ раз больше вычислений. Это дорого, поэтому существуют методы более высокого порядка.
Как работает под капотом
Геометрически Эйлер идёт по касательной: в каждой точке он определяет направление (производную) и делает прямой отрезок длиной $\Delta t$ в этом направлении. Если траектория искривляется (а у колебаний она искривляется постоянно), прямой отрезок всегда «вылетает» наружу от истинной кривой. Для осциллятора это означает систематическое раздувание амплитуды. Чем сильнее кривизна и больше шаг, тем заметнее уход.
Несмотря на изъяны, явный Эйлер ценен: он простейший, его легко запрограммировать без ошибок, и для задач без долгого сохранения энергии (например, разовый бросок снаряда на пару секунд) его точности часто хватает. Понимание его слабостей — ключ к выбору лучших методов.
Частые ошибки
- Обновить $x$ по уже новой $v$. Тогда это уже не явный Эйлер, а полу-неявный — другой метод. Порядок присваиваний критичен; используйте временную переменную
x_new. - Ждать сохранения энергии. Явный Эйлер её не сохраняет — для колебаний и орбит он накапливает энергию и «взрывается».
- Бороться с ошибкой только уменьшением шага. Иногда дешевле сменить метод, чем гонять Эйлер с микроскопическим $\Delta t$.
Итог
- Явный Эйлер: $x_{n+1}=x_n+v_n\Delta t$, $v_{n+1}=v_n+a_n\Delta t$, всё по старым значениям.
- Первый порядок точности: глобальная ошибка $\sim \Delta t$.
- Не сохраняет энергию: на колебаниях амплитуда растёт.
- Прост и надёжен для коротких задач, плох для долгих колебательных систем.