Метод на допирателните (Нютон) за решаване на уравнения 
f(x) = 0

Задача: Дадено е уравнението (((x^2)-2x - 4)/(x+1)) = 0.
a) Да се намери броят на всички корени и да се локализира (1) най-големия, (2) най-малкия от тях (в случай на повече от един корени).
б) Направете 2 итерации по метода на Нютон (допирателните).
в) Каква е точността на последно полученото в б) приближение? 
г) Да се намери локализирания от подточка а) корен с точност (10^(-14)).

I. Локализация на корен:
a = ?, b = ? , такива че x* ∈ [a, b]

f[x_]:=(((x^2)-2x-4)/(x+1));
Plot[f[x],{x,-10,10}]

Извод: Броят на корените е 2.

Локализираме най-големия корен:

Plot[f[x],{x,3.2,3.3}]

f[3.2]*f[3.3]

Извод: В интервала [3.2, 3.3] има корен.

II. Проверка на условията за сходимост на метода:
f’(x), f’’(x) да са с постоянни знаци в интервала [a, b]

Plot[f'[x],{x,3.2,3.3}]

Извод: Първата производна има само положителни стойности в интервала [3.2, 3.3]

Plot[f''[x],{x,3.2,3.3}]

Извод: Втората производна има само отрицателни стойности в интервала [3.2, 3.3]

III. Определяне на начално приближение:
 (Subscript[x, 0]) = ?, такова че f((Subscript[x, 0])).f’’(x) > 0

Т.к. f’’(x)<0 => търсим такова (Subscript[x, 0]) че f((Subscript[x, 0]))<0:

f[3.2]

f[3.3]

x0 = 3.2;

IV. Уточняване на корена:
(Subscript[x, n+1]) = (Subscript[x, n]) - ((f((Subscript[x, n])))/(f'((Subscript[x, n])))), n = 0,1,2,...
с оценка на грешката (Subscript[ϵ, n]) = |x* - (Subscript[x, n])|:
(Subscript[ϵ, n])  ⩽ ((Subscript[M, 2])/(2 (Subscript[m, 1]))) |(Subscript[x, n])-(Subscript[x, n-1])((|)^2), 
където (Subscript[M, 2]) = (max_([a,b]))|f’’(x)| , (Subscript[m, 1 ]) = (min_([a,b]))|f’(x)|

Определяне на постоянните величини
(Subscript[M, 2]) = ?,  (Subscript[m, 1 ])=?

Plot[Abs[f''[x]],{x,3.2,3.3}]

M2 = Abs[f''[3.2]]

Plot[Abs[f'[x]],{x,3.2,3.3}]

m1 = Abs[f'[3.3]]

K = (M2/(2m1))

Извършване на итерациите

Извършваме итерациите последователно като използваме Mathematica за калкулатор:

Нулева итерация:

f[3.2]

f'[3.2]

Първа итерация:

3.2 - ((-0.0380952)/1.05669)

x1 = x0 - ((f[x0])/(f'[x0]))

eps1 = K ((Abs[x1-x0])^2)

f[x1]

f'[x1]

Втора итерация:

x2 = x1-((f[x1])/(f'[x1]))

f[x2]

f'[x2]

eps1 = K ((Abs[x2-x1])^2)

Съставяме програмен код на Mathematica, който извършва итерациите и печата необходимите ни величини:

x = x0;
Print["n = 0: x = ",x, " f(x) = ", f[x], " f'(x) = ", f'[x]];
For[n=1,n≤2,n++,
xnew = x-((f[x])/(f'[x]));
epsn = K ((Abs[xnew - x])^2);
x = xnew;
Print["n = ",n,": x = ",x, " f(x) = ", f[x], " f'(x) = ", f'[x], " (Subscript[e, n]) = ", epsn];]

Със стоп-критерий:

x = x0;
Print["n = 0: x = ",x, " f(x) = ", f[x], " f'(x) = ", f'[x]];
eps = (10^(-14));
epsn = 10;
For[n=1,epsn>eps,n++,
xnew = x-((f[x])/(f'[x]));
epsn = K ((Abs[xnew - x])^2);
x = xnew;
Print["n = ",n,": x = ",x, " f(x) = ", f[x], " f'(x) = ", f'[x], " (Subscript[e, n]) = ", epsn];]

💡 Тайни козове

Solve

FindRoot