Está en la página 1de 4

disp(' METODO DE LA BISECCION ');

disp('POR OSCAR CANO FELIX ');


f=input('INGRESE FUNCION: ','s'); 
xai=input('INGRESE LIMITE INFERIOR DEL INTERVALO: ');
xbi=input('INGRESE LIMITE SUPERIOR DEL INTERVALO: '); 
tol=input('INGRESE PORCENTAJE DE ERROR: '); 
f=inline(f);
i=1;
ea(1)=100;
if f(xai)*f(xbi) < 0
xa(1)=xai;
xb(1)=xbi;
xr(1)=(xa(1)+xb(1))/2;
fprintf('It. Xa Xr Xb Error aprox \n');
fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
while abs(ea(i)) >= tol,
if f(xa(i))*f(xr(i))< 0
xa(i+1)=xa(i);
xb(i+1)=xr(i);
end
if f(xa(i))*f(xr(i))> 0
xa(i+1)=xr(i);
xb(i+1)=xb(i);
end 
xr(i+1)=(xa(i+1)+xb(i+1))/2;
ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',...
i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
i=i+1;
end
else
fprintf('No existe una raiz en ese intervalo');
end
bisec_g.m

function bisec_g(f_name, a,c, xmin, xmax, n_points) 


f_name 
%a, c : extremos del intervalo inicial 
%tolerance:tolerancia 
%It_limit:límite de el número de iteraciones 
%Y_a, Y_c : valores de los extremos actuales 
%fun_f(x): valor funcional en x 
clg, hold off 
clear Y_a, clear Y_c 
wid_x= xmax-xmin; dx = (xmax-xmin)/n_points; 
xp=xmin:dx:xmax; 
yp = feval(f_name, xp); 
plot (xp,yp); xlabel('x'); ylabel('f(x)'); 
title('Método de la bisectriz'), hold on 
ymin=min(yp); ymax=max(yp); wid_y=ymax-ymin; 
yp=0.*xp; plot(xp,yp); 
fprintf('Método de la bisectriz: \n\n'); 
tolerance=0.000001; it_limit=30; 
fprintf(' It. a b c fa=f(a) '); 
fprintf(' fc=f(c) abs(fc-fa) \n'); 
it=0; 
Y_a=feval(f_name,a);Y_c=feval(f_name, c); 
plot([a,a], [Y_a,0]); text(a,-0.1*wid_y,'x=a') 
plot([c,c], [Y_c,0]); text(c,-0.1*wid_y,'x=c') 
if (Y_a*Y_c > 0) fprintf('f(a)f(c > 0 \n'); 
else 
while 1 
it=it+1; 
b= (a+c)/2; Y_b=feval(f_name, b); 
plot([b,b], [Y_b,0],':'); plot(b,0,'o') 
if it<4, text(b,wid_y/20, [num2str(it)]),end 
fprintf('%3.0f %10.6f, %10.6f', it, a, b); 
fprintf(' %10.6f, %10.6f, %10.6f', c, Y_a, Y_c); 
fprintf(' %12.3e\n', abs((Y_c-Y_a))); 
if (abs(c-a)<=tolerance) 
fprintf(' Se satisface la tolerancia. \n');break 
end 
if( it>it_limit ) 
fprintf(' Se exedio el limite de iteraciones. \n');break 
end 
if (Y_a*Y_b <= 0) c=b; Y_c=Y_b; 
else a=b; Y_a=Y_b; 
end 
end 
fprintf('Resultado final: Raíz=%12.6f \n',b); 
end 
x=b; 
plot([x x],[0.05*wid_y 0.2*wid_y]) 
text(x, 0.25*wid_y, 'Solución final') 
plot([x( x-wid_x*0.004)], [0.05*wid_y 0.09*wid_y]) 
plot([x( x+wid_x*0.004)], [0.05*wid_y 0.09*wid_y])
function x = biseccion(fun,a,b,tol)
% Aproxima por el método de la bisección una raíz de la ecuación fun(x)=0
disp('Método de la bisección');
u=feval(fun,a);
v=feval(fun,b);
n=1;
if sign(u)==sign(v)
disp('Error la función debe cambiar de signo en (a,b)');
end
while ((b-a)*0.5=tol)
c=(b+a)/2; w=feval(fun,c);
disp(['n=', num2str(n)]);
disp(['c=', num2str(c)]);
disp(['f(c)=', num2str(w)]);
if sign(u)==sign(w)
a = c; u=w;
else
b=c; v=w;
end
n=n+1;
end;
x=c;

También podría gustarte