Погрешности и валидация симуляций
Как доверять симуляции: проверка сохранением, пределами и аналитикой.
Валидация симуляции — систематическая проверка её правильности через законы сохранения, известные предельные случаи и сравнение с аналитическими решениями.
Главный вопрос: откуда вы знаете, что симуляция права?
Симуляция всегда что-то печатает — красивые числа, графики, траектории. Но соответствуют ли они физике? Самообман здесь лёгок: программа без единой синтаксической ошибки может выдавать абсолютную чепуху (вспомните Эйлер, раскручивающий орбиту). Поэтому валидация — не финальный штрих, а центральная дисциплина вычислительной физики. Есть три кита проверки.
Кит 1: законы сохранения
Если в системе нет источников и стоков, сохраняющиеся величины обязаны сохраняться в симуляции. Считайте их и следите за дрейфом:
| Система | Что должно сохраняться |
| Орбита, осциллятор без трения | энергия, момент импульса |
| N тел, столкновения | импульс (точно), энергия (приближённо) |
| Газ из частиц | энергия, импульс, число частиц |
| Модель Изинга | детальный баланс (равновесие) |
Рост или падение сохраняющейся величины — сигнал тревоги: либо ошибка в коде, либо плохой метод, либо слишком крупный шаг. Это самый чувствительный и дешёвый детектор проблем.
Кит 2: предельные случаи
Загоните симуляцию в режим, где ответ известен. Маятник при малом угле обязан давать период 2π√(L/g). Полёт при нулевом сопротивлении — параболу с дальностью v₀²sin(2α)/g. Газ при нулевой температуре — застывшие частицы. Если в простом пределе симуляция врёт, она тем более ошибается в сложном случае. Предельные случаи — это «контрольные точки» с заранее известным ответом.
Кит 3: сходимость по шагу
Уменьшайте dt (или измельчайте сетку) и смотрите, к чему сходится результат. Правильная симуляция при dt→0 стремится к устойчивому значению, причём с известной скоростью (порядок метода). Если результат «скачет» или расходится при уменьшении шага — что-то не так. Этот тест мы видели: дрейф энергии орбиты падал предсказуемо при уменьшении dt для Верле, но не для Эйлера.
import math
# Проверка сходимости: численная производная sin(x) в точке x=1
# точное значение = cos(1)
exact = math.cos(1.0)
print("Сходимость численной производной к cos(1):")
print(" h оценка ошибка")
for h in (0.1, 0.01, 0.001, 0.0001):
approx = (math.sin(1.0+h) - math.sin(1.0-h)) / (2*h)
print(f"{h:7.4f} {approx:.8f} {abs(approx-exact):.2e}")
print(f"Точное cos(1) = {exact:.8f}")
print("Ошибка падает ~ h² (центральная разность 2-го порядка).")Вывод:
Сходимость численной производной к cos(1): h оценка ошибка 0.1000 0.53940225 9.00e-04 0.0100 0.54029330 9.00e-06 0.0010 0.54030222 9.01e-08 0.0001 0.54030230 9.00e-10 Точное cos(1) = 0.54030231 Ошибка падает ~ h² (центральная разность 2-го порядка).
Поразительно наглядный тест сходимости: при уменьшении шага h в 10 раз ошибка падает в 100 раз (с 9.0e-4 до 9.0e-6 до 9.0e-8) — ровно как h², что подтверждает второй порядок центральной разности. Если бы метод был первого порядка, ошибка падала бы лишь в 10 раз. Так измеряют реальный порядок метода и ловят ошибки в его реализации.
Как работает под капотом
За валидацией стоит важное различие: верификация («правильно ли я решаю уравнения?») и валидация («правильные ли это уравнения?»). Сохранение и сходимость проверяют верификацию — что код корректно решает заложенную модель. Сравнение с экспериментом проверяет валидацию — что сама модель описывает реальность. Симуляция может быть идеально верифицирована (энергия сохраняется до 15 знаков), но невалидна (мы забыли учесть трение, и результат не совпадает с опытом). Хорошая вычислительная физика требует обоих уровней доверия.
Частые ошибки
- Доверять симуляции без единой проверки. Красивый вывод не означает правильный.
- Проверять только в сложном режиме. Начинайте с простых пределов, где ответ известен.
- Путать верификацию и валидацию. Сохранение энергии не доказывает, что модель описывает реальную физику.
Итоги
- Валидация — центральная дисциплина, а не финальный штрих.
- Три кита: законы сохранения, предельные случаи, сходимость по шагу.
- Падение ошибки при уменьшении шага подтверждает порядок метода.
- Верификация (верно решаю) и валидация (верная модель) — разные уровни доверия.