Перейти к содержанию

Метод хорд

Материал из Мегавики — свободной энциклопедии

Метод хорд — итерационный численный метод приближённого нахождения корня уравнения.

Геометрическое описание метода секущих[править]

Будем искать нуль функции f(x). Выберем две начальные точки C1(x1;y1) и C2(x2;y2) и проведем через них прямую. Она пересечет ось абсцисс в точке (x3;0). Теперь найдем значение функции с абсциссой x3. Временно будем считать x3 корнем на отрезке [x1;x2]. Пусть точка C3 имеет абсциссу x3 и лежит на графике. Теперь вместо точек C1 и C2 мы возьмём точку C3 и точку C2. Теперь с этими двумя точками проделаем ту же операцию и так далее, то есть будем получать две точки Cn+1 и Cn и повторять операцию с ними. Отрезок, соединяющий последние две точки, пересекает ось абсцисс в точке, значение абсциссы которой можно приближённо считать корнем. Эти действия нужно повторять до тех пор, пока не получим значение корня с нужным приближением.

Алгебраическое описание метода секущих[править]

Пусть x1,x2 — абсциссы концов хорды, f(x)=0 — уравнение функции, решаемое методом секущих. Найдём коэффициенты k и b из системы уравнений

{f(x1)=kx1+b,f(x2)=kx2+b.

Вычтем из первого уравнения второе:

f(x1)f(x2)=k(x1x2),

затем найдём коэффициенты k и b:

k=f(x2)f(x1)x2x1,

тогда

b=f(x1)(f(x2)f(x1))x1x2x1.

Уравнение принимает вид

y=f(x2)f(x1)x2x1(xx1)+f(x1).

Таким образом, теперь можем найти первое приближение к корню, полученное методом секущих:

x3=x1(x2x1)f(x1)f(x2)f(x1).

Теперь возьмём координаты x2 и x3 и повторим все проделанные операции, найдя новое приближение к корню. Таким образом, итерационная формула метода секущих имеет вид:

xi+1=xi1f(xi1)(xixi1)f(xi)f(xi1).

Повторять операцию следует до тех пор, пока |xixi1| не станет меньше или равно заданному значению погрешности.

Метод хорд с итерационной формулой[править]

Первые три итерации метода хорд. Синим нарисована функция f(x), красными проводятся хорды

Иногда методом секущих называют метод с итерационной формулой

xi+1=xif(xi)(xix0)f(xi)f(x0).

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

Пример использования метода секущих[править]

Решим уравнение x318x83=0 методом секущих. Зададимся точностью ε=0.001 и возьмём в качестве начальных приближений x0 и x1 концы отрезка, на котором отделён корень: x0=8 и x1=3, числовые значения x0=8 и x1=3 выбраны произвольно. Вычисления ведутся до тех пор, пока не будет выполнено неравенство |xi+1xi|<ε.

В нашем примере, в значение xi1 подставляется x0=8, а в значение xi подставляется x1=3. Значение xi+1 это будет числовое значение x2=_4.3924051 полученное по этой формуле. В дальнейшем x2=_4.3924051 подставляем в формулу в значение xi, а x1=3 в значение xi1.

По этой формуле последовательно получаем (подчёркнуты верные значащие цифры): (картинка из метода хорд, но не секущих, просьба разделить разделы)

Метод секущих. Первый случай
  x2=_4.3924051; 
  x3=5_,1622721;
  x4=5_.4988422;
  x5=5,6_295040; 
  x6=5.6_777792;
  x7=5.6_952826;
  x8=5.70_15852;
  x9=5.70_38490;
  x10=5.704_6613; 
  x11=5.704_9528;

Проверим, что метод работает и в том случае, если x0 и x1 выбраны по одну и ту же сторону от корня (то есть, если корень не отделён на отрезке между начальными приближениями). Возьмём для того же уравнения x0=8 и x1=7. Тогда: (картинка уже не из метода секущих, а из метода дихотомии)

Метод секущих. Второй случай
  x2=_6.1125828; 
  x3=5_.8452240; 
  x4=5.7_546403; 
  x5=5.7_227874; 
  x6=5.7_114425;
  x7=5.70_73836;
  x8=5.705_9290; 
  x9=5.705_4075;

Мы получили то же значение корня за то же число итераций.

Сходимость метода секущих[править]

Итерации метода секущих сходятся к корню f(x), если начальные величины x0 and x1 достаточно близки к корню. Метод секущих является быстрым. Порядок сходимости α равен золотому сечению:

α=1+521,618...

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

Этот результат справедлив, если f(x) дважды дифференцируема и корень ξ не является кратным — f(ξ)0.

Как и для большинства быстрых методов, для метода секущих трудно сформулировать условия сходимости. Если начальные точки достаточно близки к корню, то метод сходится, но нет общего определения «достаточной близости». Сходимость метода определяется тем, насколько функция «волниста» в [x0,x1]. Например, если в интервале есть точка, в которой f(x)=0, то процесс может не сходиться.

Критерий и скорость сходимости метода хорд[править]

Если f(x) — дважды непрерывно дифференцируемая функция, и знак f(x) сохраняется на рассматриваемом промежутке, то полученные приближения будут сходиться к корню монотонно. Если корень ξ уравнения f(ξ)=0 находится на отрезке [a,b], производные f(x) и f(x) на этом промежутке непрерывны и сохраняют постоянные знаки и f(b)f(b)>0, то можно доказать[1], что погрешность приближенного решения стремится к нулю при n, то есть метод сходится и сходится со скоростью геометрической прогрессии (при этом говорят, что он имеет линейную скорость сходимости).

Историческая справка[править]

Первым, кто смог найти приближённые решения кубических уравнений, был Диофант, тем самым заложив основу метода хорд. Сохранившиеся работы Диофанта сообщают об этом. Однако первым, кто понял его методы, был Ферма в XVII веке, а первым, кто дал объяснение методу хорд, был Ньютон (1670-е гг.).[2]

Реализация[править]

C++[править]

#include <iostream>
#include <math.h>

double f(double x) {
    return sqrt(fabs(cos(x))) - x; // Заменить функцией, корни которой мы ищем
}

// a, b - пределы хорды, epsilon — необходимая погрешность
double findRoot(double a, double b, double epsilon) {
    while(fabs(b - a) > epsilon) {
        a = a - (b - a) * f(a) / (f(b) - f(a));
        b = b - (a - b) * f(b) / (f(a) - f(b));
    }
    // a, b — (i - 1)-й и i-й члены

    return b;
}

Python[править]

from math import sin
from typing import Callable
import unittest


def secant(f: Callable[[float], float], x0: float, eps: float=1e-7, kmax: int=1e3) -> float:
	"""
	solves f(x) = 0 by secant method with precision eps
	:param f: f
	:param x0: starting point
	:param eps: precision wanted
	:return: root of f(x) = 0
	"""
	x, x_prev, i = x0, x0 + 2 * eps, 0
	
	while abs(x - x_prev) >= eps and i < kmax:
		x, x_prev, i = x - f(x) / (f(x) - f(x_prev)) * (x - x_prev), x, i + 1

	return x


class TestSecant(unittest.TestCase):
	def test_0(self):
		def f(x: float) -> float:
			return x**2 - 20 * sin(x)


		x0, x_star = 2, 2.7529466338187049383

		self.assertAlmostEqual(secant(f, x0), x_star)


if __name__ == '__main__':
	unittest.main()

Модификации[править]

Метод ложного положения[англ.] отличается от метода секущих только тем, что всякий раз берутся не последние 2 точки, а те точки, которые находятся вокруг корня.

См. также[править]

Литература[править]

  1. Демидович Б. П. и Марон И. А. Основы вычислительной математики. — Наука, 1970. — С. 664.
  2. Бахвалов, Жидков, Кобельков. Численные методы. — Наука. — ISBN 5-94774-060-5.

Примечания[править]

  1. Алгебра. Дата обращения: 24 ноября 2009. Архивировано из оригинала 3 декабря 2007 года.
  2. Математика и её история. Джон Стиллвелл

Ссылки[править]