Реализации алгоритмов/Метод бисекции: различия между версиями

Метка: possible spambot (testing)
Пример реализации алгоритма на языке [[w:Matlab|Matlab]]:
<big><source lang="Matlab">
function [res, error] = bisection(fun, left, right, tol)
clear;
if fun(left)*fun(right) > 0
error('Значения функции на концах интервала должны быть разных знаков');
%Интервал
%Деление отрезка пополам
x_L=1;
middle = 0.5*(left +right);
x_R=2;
length=x_R-x_L;
%Начальная ошибка
err=length;
%Итерационный цикл
while errabs(fun(middle)) >1e-3 tol
%Нахождение нового интервала
%Деление отрезка пополам
left = left*(fun(left)*fun(middle) < 0) + middle*(fun(left)*fun(middle) > 0);
x_M=(x_L+x_R)/2;
right = right*(fun(right)*fun(middle) < 0) + middle*(fun(right)*fun(middle) > 0);
%Нахождение нового интервала
%Деление нового интервала пополам
if tan(x_L)*tan(x_M)<0
middle = 0.5*(left x_R=x_M+right);
elseend
res = middle;
if tan(x_M)*tan(x_R)<0
err = x_L=x_Mabs(fun(middle));
else
x_M
break;
end
end
%Пересчёт ошибки
err=(x_R-x_L)/length;
end
%Вывод результата
x_M
err
</source></big>
 
Пример работы алгоритма для поиска корня функции y = tan(x) на интервале [1; 2] с точностью 1e-3. Результат вполне ожидаемый:
Результат выполнения вполне ожидаемый:
<big><source lang="Matlab">
[res, err] = bisection('tan', 1, 2, 1e-3)
x_M =
res =
1.5713
err =
err =
9.7656e-004
Анонимный участник