2014-04-27 4 views
1

Здравствуйте, мы должны реализовать метод bisection, чтобы найти корень функции в интервале [a, b]. Алгоритм должен возвращать 1. корень «c» 2. значение функции «yc» 3. количество итераций «itcount».Проблемы с Bisection Matlab, реализующие

Вот что я до сих пор:

function [ r, c, yc, itcount] = bisection(f, a, b, N, eps) 
% Check that that neither end-point is a root 
% and if f(a) and f(b) have the same sign, throw an exception. 

if (f(a) == 0) 
r = a; 
return; 
elseif (f(b) == 0) 
r = b; 
return; 
elseif (f(a) * f(b) > 0) 
    error('f(a) and f(b) do not have opposite signs'); 
end 

% We will iterate N times and if a root was not 
% found after N iterations, an exception will be thrown. 

for k = 1:N 
    % Find the mid-point 
    c = (a + b)/2; 
    yc = feval(f,c); 
    itcount = abs(b-a)/2; 
    % Check if we found a root or whether or not 
    % we should continue with: 
    %   [a, c] if f(a) and f(c) have opposite signs, or 
    %   [c, b] if f(c) and f(b) have opposite signs. 

    if (f(c) == 0) 
     r = c; 
     return; 
    elseif (f(c)*f(a) < 0) 
     b = c; 
    else 
     a = c; 
    end 

    % If |b - a| < eps_step, check whether or not 
    %  |f(a)| < |f(b)| and |f(a)| < eps_abs and return 'a', or 
    %  |f(b)| < eps_abs and return 'b'. 

    if (b - a < eps) 
     if (abs(f(a)) < abs(f(b)) && abs(f(a)) < eps) 
      r = a; 
      return; 
     elseif (abs(f(b)) < eps) 
      r = b; 
      return; 
     end 
    end 
end 

error('the method did not converge'); 
end 

Я уже создал файл .m для функции Я хочу, чтобы найти корень. И алгоритм работает, но он возвращает только корень, но не значение функции и количество итераций. Что я делаю не так?

ответ

0

Ваш алгоритм кажется правильным. Вы должны получить результат как вектор.

[r, c, yc, itcount] = bisection(@f,.......) 

вызова, как это будет только вам первый элемент

an = bisection(@f,.......) 

видеть эту резьбовых> MATLAB - multiple return values from a function?

Смежные вопросы