Метод секущих: Ньютон без производной

Урок про метод секущих — практичную замену Ньютона, когда производная недоступна или дорога.

Метод секущих приближает корень, заменяя касательную секущей через две последние точки: x_{n+1} = x_n − f(x_n)·(x_n − x_{n−1}) / (f(x_n) − f(x_{n−1})).

Идея: производная из двух точек

Метод Ньютона требует формулу производной f'. Но что, если f задана таблично, или её производную взять аналитически невозможно, или это дорого? Тогда заменим производную конечной разностью по двум последним точкам: f'(x_n) ≈ (f(x_n) − f(x_{n−1})) / (x_n − x_{n−1}). Это наклон секущей — прямой через две точки графика. Подставив в формулу Ньютона, получаем итерацию секущих. Геометрически: вместо касательной проводим секущую через две последние точки и берём её пересечение с осью.

def секущие(f, x0, x1, eps=1e-12, max_iter=20):
    f0, f1 = f(x0), f(x1)
    for n in range(1, max_iter + 1):
        if f1 == f0:
            break
        x2 = x1 - f1 * (x1 - x0) / (f1 - f0)   # пересечение секущей с осью
        print(f"шаг {n}: x = {x2:.12f}   f(x) = {f(x2):+.2e}")
        if abs(x2 - x1) < eps:
            return x2
        x0, f0 = x1, f1
        x1, f1 = x2, f(x2)
    return x1

# Корень x^3 - x - 2 = 0 (он около 1.5214), старт x0=1, x1=2
корень = секущие(lambda x: x**3 - x - 2, 1.0, 2.0)
print(f"\nкорень = {корень:.12f}")

Вывод:

шаг 1: x = 1.333333333333   f(x) = -9.63e-01
шаг 2: x = 1.462686567164   f(x) = -3.33e-01
шаг 3: x = 1.531169432141   f(x) = +5.86e-02
шаг 4: x = 1.520926420515   f(x) = -2.69e-03
шаг 5: x = 1.521376316670   f(x) = -2.02e-05
шаг 6: x = 1.521379707985   f(x) = +7.02e-09
шаг 7: x = 1.521379706805   f(x) = -1.84e-14
шаг 8: x = 1.521379706805   f(x) = +0.00e+00

корень = 1.521379706805

Скорость: золотое сечение

Сходимость секущих — сверхлинейная с порядком φ ≈ 1.618 (золотое сечение!). Это медленнее квадратичного Ньютона (порядок 2), но намного быстрее линейной бисекции. И есть бонус: на шаг нужно одно новое вычисление f (значение f(x_{n−1}) переиспользуется), тогда как Ньютону нужны и f, и f'. Если f дорогая, секущие нередко выгоднее по реальному времени, несмотря на формально меньший порядок.

МетодПорядокНужна f'?Вызовов f за шаг
Бисекция1 (линейный)нет1
Секущие≈ 1.618нет1
Ньютон2 (квадратичный)да2 (f и f')

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

Секущие — частный случай интерполяции: мы проводим через две точки прямую и берём её корень. Можно провести параболу через три точки — получится метод Мюллера (порядок ≈ 1.84, умеет находить и комплексные корни). Слабое место секущих общее с Ньютоном: нет гарантии сходимости при плохом старте, а если f(x_n) ≈ f(x_{n−1}), знаменатель близок к нулю и шаг «выстреливает». Поэтому в надёжных солверах секущие тоже комбинируют с бисекцией — это и есть основа метода Брента, дефолтного в scipy.optimize.brentq.

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

  • Старт с двух одинаковых точек. Тогда f(x_1)=f(x_0) и деление на ноль — берите различающиеся x0, x1 по разные стороны корня.
  • Нет защиты от f1 ≈ f0. Около плоского участка знаменатель крошечный — шаг улетает; нужна проверка/откат к бисекции.
  • Ожидать гарантию, как у бисекции. Секущие могут разойтись; для надёжности — гибрид с бисекцией.

Итоги

  • Секущие = Ньютон, где производная заменена разностью по двум последним точкам.
  • Сходимость сверхлинейная, порядок ≈ 1.618; всего один новый вызов f за шаг.
  • Не нужна формула f' — идеально для табличных или «дорогих» функций.
  • Нет гарантии при плохом старте; на практике — внутри гибридного метода Брента.
Проверьте себя
1. Чем секущие отличаются от Ньютона?
AДелят отрезок пополам
BЗаменяют производную f' разностью по двум последним точкам
CТребуют вторую производную
DРаботают только для многочленов
2. Каков порядок сходимости метода секущих?
A1 (линейный)
B≈ 1.618 (золотое сечение)
C2 (квадратичный)
D3 (кубический)
3. В чём практическое преимущество секущих перед Ньютоном при дорогой f?
AГарантированная сходимость
BОдин новый вызов f за шаг вместо вычисления и f, и f'
CОни всегда точнее
DИм не нужен начальный отрезок