Компания ALT Linux
Опубликован: 24.03.2015 | Доступ: свободный | Студентов: 550 / 136 | Длительность: 19:00:00
Лекция 8:

Реализация некоторых численных методов

8.1.2 Метод простых итераций

В ряде случаев весьма удобным приёмом уточнения корня уравнения является метод последовательных приближений (метод итераций).

Пусть с точностью \varepsilon необходимо найти корень уравнения f(x) = 0, принадлежащий интервалу изоляции [a,b]. Функция f(x) и ее первая производная непрерывны на этом отрезке.

Для применения этого метода исходное уравнение f(x) = 0 должно быть приведено к виду x=\varphi(x).

В качестве начального приближения может быть выбрана любая точка интервала [a,b].

Далее итерационный процесс поиска корня строится по схеме:

x_1=f(x_0), \\ 
x_2=f(x_1), \\ 
\ldots \\ 
x_n=f(x_{n-1})

В результате итерационный процесс поиска реализуется рекуррентной формулой. Процесс поиска прекращается, как только выполняется условие \lvert x_n-x_{n-1} \rvert \le \varepsilon или число итераций превысит заданное число N.

Для того, чтобы последовательность x_1,x_2,... ,x_n приближалась к искомому корню, необходимо, чтобы выполнялось условие сходимости \lvert \varphi'(x) \rvert <1.

Пример реализации метода итераций представлен ниже:

(%i1)	f:exp(-x)-x$
beta:0.1$ x1:1$ x0:0$ eps:0.000001$ p:0$
while abs(x1-x0)>eps do
		(x0:x1, p:p+1, x1:float(x0+beta*(subst(x0,x,f))))$
print("Число итераций ",p," ","Решение ",float(x1),
" Невязка ",float(abs(x1-x0)))$
Число\ итераций\ 67\ Решение\ 0.56714848327814\\
Невязка\ 9.65029803623451710_7

8.1.3 Метод Ньютона (метод касательных)

Рассмотренные ранее методы решения нелинейных уравнений являются методами прямого поиска. В них для нахождения корня используется нахождение значения функции в различных точках интервала [a,b].

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

Рассмотрим нелинейное уравнение f(x) = 0, для которого необходимо найти корень на интервале [a,b] с точностью \varepsilon.

Метод Ньютона основан на замене исходной функции f(x), на каждом шаге поиска касательной, проведённой к этой функции. Пересечение касательной с осью X дает приближение корня.

Выберем начальную точку x_0 = b (конец интервала изоляции). Находим значение функции в этой точке и проводим к ней касательную, пересечение которой с осью X дает первое приближение корня x_1:

x_1 = x_0 - h_0, \qquad \text{где}\\
h_0= \frac{f(x_0)}{\tg(\alpha)}= \frac{f(x_0)}{f'(x_0)}.

Поэтому x_1=x_0-\dfrac{f(x_0)}{f'(x_0)}.

В результате, итерационный процесс схождения к корню реализуется рекуррентной формулой

x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}

Процесс поиска продолжаем до тех пор, пока не выполнится условие: \lvert x_{n+1}-x_n \rvert \le \varepsilon, откуда \lvert \cfrac{f(x_n)}{f'(x_n)}\rvert \le\varepsilon.

Метод обеспечивает быструю сходимость, если выполняется условие: f(x_0)\cdot f''(x_0) > 0, т.е. первую касательную рекомендуется проводить в той точке интервала [a,b], где знаки функции f(x_0) и ее кривизны f''(x_0) совпадают.

Пример реализации метода Ньютона в Maxima представлен ниже:

(%i1)	newton(f,x0,eps):=block([df,xn,xn0,r,p],
	xn0:x0, df:diff(f,x),
	p:0, r:1,
	while abs(r)>eps do (
		p:p+1, xn:xn0-float(subst(xn0,x,f)/subst(xn0,x,df)),
		print("x0,x1 ",xn0,xn),r:xn-xn0, xn0:xn
	),
	[xn,p])$

Последовательность команд для обращения к функции newton и результаты вычислений представлены в следующем примере:

(%i2)	f:exp(-x)-x$
	eps:0.000001$ xrez:newton(f,1,eps)$
	print("Решение ",xrez[1]," Число итераций ",xrez[2],
	" Невязка ",subst(xrez[1],x,f))$
x0,x1$ \quad 1.53788284273999\\
x0,x1$ \quad 0.53788284273999 \quad  0.56698699140541\\
x0,x1$ \quad 0.56698699140541 \quad  0.56714328598912\\
x0,x1$ \quad 0.56714328598912 \quad  0.56714329040978\\
Решение\quad 0.56714329040978\quad Число\,итераций\,\, 4  \quad  
Невязка\,\, 0.0

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