В численном анализе метод секанса представляет собой алгоритм поиска корня который использует последовательность корней из секущих линий для лучшего приближения корня функции f. Метод секущей можно рассматривать как конечно-разностную аппроксимацию метода Ньютона. Однако этот метод был разработан независимо от метода Ньютона и предшествует ему более чем на 3000 лет.
Метод секущей определяется рекуррентным соотношением
Как видно из рекуррентного соотношения, секущий метод требует двух начальных значений, x 0 и x 1, которые в идеале следует выбирать так, чтобы они располагались близко к корню.
Начиная с начальных значений x 0 и x 1, строим линию через точки (x 0, f (x 0)) и (x 1, f (x 1)), как показано на рисунке выше. В форме углового пересечения уравнение этой прямой имеет вид
Корень этой линейной функции, то есть значение x такое, что y = 0 равно
Затем мы используем это новое значение x как x 2 и повторяем процесс, используя x 1 и x 2 вместо x 0 и x 1. Мы продолжаем этот процесс, решая для x 3, x 4 и т. Д., Пока не достигнем достаточно высокого уровня точности (достаточно малая разница между x n и x n − 1):
Итерации метода секущей сходятся к корню из , если исходные значения и достаточно близки к корню. Порядок сходимости равен φ, где
- это золотое сечение. В частности, сходимость суперлинейная, но не совсем квадратичная.
. Этот результат справедлив только при некоторых технических условиях, а именно, что дважды непрерывно дифференцируем и Рассматриваемый корень должен быть простым (т.е. с кратностью 1).
Если начальные значения недостаточно близки к корню, то нет гарантии, что метод секущей сходится. Не существует общего определения термина «достаточно близко», но критерий имеет отношение к тому, насколько «волнистой» функция находится на интервале . Например, если дифференцируемо в этом интервале, и есть точка, где на интервале, то алгоритм может не сойтись.
Метод секанса не требует, чтобы корень оставался заключенным в квадратные скобки, как это делает метод деления пополам, и, следовательно, он не всегда сходится. Метод ложного положения (или regula falsi) использует ту же формулу, что и метод секущей. Однако формула не применяется к и , как метод секущей, но на и на последней итерации такие, что и иметь другой знак. Это означает, что метод ложного положения всегда сходится.
Повторяющаяся формула метода секущих может быть получена из формулы для метода Ньютона
с помощью конечного -разность приближение
Метод секущей можно интерпретировать как метод, в котором производная заменяется приближением и, таким образом, является квазиньютоновским методом.
Если мы сравним метод Ньютона с секущей, мы видим, что метод Ньютона сходится быстрее (порядок 2 против φ ≈ 1,6). Однако метод Ньютона требует оценки как , так и его производной на каждом шаге, в то время как Метод секущей требует только оценки . Следовательно, на практике метод секущей иногда может быть быстрее. Например, если мы предположим, что вычисление занимает столько же времени, сколько и вычисление его производной, и мы пренебрегаем всеми другими затратами, мы можем выполнить два шага метода секущей (уменьшение логарифм ошибки с коэффициентом φ ≈ 2,6) за ту же стоимость, что и один шаг метода Ньютона (уменьшение логарифма ошибки в 2 раза), поэтому метод секущей работает быстрее. Если, однако, мы рассматриваем параллельную обработку для вычисления производной, метод Ньютона доказывает свою ценность, будучи более быстрым во времени, хотя при этом затрачивая больше шагов.
Метод Бройдена - это обобщение метода секущих более чем на одно измерение.
На следующем графике функция f показана красным цветом, а последняя секущая линия - жирным синим. На графике пересечение секущей линии по оси x кажется хорошим приближением к корню из f.
Ниже метод секущей реализован на языке программирования Python.
Затем он применяется для нахождения корня функции f (x) = x - 612 с начальными точками и
def secant_method (f, x0, x1, iterations): "" "Возвращает корень, вычисленный с использованием метода секанса." "" для i в диапазоне (итераций): x2 = x1 - f (x1) * (x1 - x0) / float (f (x1) - f (x0)) x0, x1 = x1, x2 return x2 def f_example (x): return x ** 2 - 612 root = secant_method (f_example, 10, 30, 5) print ("Root: {}". format (root)) # Root: 24.738633748750722