Метод секущих: Ньютон без производной
Урок про метод секущих — практичную замену Ньютона, когда производная недоступна или дорога.
Метод секущих приближает корень, заменяя касательную секущей через две последние точки:
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'— идеально для табличных или «дорогих» функций. - Нет гарантии при плохом старте; на практике — внутри гибридного метода Брента.