Метод Эйлера и потеря энергии
Самый простой интегратор и его роковой недостаток: он не сохраняет энергию.
Метод Эйлера — простейший интегратор: новое состояние получается прибавлением «скорость×dt» и «ускорение×dt», вычисленных в начале шага.
Как устроен явный Эйлер
Самый прямой способ сделать шаг во времени — взять текущие скорость и ускорение и сделать линейный прогноз:
x_new = x + v·dt (координата по текущей скорости) v_new = v + a·dt (скорость по текущему ускорению)
Оба обновления используют величины в начале интервала. Это явный (forward) метод Эйлера. Он интуитивен, легко пишется и работает... короткое время. На длинных симуляциях он систематически портит результат, и портит характерным образом.
Эксперимент: энергия осциллятора во времени
Возьмём идеальный осциллятор (пружина без трения, x'' = -x). Его полная энергия E = ½v² + ½x² обязана быть строго постоянной. Проследим, что с ней делает Эйлер:
x, v, dt = 1.0, 0.0, 0.05
print("шаг E")
for step in range(0, 401):
if step % 50 == 0:
E = 0.5*v*v + 0.5*x*x
print(f"{step:4d} {E:7.4f}")
xn = x + v*dt
vn = v - x*dt
x, v = xn, vnВывод:
шаг E 0 0.5000 50 0.5665 100 0.6418 150 0.7272 200 0.8238 250 0.9334 300 1.0575 350 1.1981 400 1.3574
Энергия не сохраняется — она монотонно растёт. За 400 шагов она почти утроилась. На фазовом портрете это означает, что вместо замкнутого эллипса осциллятор рисует раскручивающуюся спираль: амплитуда колебаний раздувается из ничего. Симуляция «придумывает» энергию, которой в физике нет.
Почему так происходит
Причина геометрическая. На каждом шаге Эйлер идёт по касательной к истинной траектории. У вогнутой кривой касательная всегда лежит снаружи, поэтому Эйлер систематически «срезает наружу» — точка отходит от центра. Для осциллятора это означает накачку энергии, для орбиты — раскрутку планеты по спирали прочь от Солнца. Ошибка не случайна, а имеет знак: она всегда в одну сторону, поэтому копится, а не усредняется в ноль.
Как работает под капотом
Формально Эйлер удерживает только первый член ряда Тейлора. Локальная ошибка одного шага мала (порядка dt²), но за N шагов накапливается до dt — это метод первого порядка. Хуже того, для колебательных систем ошибка не просто велика, а несимплектична: она нарушает геометрическую структуру фазового пространства, отвечающую за сохранение энергии. Никакое разумное уменьшение dt эту болезнь не лечит полностью — лечит смена метода.
Частые ошибки
- Считать Эйлер «достаточно хорошим» для долгих симуляций. Для орбит и колебаний на тысячи шагов он непригоден.
- Лечить дрейф только уменьшением dt. Это лишь замедляет накачку, но не убирает её; правильное решение — симплектический метод.
- Не проверять энергию. Без этого теста раскрутку спирали легко принять за «настоящую» физику.
Итоги
- Явный Эйлер использует скорость и ускорение в начале шага.
- Он систематически добавляет энергию: эллипс превращается в спираль.
- Ошибка имеет постоянный знак и накапливается, а не усредняется.
- Уменьшение dt не лечит болезнь — нужен другой метод.