martes, 22 de octubre de 2019

MATLAB code False Position Method (root)



Flase_position
%The sequence of points that converges to the root is
%generated via c=[a*f(b)-b*f(a)]/[f(b)-f(a)]

f = @(x)(x*cos(x)+1);

%
% False position uses the regula falsi method to approximate a root of f(x) = 0
% in the interval [a,b].
%
%       f is an anonymous function representing f(x),
%       a and b are the limits of interval [a,b],
%       kmax is the maximum number of iterations (default 20),
%       tol is the scalar tolerance for convergence (default 1e-4),
%
%       r is the approximate root of f(x) = 0,
%       k is the number of iterations needed for convergence.
%
a=-2;
b=4;
tol = 1e-2;
kmax = 20;
c = zeros(1,kmax);      % Pre-allocate
if f(a)*f(b) > 0
     r = 'failure';
     return
end
disp(' k      a           b')
for k = 1:kmax,
    c(k) = (a*f(b)-b*f(a))/(f(b)-f(a));      % Find the x-intercept
    if f(c(k)) == 0      % Stop if a root has been found
        return
    end
   fprintf('%2i      %11.6f%11.6f\n',k,a,b)
    if f(b)*f(c(k)) > 0      % Check sign changes
        b = c(k);          % Adjust the endpoint of interval
    else a = c(k);
    end
    c(k+1) = (a*f(b)-b*f(a))/(f(b)-f(a));   % Find the next x-intercept
    if abs(c(k+1)-c(k)) < tol,     % Stop if tolerance is met
        r = c(k+1);
        break
    end
end

fx = f(r);
fprintf('r =  %11.6f\n', r);
fprintf('k = %11.1f\n', k);

mp = linspace(-2,4);
fp = arrayfun(f,mp,'UniformOutput',false); %func(mp);
fp = cat(1, fp{:});
hold on
plot(mp,fp),grid
plot(r,fx,'.','MarkerSize',20)
hold off
k      a           b
 1        -2.000000   4.000000
 2         1.189493   4.000000
 3         1.189493   2.515720
 4         1.960504   2.515720
r =     2.073843
k =         4.0

No hay comentarios:

Publicar un comentario