Как приближённо решать уравнения и оценивать погрешность?

Численный метод ищет не символическую формулу, а значение с заданной точностью. Ответ должен сопровождаться условием существования, критерием остановки и оценкой ошибки. Одно число после нескольких итераций не доказывает, что найден нужный корень или что требуемая точность достигнута.

Метод бисекции

Если непрерывная функция имеет значения разных знаков на концах [l, r], внутри существует корень. Вычисляют середину и сохраняют половину, где знаки различаются. После k шагов длина интервала уменьшается в 2ᵏ раз, поэтому легко заранее оценить число итераций.

Критерий остановки

Можно завершать, когда длина интервала не больше 2eps, тогда его середина отличается от любого корня внутри не более чем на eps. Проверка только |f(x)| < eps ненадёжна для очень пологой или очень крутой функции без дополнительного анализа.

Метод Ньютона

Итерация использует касательную: xₙ₊₁ = xₙ − f(xₙ)/f′(xₙ). При хорошем старте сходимость быстрая, но нулевая производная, далёкое приближение или сложная форма функции могут увести процесс. Метод требует больше условий, чем бисекция.

Геометрические величины

Длину кривой или площадь иногда оценивают разбиением области на простые элементы. Уменьшение шага обычно повышает точность, но увеличивает работу и влияние округлений. Сравнение результатов при h и h/2 даёт практический сигнал сходимости, хотя не заменяет теоретическую оценку.

Протокол решения

Укажите интервал, предпосылки метода, инвариант локализации корня и формулу ошибки. Затем проверьте функцию на концах и посчитайте необходимое число шагов до запуска. На устной части разделяйте погрешность метода, ошибку входных данных и округление машинной арифметики.

Критерий остановки должен контролировать искомую ошибку

Бисекция поддерживает отрезок, на концах которого непрерывная функция имеет разные знаки. После каждого шага длина интервала уменьшается вдвое, а корень остаётся внутри. Остановка по ширине интервала даёт прямую оценку ошибки координаты, тогда как маленькое |f(x)| не всегда означает близость к корню для очень пологой функции.

def bisect(function, left: float, right: float, tolerance: float) -> float:
    if tolerance <= 0:
        raise ValueError("positive tolerance required")
    if function(left) * function(right) > 0:
        raise ValueError("root is not bracketed")
    while right - left > 2 * tolerance:
        middle = (left + right) / 2
        if function(left) * function(middle) <= 0:
            right = middle
        else:
            left = middle
    return (left + right) / 2

root = bisect(lambda x: x * x - 2, 1, 2, 1e-8)

Повторный расчёт function(left) можно убрать сохранением значения. Простая версия оставлена читаемой, а оптимизацию следует делать без изменения инварианта.

Практика: точность, итерации и проверка

Найдите корень x³ − x − 2 на [1, 2] с допусками 10⁻², 10⁻⁶ и 10⁻¹⁰. Для каждого случая заранее оцените число итераций через длину интервала и степень двойки, затем сравните с фактом. Проверьте невыполненное условие разных знаков и корень на границе. Реализуйте метод Ньютона для той же функции и сравните скорость и требования к начальному приближению, не объявляя один метод безусловно лучшим.

Источники