Você está na página 1de 6

IMPLEMENTACIÓN EN MATLAB

MÉTODO DE CARDANO

function[x]=CARDANO_(a)
%MÉTODO DE CARDANO
%Encuentra las raices de una ecuación cúbica
if length(a)~=4 %Checar que se hallan introducido los cuatro coeficientes
error('Obligatorio 4 coeficientes de la ecuación cúbica')
x=NaN;
return
end
a3=a(1);a2=a(2);a1=a(3);a0=a(4);
if a3~=1 %Hacemos a3=1
a0=a0/a3;
a1=a1/a3;
a2=a2/a3;
a3=a3/a3;
end
t=a1/3-(a2)^2/9;
u=(a1*a2-3*a0)/6-a2^3/27;
d=t^3+(u)^2;
if abs(d)<1e-16
d=0;
end %DISCRIMINANTE
if(u+sqrt(d)<0)&&(d>=0);
s1=-abs((u+sqrt(d)))^(1/3); % CAUSA NÚMERO IMAGINARIO LA ELEVACIÓN
%(-)(1/3)
else
s1=(u+d^(1/2))^(1/3);
end
if(u-sqrt(d)<0)&&(d>=0);
s2=-abs((u-sqrt(d)))^(1/3); %CAUSA NÚMERO IMAGINARIO LA
%ELEVACIÓN (-)(1/3)
else
s2=(u-d^(1/2))^(1/3);
end
if d>0
disp('Una raíz real y dos compejas conjugadas')
else
if d<0;
disp('Todas las raíces son reales y diferentes')
else %d=0
disp('Raíces reales y al menos dos son iguales')
end
end
x1=(s1+s2)-a2/3;
x2=-(s1+s2)/2-a2/3+i*sqrt(3)/2*(s1-s2);
x3=-(s1+s2)/2-a2/3-i*sqrt(3)/2*(s1-s2);

x=sort([x1,x2,x3]);%VECTOR SOLUCIÓN

MÉTODO DE BISECCIÓN

function raiz=BISECCION1(f,xizq,xder)
%bieccion encuentra la raíz de la función f
%ENTRADA: f -función a evaluar
%xizq,xder -extremo izquierdo y derecho de la busqueda
%SALIDA: raíz- cero de la ecuación
yizq=feval(f,xizq);yder=feval(f,xder);%Evaluamos los valores de y según
%nuestros valores extremo
Nmax=50; %No. máximo de iteraciones
epsilon=1e-5; %Tolerancia de convergencia
%Checamos que los valores extremo sean correctos
if xizq>= xder
error('El limite "xder" debe ser mayor que "xizq" y no alreves')
return
raiz=NaN
end
iter=1; convergio=(1==0);
while (iter<=Nmax) && (~convergio)
xmed=(xizq+xder)/2; ymed=feval(f,xmed);
convergio=(abs(ymed)<epsilon)|((xder-xizq)/2<epsilon); %Checar convergencia
if ~convergio %Si no convergio recorremos los limites
iter=iter +1;
if ymed *yizq > 0 %ymed y yizq tienen el mismo signo
xizq=xmed; yizq=ymed;
else
xder=xmed; yder=ymed; %ymed y yder tienen el mismo signo
end
end
end
%SALIDA DE RESULTADOS
if convergio
raiz=(xizq+xder)/2;
fprintf ('\n%sValor de la raíz es=%10.6g en %g iteraciones\n',blanks(2),raiz,iter)
else
raiz=NaN;
fprintf('El método no convergio después de %g iteraciones\n',Nmax)
end
MÉTODO DE LA FALSA POSICIÓN (REGULA-FASI)

function raiz=FALSA_POSICION(f,x1,x2)
Tol=1e-5;
Nmax=150;
y1=feval(f,x1);y2=feval(f,x2);
convergio=false;iter=0;
while iter<=Nmax &&~convergio;
x3=x1-y1*(x2-x1)/(y2-y1);
y3=feval(f,x3); iter=iter+1;
if abs(y3)<=Tol
convergio=true;
else
if y3*y1>0;
x1=x3;
y1=y3;
else
x2=x3;
y2=y3;
end
end
end
if convergio == true;
raiz=x3;
fprintf ('\n%sValor de la raíz es=%10.6g en %g iteraciones\n',blanks(2),raiz,iter)
else
fprintf('\nEl método no convergio\n')
end

MÉTODO DE NEWTON-RAPHSON

function raiz=Newton_R(f,xsup)
%Aplicamos el método de Newton Raphson
%para evaluar una ecuación no lineal f(x)=0
%ENTRADA: f-función f(x)=0
%xsup- valor inicial supuesto de la búsqueda

% SALIDA: root- es el cero (raíz localizada)


%Constantes
epsilon=1e-5; %Tolerancia de convergencia
delta=1e-6; %Incremento para obtener la derivada numéricamente

Nmax=50; %Número máximo de iteraciones


iter=1;convergio=(1==0);
while(iter<=Nmax) && (~convergio)
deriv=(feval(f,xsup+delta)-feval(f,xsup))/delta; %Evaluación derivada numérica
xcalc=xsup-feval(f,xsup)/deriv; %Aplicamos el método de Newton-Raphson
convergio=(abs((xsup-xcalc)/xsup)<epsilon); %Checar criterio de convergencia
if ~convergio
iter =iter +1;
xsup=xcalc;
end
end
%SALIDA DE RESULTADOS
if convergio
raiz=xcalc;
fprintf('\n%sEl valor de la raíz es =%10.6g en %g
iteraciones\n',blanks(1),raiz,iter)
else
raiz=NaN;
fprintf('El método no convergió después de %g iteraciones\n',Nmax)
end

MÉTODO DE LA SECANTE

function raiz=secante(x1,x2,fn)
%Método de la secante
Nmax=50;%Número máximo de iteraciones
tol=1e-5;%Tolerancia de convergencia
y1=feval(fn,x1);y2=feval(fn,x2); %Evaluamos los valores de y1 y y2 para
%cada valor de x
iter=0;
convergio=false;
while (iter<=Nmax && ~convergio)
x3=x1-y1*(x2-x1)/(y2-y1);
y3=feval(fn,x3);%Evaluamos el nuevo valor de y
convergio=abs((x2-x3)/x2)<=tol;
if ~convergio
x1=x2;y1=y2;
x2=x3; y2=y3;
iter=iter + 1;
end
end
if convergio
raiz=x3;%Se encontró una raíz
fprintf('\n%sEl valor de la raíz es =%10.6g en %g
iteraciones\n',blanks(1),raiz,iter)
else
raiz=NaN;%No se encontró ninguna raíz, se superó el
%número máximo de iteraciones
end

Você também pode gostar