¿
Требуется решить уравнение вида 𝑓(𝑥)=0, 𝑓: ℝ→ℝ с некоторой точностью ε (¿ x n−x ∨¿<𝜀),
¿
где x −корень, x n−приближённое решение.
1. f ( x ) ∈C (2) на[a , b]
2. Существует промежуток [a , b], на концах которого функция принимает
значения противоположных знаков: f ( a )∗f ( b ) <0
3. f ' ( x )знако-постоянна на [a , b]
4. f ' ' ( x )знако-постоянна на [a , b]
''
5. На начальном приближении x 0 : f ( x 0 )∗f ( x 0 ) >0 (условие для монотонной
сходимости)
Алгоритм метода:
'
f ( x k )−f ( x k−1 )
f ( xk ) ≈
x k −x k−1
Тогда для итерационного процесса получаем формулу:
x k −x k−1
x k+1=x k −f ( xk )
f ( x k ) −f ( x k−1)
Заметим, что метод является двухшаговым, т.е. для нового приближения требуются два
предыдущих и их значения. Соответственно, для начала метода требуется два
приближения x 0 , x 1. Причем, для монотонной сходимости метода требуется, чтобы для
этих точек выполнялось условие 5. из достаточных условий.
Скорость сходимости метода секущих меньше (1,618…), чем для метода Ньютона (2).
Однако, метод оказывается полезным, когда вычисление производной функции на каждой
итерации в методе Ньютона является трудоемким.
Видим на графике три пересечения f (x) с осью абсцисс (корни). Будем искать корень
¿
x =9.
Реализация метода:
%% начальное приближение
x_0 = 9.5
x_1 = 10
%%Secant method
x0 = x_0
x1 = x_1
y0 = f(x0)
y1 = f(x1)
N = 100
X_ERR = 1:1:N;
ERR = zeros(1, N);
for i = 1:N
if (y0 == 0)
x2 = x0
ERR(i) = abs(x2 - xr);
break
elseif (y1 == 0)
x2 = x1
ERR(i) = abs(x2 - xr);
break
end
x2 = x1 - y1*((x1 - x0)/(y1 - y0));
x0 = x1;
y0 = y1;
x1 = x2;
y1 = f(x1);
ERR(i) = abs(x2 - xr);
end
x2
x2 = 6
Нарушение достаточных условий привело к сходимости метода к другому корню
уравнения.
¿
Теперь все для того же корня x =9 возьмем близкие к предыдущим начальные
приближения x 0=6.7 , x 1=10. Для такого начального приближения также нарушается
условие знакопостоянства f ' (x) на исследуемом промежутке. Можно убедиться в этом,
посмотрев на вышеприведенные графики функции и ее производных.
Посмотрим на сходимость метода при таких условиях:
x2 = 9
Из графика видно, что метод сошелся, и даже к искомому корню. Однако характер
сходимости немонотонный: на начальных итерациях наблюдается уменьшение точности.
Это связано с тем, что на выбранном интервале f ' ( x) не знакопостоянна и после этого
скачка метод мог начать сходиться к другому корню, как это наблюдалось в предыдущем
примере.
fzero(f,10)
ans = 9
fzero(f,[6.1 10])
ans = 9
fzero(f,[7 10])
ans = 9
options1 = optimset('TolX',10^-3);
fzero(f, 10, options1)
ans =
9.003295842815445
options2 = optimset('Display','iter');
fzero(f, 10, options2)
Из данного примера виден алгоритм работы функции fzero. Сначала идет поиск
промежутка, на котором функция меняет знак. Затем с помощью метода обратной
квадратичной интерполяции осуществляется поиск значения корня.
p = [1 -17 84 -108]
roots(p)
ans =
9.000000000000004
5.999999999999980
2.000000000000001
Из документации MatLab: «Приведенными результатами являются точные собственные
значения матрицы в ошибке округления сопровождающей матрицы, A. Однако это не
означает, что они - точные корни полинома, коэффициенты которого в ошибке округления
тех в p».
Пример Уилкинсона:
20 19
Рассмотрим многочлен: P20 ( x )= ( x −1 )( x−2 ) … ( x−20 ) =x −210 x +…+20 !
Он имеет 20 хорошо отделимых корней. Однако при ошибке порядка машинного нуля в
коэффициенте при x 19: −( 210+2−23 ) ≈−(210+ 10−7 ), полученный полином будет иметь
качественно другие корни:
Результаты:
r_p_err =
8.960708262972233
6.021844995846221
1.999464723199543
accuracy =
0.039291737027767
0.021844995846221
0.000535276800457
Ошибка вычисленных корней того же порядка, что и внесенные возмущения, корни
качественно не поменялись (остались вещественными). Можно сделать вывод, что
полином устойчив к возмущениям.