Численные методы. Погрешности и устойчивость.

Численные методы — это мост между математической идеей и её практической реализацией на компьютере. Представьте себе, что вы хотите измерить длину реки, но у вас есть только бумажная карта с сеткой квадратов: чем мельче сетка, тем точнее получится измерение, но тем больше труда придётся вложить. Точно так же любой численный алгоритм «разрезает» непрерывную задачу на конечное число операций и значений, а значит — неизбежно появляются ошибки. Понимание того, откуда берутся погрешности и как вести себя алгоритм при небольших искажениям входных данных (его устойчивость), — ключ к тому, чтобы превращать вычислительные эксперименты в надёжные научные и инженерные решения.

Сначала стоит различать основные типы ошибок. Во-первых, округлённая ошибка (round-off error) — результат конечной точности представления чисел в компьютере. Многочисленные вычисления с числами с плавающей запятой накапливают небольшие погрешности, и в определённых случаях они могут доминировать над результатом. Во-вторых, усечённая или аппроксимационная погрешность (truncation error) — ошибка, вызванная заменой бесконечного процесса конечным: например, приближение бесконечного ряда конечной суммой, аппроксимация производной конечной разностью или дискретизация непрерывной задачи в задачу на сетке. Наконец, есть модельная ошибка — отличие реального объекта от математической модели (например, упрощения в уравнениях).

Чтобы учиться принимать правильные решения при проектировании численных методов, полезно различать ещё несколько понятий: *погрешность задачи (conditioning)* и *устойчивость метода (stability)*. Понятие обусловленности задачи отвечает на вопрос: насколько чувствителен идеальный математический ответ к малым изменениям входных данных. Представьте себе электронную линейку, на которой измерение длины рыбы сильно меняется при малом сдвиге начальной точки — это плохо обусловленная задача. Устойчивость же касается метода: если вы немного исказите вход (включая ошибки округления, аппроксимации), будет ли итоговый численный результат «вести себя» или ошибки раздуются до катастрофы. Если задача хорошо обусловлена, но метод неустойчив, итог всё равно окажется плохим.

Пример наглядного столкновения этих идей — решение системы линейных уравнений Ax = b. Для фиксированной A и b существует истинное решение x*. Но если при измерении b есть шум, или при вычислении A происходят малые ошибки, насколько изменится x*? Ответ даёт условие (condition number) матрицы A — примерно, во сколько раз относительно можно ожидать увеличения относительной ошибки решения по сравнению с относительной ошибкой правой части. Чем больше число обусловленности, тем «опаснее» решать систему: даже точный метод может дать неточный ответ из-за входного шума. При этом сам алгоритм может быть стабильным (например, метод Гаусса с частичным выбором главного элемента обычно устойчив на практике): его вычисления дают решение, которое близко к решению немного изменённой системы. Это понятие *backward error* — метод возвращает решение не исходной системы, а слегка искажённой, и искажение малое.

Практические демонстрации помогают закрепить эти абстрактные идеи. Начнём с простейшего: сложение чисел разного масштаба. Пусть нужно посчитать 1 + 10^-16 в стандартной двойной точности (IEEE 754). Из-за того, что мантисса ограничена, 10^-16 будет слишком малой и «потеряется» — результат останется 1. Это явление называется *потерей значимых цифр* и часто проявляется при вычитании почти равных чисел. Например, если вы вычисляете корень уравнения разницы двух больших близких чисел, относительная погрешность результата может быть огромной. Один практический трюк — использовать алгебраические преобразования, которые избегают вычитания близких величин или применяют формулы с лучшей числовой устойчивостью (как при вычислении корней квадратного уравнения: выбирать формулу, предотвращающую вычитание больших близких корней).

Другой живой пример — решение обыкновенных дифференциальных уравнений (ОДУ) на компьютере. Возьмём метод Эйлера: x_{n+1} = x_n + h f(x_n). Он прост и понятен, но имеет ограниченную область устойчивости: если решается жёсткая система, в которой есть быстрые затухающие компоненты вместе с медленными, явный метод Эйлера потребует невероятно малого шага h, чтобы не «взорваться». Иначе говоря, даже если задача хорошо обусловлена, неустойчивый метод может превратить небольшие погрешности в катастрофу. Для жёстких ОДУ используют неявные методы (например, обратный Эйлер), которые обладают большей областью устойчивости (A-устойчивость), что позволяет брать