Погрешности и валидация симуляций

Как доверять симуляции: проверка сохранением, пределами и аналитикой.

Валидация симуляции — систематическая проверка её правильности через законы сохранения, известные предельные случаи и сравнение с аналитическими решениями.

Главный вопрос: откуда вы знаете, что симуляция права?

Симуляция всегда что-то печатает — красивые числа, графики, траектории. Но соответствуют ли они физике? Самообман здесь лёгок: программа без единой синтаксической ошибки может выдавать абсолютную чепуху (вспомните Эйлер, раскручивающий орбиту). Поэтому валидация — не финальный штрих, а центральная дисциплина вычислительной физики. Есть три кита проверки.

Кит 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) — ровно как , что подтверждает второй порядок центральной разности. Если бы метод был первого порядка, ошибка падала бы лишь в 10 раз. Так измеряют реальный порядок метода и ловят ошибки в его реализации.

Как работает под капотом

За валидацией стоит важное различие: верификация («правильно ли я решаю уравнения?») и валидация («правильные ли это уравнения?»). Сохранение и сходимость проверяют верификацию — что код корректно решает заложенную модель. Сравнение с экспериментом проверяет валидацию — что сама модель описывает реальность. Симуляция может быть идеально верифицирована (энергия сохраняется до 15 знаков), но невалидна (мы забыли учесть трение, и результат не совпадает с опытом). Хорошая вычислительная физика требует обоих уровней доверия.

Частые ошибки

  • Доверять симуляции без единой проверки. Красивый вывод не означает правильный.
  • Проверять только в сложном режиме. Начинайте с простых пределов, где ответ известен.
  • Путать верификацию и валидацию. Сохранение энергии не доказывает, что модель описывает реальную физику.

Итоги

  • Валидация — центральная дисциплина, а не финальный штрих.
  • Три кита: законы сохранения, предельные случаи, сходимость по шагу.
  • Падение ошибки при уменьшении шага подтверждает порядок метода.
  • Верификация (верно решаю) и валидация (верная модель) — разные уровни доверия.
Проверьте себя
1. Какой из тестов — самый чувствительный и дешёвый детектор проблем в симуляции?
AКрасивый график
BПроверка дрейфа сохраняющихся величин (энергии, импульса)
CВремя выполнения
DЧисло строк кода
2. Что означает падение ошибки в 100 раз при уменьшении шага в 10 раз?
AМетод первого порядка
BМетод второго порядка (ошибка ~ h²)
CОшибка в коде
DМетод не сходится
3. Чем верификация отличается от валидации?
AЭто синонимы
BВерификация — верно ли решаются уравнения; валидация — верные ли это уравнения (описывают ли реальность)
CВерификация про скорость, валидация про память
DВалидация не нужна