Метод секущих: Ньютон без производной
Урок про метод секущих — практичную замену Ньютона, когда производная недоступна или дорога.
Метод секущих приближает корень, заменяя касательную секущей через две последние точки: $x_{n+1} = x_n - \frac{f(x_n) \cdot (x_n - x_{n-1})}{f(x_n) - f(x_{n-1})}$.
Идея: производная из двух точек
Метод Ньютона требует формулу производной $f'$. Но что, если f задана таблично, или её производную взять аналитически невозможно, или это дорого? Тогда заменим производную конечной разностью по двум последним точкам: $f'(x_n) \approx \frac{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
Скорость: золотое сечение
Сходимость секущих — сверхлинейная с порядком $\varphi \approx 1.618$ (золотое сечение!). Это медленнее квадратичного Ньютона (порядок 2), но намного быстрее линейной бисекции. И есть бонус: на шаг нужно одно новое вычисление f (значение $f(x_{n-1})$ переиспользуется), тогда как Ньютону нужны и $f$, и $f'$. Если f дорогая, секущие нередко выгоднее по реальному времени, несмотря на формально меньший порядок.
| Метод | Порядок | Нужна f'? | Вызовов f за шаг |
| Бисекция | 1 (линейный) | нет | 1 |
| Секущие | $\approx 1.618$ | нет | 1 |
| Ньютон | 2 (квадратичный) | да | 2 (f и f') |
Как работает под капотом
Секущие — частный случай интерполяции: мы проводим через две точки прямую и берём её корень. Можно провести параболу через три точки — получится метод Мюллера (порядок $\approx 1.84$, умеет находить и комплексные корни). Слабое место секущих общее с Ньютоном: нет гарантии сходимости при плохом старте, а если $f(x_n) \approx f(x_{n-1})$, знаменатель близок к нулю и шаг «выстреливает». Поэтому в надёжных солверах секущие тоже комбинируют с бисекцией — это и есть основа метода Брента, дефолтного в scipy.optimize.brentq.
Частые ошибки
- Старт с двух одинаковых точек. Тогда $f(x_1)=f(x_0)$ и деление на ноль — берите различающиеся $x_0, x_1$ по разные стороны корня.
- Нет защиты от $f_1 \approx f_0$. Около плоского участка знаменатель крошечный — шаг улетает; нужна проверка/откат к бисекции.
- Ожидать гарантию, как у бисекции. Секущие могут разойтись; для надёжности — гибрид с бисекцией.
Итоги
- Секущие = Ньютон, где производная заменена разностью по двум последним точкам.
- Сходимость сверхлинейная, порядок $\approx 1.618$; всего один новый вызов
fза шаг. - Не нужна формула $f'$ — идеально для табличных или «дорогих» функций.
- Нет гарантии при плохом старте; на практике — внутри гибридного метода Брента.