function root = bisect(func,a,b,tol)
% BISECT Поиск нулей функции f(x) методом бисекции.
% ВВОД:
% func = дескриптор функции f(x).
% a,b = границы интервала поиска корня.
% tol = погрешность поиска (по умолчанию tol=1e-4).
% ВЫВОД:
% root = корень f(x).
if nargin < 4; tol = 1e-4; end
f1 = feval(func,a);
if f1 == 0; root = a; return; end
f2 = feval(func,b);
if f2 == 0; root = b; return; end
if f1*f2 > 0;
error('Нет корней в интервале (a,b)')
end
n = ceil( log(abs(b - a)/tol)/log(2.) );
for i = 1:n
c = 0.5*(a + b);
f3 = feval(func,c);
if f3 == 0
root = c; return
end
if f2*f3 < 0
a = c; f1 = f3;
else
b = c; f2 = f3;
end
end
root = (a + b)/2;
Тест:
fun = @(x) 5*x^4 - 2.7*x^2 - 2*x + .5;
a = .1;
b = .5;
tol = 1e-5;
x = bisect(fun, a, b, tol);
disp(x)
Результат:
0.200000000000000
Комментарии
comments powered by Disqus