Date Редакция Категория sci Теги matlab
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