You are on page 1of 8

%Metodo de Biseccion - Metodos Numericos Matlab

clc;
Fx=input('Ingrese la funcion: ','s');
a=input('Ingrese a : ');
c=input('Ingrese c : ');
e=input('Ingrese el error : ');
x=a;
Fa=eval(Fx);
x=c;
Fc=eval(Fx);
fprintf('\n %6s %7s %8s %10s %8s %8s %8s \n ','A','B','C','F(a)','F(b)','F(c)','
|c-a|');
while abs(c-a)>e
b=(a+c)/2;
x=b;
Fb=eval(Fx);
fprintf('\n %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f \n',a,b,c,Fa,Fb,Fc,abs
(c-a));
if Fa*Fb<=0
c=b;
Fc=Fb;
else
a=b;
Fa=Fb;
end
end
fprintf('\nEl resultado sera %.4f\n',b);
ezplot(Fx);%graficamos la funcion
grid on;

Fx=input('Ingrese la funcion: ','s');


a=input('Ingrese a : ');
c=input('Ingrese c : ');
e=input('Ingrese el error : ');
x=a;
Fa=eval(Fx);
x=c;
Fc=eval(Fx);
fprintf('\n %6s %7s %8s %10s %8s %8s %8s \n ','A','B','C','F(a)','F(b)','F(c)','
|c-a|');
while abs(c-a)>e
b=(c*Fa-a*Fc)/(Fa-Fc);
x=b;
Fb=eval(Fx);
fprintf('\n %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f \n',a,b,c,Fa,Fb,Fc,abs
(c-a));
if abs(Fc)<e
break;
else
if Fa*Fb<=0

c=b;
Fc=Fb;
else
a=b;
Fa=Fb;
end
end
end
fprintf('\nEl resultado sera %.4f',b);
ezplot(Fx);%graficamos la funcion
grid on;

function x = biseccion(fun,a,b,tol)
% Aproxima por el mtodo de la biseccin una raz de la ecuacin fun(x)=0
disp('Mtodo de la biseccin');
u=feval(fun,a);
v=feval(fun,b);
n=1;
if sign(u)==sign(v)
disp('Error la funcin debe cambiar de signo en (a,b)');
break;
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

function x = regula_falsi(fun,a,b,maxiter)
% Aproxima por el mtodo de la regula falsi una raz de la ecuacin fun(x)=0
fprintf(1, 'Mtodo de la regula falsi\n');
fprintf(1,'\n');
n=1;
u=feval(fun,a);
v=feval(fun,b);
if sign(u)==sign(v)
disp('ERROR:la funcion debe cambiar signo en a,b');
break;
end;

for n=1:1:maxiter
c=a-(u*(b-a)/(v-u));
w=feval(fun,c);
fprintf(1, 'n= %i, c= %f, f(c)= %e \n',n, c,w);
if sign(u)==sign(w)
a = c; u=w;
else
b=c; v=w;
end
n=n+1;
end;
x=c

function p=pfijo(fun,p0,tol,maxiter)
% Aproxima por el mtodo del punto fijo una raiz de la ecuacion fun(x)=x
%cercana p0, tomando como criterio de parada abs(fun(x)-x)<tol o la cota sobre
% el numero de iteraciones dada por maxiter.
%
% Variables de entrada:
%
fun(x): funcion a iterar, se debe introducir con notacin simbolica (eg. 'g'
)
%
x0: estimacin inicial para el proceso de iteracin
%
tol: tolerancia en error absoluto para la raiz
%
maxiter: maximo numero de iteraciones permitidas
%
% Variables de salida:
%
p: valor aproximado de la raiz
p(1)=p0;
for n=2:maxiter;
p(n)=feval(fun,p(n-1));
err=abs(p(n)-p(n-1));
if err<tol
break;
end
disp(['n=',num2str(n)]);
disp(['f(x)=',num2str(p(n))]);
disp(['abs(f(x)-x)=',num2str(err)]);
end
if n==maxiter
disp('se ha excedido el nmero de iteraciones')
end
p'

function a =secante(fun,x0,x1,tol,maxiter)
% Aproxima por el mtodo de la secante una raiz de la ecuacion fun(x)=0

%cercana a x0, tomando como criterio de parada abs(fun(x))<tol o la cota sobre


%el numero de iteraciones dada por maxiter.
%
% Variables de entrada:
%
fun: funcion a calcular la raiz, se introduce en modo simbolico 'fun'
%
x0, x1: estimaciones iniciales para el proceso de iteracin
%
tol: tolerancia en error absoluto para la raiz
%
maxiter: maximo numero de iteraciones permitidas
%
% Variables de salida:
%
a: valor aproximado de la raiz
fprintf(1, 'Metodo de la secante \n');
f0=subs(fun,x0);
f1=subs(fun,x1);
iter=1;
while(abs(f1)>tol) & (iter<maxiter)
a = x1-f1*((x1-x0)/(f1-f0));
% formula de ite
racion
f0=f1; f1=subs(fun,a);
%Actualiza f0 y f1
fprintf(1, 'iter= %i, a= %x0,f= %e \n', iter,a ,f1)
iter = iter + 1;
% Cuenta los pas
os
x0=x1; x1=a;
% actualiza x
end
% Salida

Programa (en matlab)


%****************************************************************
%** Races de Ecuaciones
**
%** Mtodo de Biseccion
UdeG **
%**
Maestra en Electrnica **
%** Ing. Jess Norato Valencia
**
%** Materia: Mtodos Numricos
**
%** Maestro: M.C. J.Gilberto Mateos Suarez
8/Dic/99 **
%****************************************************************
clear;

clc;
%****************************************************************
%** Se ingresan los datos de la ecuacin que deseamos
**
%** conocer sus races, entre que intervalos y con que
**
%** porcentaje de error.
**
%****************************************************************
fprintf('\nCalculo de la raz de una ecuacion por mtodo de Biseccion\n\n');
y=input('Dame la funcin : ','s');
xl=input('Dame el intervalo inferior : ');
xu=input('Dame el intervalo superior : ');
e=input('Dame el porciento del error : ');
xi=0;
ea=100;
c=1;

%****************************************************************
%** Se hace el calculo para determinar si en los intervalos
**
%** para los que se va a calcular esta comprendida la raiz
**
%** de la ecuacin
**
%****************************************************************
x=xl;
a=eval(y);
x=xu;
b=eval(y);
cc=a*b;
if cc>0
fprintf('\n\nLos intervalos que ha ingresado para hacer el calculo de la raiz\n\

n');
fprintf('\nde la ecuacion no son los adecuados por no existir una raz entre \n\n'
);
fprintf('\nestos, Execute de nuevo el programa, por favor.\n\n');
break
end

%****************************************************************
%** Se realizan los clculos para determinar la raz en la
**
%** siguiente seccion.
**
%****************************************************************

while ea>e
xr=(xl+xu)/2;
x=xl;
yl=eval(y);
x=xr;
yr=eval(y);
ea=abs((xr-xi)/xr)*100;
z=yl*yr;
if z<0
xu=xr;
end
if z>0
xl=xr;
end
if z==0
fprintf('\n\n\n\nLa raz exacta es: %d',xr)
fprintf('\n\nNumero de iteraciones: %d',c);
break

end
xi=xr;
c=c+1;
end

%****************************************************************
%** Se imprimen resultados
**
%****************************************************************

if ea<e
fprintf('\n\n\n\nLa raz exacta es: %d',xr)
fprintf('\n\nNumero de iteraciones: %d',c);
end

x0=input('Ingrese el valor inicial: ');


02
tol=input('Ingrese el porcentaje de error: ');
03
f=input('Ingrese la funcin: ');
04
i=1;
05
fx(i)=x0;
06
07

syms x;
08
f1=subs(f,x,fx(i));
09
z=diff(f);
10
d=subs(z,x,fx(i));
11
12
ea(1)=100;
13
14
while abs(ea(i))>=tol;
15
fx(i+1)=fx(i)-f1/d; f1=subs(f,x,fx(i+1)); d=subs(z,x,fx(i+1));
16
ea(i+1)=abs((fx(i+1)-fx(i))/fx(i+1)*100);
17
i=i+1;
18
end
19
fprintf('i
fx(i)
Error aprox (i) \n');
20
for j=1:i;
21
fprintf('%2d \t %11.7f \t %7.3f \n',j-1,fx(j),ea(j));
22
end

You might also like