metodo de cardano para ecuciones cubicas , tercer grado
Pascal/Turbo Pascal
1.963 visualizaciones desde el 12 de Abril del 2020
Este método se basa en el método de cardano para calcular una raíz cubica de acuerdo a lo publicado en Wikipedia
program cardano;{ecuacion cubica con el metodo de cardano segun wikipedia}
uses crt,math;
var A,B,C,D,a1,b1,c1,p,q,dis,
o,m,m1,ma,m2,u,ua,vf,v,
x1,x1a,x21,x22,x31,x32,
num,num1,num2,num3: real;
function racub(k:real) : real; {funcion para calcular la raiz cubica}
var
raiz : real;
begin
if k > 0 then
begin
racub:= exp((1/3)*ln(k));
end;
if k = 0 then
begin
racub:= 0;
end;
if k < 0 then
begin
racub:= -exp((1/3)*ln(-k));
end;
end;
begin
clrscr;
writeln('ecuacion cubica AX^3+BX^2+CX+D=0');
writeln('Introduzca A');read(A);
writeln('Introduzca B');read(B);
writeln('Introduzca C');read(C);
writeln('Introduzca D');read(D);
a1:=B/A;
b1:=C/A;
c1:=D/A;
p:= b1 - (power(a1,2)/3);
q:= (2/27)*(power(a1,3)) - (1/3)*(a1*b1) + c1;
dis:= power(q,2) + (4/27)*power(p,3);
writeln('ecuacion reducida es : Z^3 + ',p:2:3,'Z + ',q:2:3);
writeln('el discriminate es : ',dis:2:3);
if dis > 0.1 then
begin
m := (1/2)*(-q + sqrt(dis));
m1:= (-0.5)*(q + sqrt(dis));
u:= racub(m);
v:= racub(m1);
writeln('el valor de u es : ',u:2:3);
writeln('el valor de v es : ',v:2:3);
x1:= u + v -(a1/3);
x21:= (-1/2)*(u+v) -(a1/3);
x22:= (1/2)*sqrt(3)*(u-v);
x31:= x21;
x32:= -x22;
writeln(' la ecuacion tiene 1 raiz real 2 raices complejas');
writeln(' la solucion real es : ',x1:2:3);
writeln(' la solucion compleja 1 es : ',x21:2:3,' + ',abs(x22):2:3,'i');
writeln(' la solucion compleja 2 es : ',x31:2:3,' - ',abs(x32):2:3,'i');
end;
if ((dis < 0.1) and (dis > -0.1)) and ((p < 0.1) and (p > -0.1)) then
begin
writeln('la ecuacion tiene solucion unica');
writeln('la solucion es :',-(a1/3):2:3);
end;
if ((dis < 0.1) and (dis > - 0.1)) and ((p >= 0.1) or (p <= -0.1)) then
begin
m := (1/2)*(-q);
u:= racub(m);
x1:= 2*u -(a1/3);
x21:= -u -(a1/3);
writeln('la ecuacion tiene soluciones multiples');
writeln('la primera solucion es :',x1:2:3);
writeln('la solucion repetida es :',x21:2:3);
end;
if dis < -0.1 then
begin
if round(q) <> 0 then
begin
num:= (-q/2)*sqrt((-27)/(p*p*p));
num1:= (1/3)*ArcTan(sqrt(1-(num*num))/num);
end
else
begin
num1:= 1.5707/3;
end;
num2 := 2.094;
num3 := 2*sqrt(-p/3);
x1:= num3*cos(num1) -(a1/3);
x21:= num3*cos(num1 +num2) -(a1/3);
x31:= num3*cos(num1 +2*num2) -(a1/3);
writeln('la ecuacion tiene raices distintas');
writeln('la solucion 1 es ',x1:2:2);
writeln('la solucion 2 es ',x21:2:2);
writeln('la solucion 3 es ',x31:2:2);
end;
readkey;
end.
Comentarios sobre la versión: free pascal (4)
if round(q) > 0 then
begin
num:= (-q/2)*sqrt((-27)/p*p*p);
num1:= (1/3)*(3.1416 + ArcTan(sqrt(1-(num*num))/num));
end;
if round(q) = 0 then
begin
num1:= 1.5707/3;
end;
if round(q) < 0 then
begin
num:= (-q/2)*sqrt((-27)/(p*p*p));
num1:= (1/3)*(ArcTan(sqrt(1-(num*num))/num));
end;
https://es.wikipedia.org/wiki/Método_de_Cardano
if round(q) > 0 then
begin
num:= (-q/2)*sqrt((-27)/(p*p*p));
num1:= (1/3)*(3.1416 + ArcTan(sqrt(1-(num*num))/num));
end;
if round(q) = 0 then
begin
num1:= 1.5707/3;
end;
if round(q) < 0 then
begin
num:= (-q/2)*sqrt((-27)/(p*p*p));
num1:= (1/3)*(ArcTan(sqrt(1-(num*num))/num));
end;
program cardano;{ecuacion cubica con el metodo de cardano segun wikipedia}
uses crt;
var A,B,C,D,a1,b1,c1,
p,q,dis,u,v,
x1,x2,x3,
pi,t: real;
function racub(k:real) : real; {funcion para calcular la raiz cubica}
begin
if k > 0 then
begin
racub:= exp((1/3)*ln(k));
end;
if k = 0 then
begin
racub:= 0;
end;
if k < 0 then
begin
racub:= -exp((1/3)*ln(abs(k)));
end;
end;
function arcs(i:real) : real; {funcion arcocoseno}
begin
if i> 0 then
begin
arcs:= (ArcTan(sqrt(1-(i*i))/abs(i)));
end;
if i=0 then
begin
arcs:= 2*(4*ArcTan(1/5) - ArcTan(1/239));{ se obtiene pi/2 = 1.5707}
end;
if i < 0 then
begin
arcs:= 4*(4*ArcTan(1/5) - ArcTan(1/239)) - (ArcTan(sqrt(1-(i*i))/abs(i)));
end;
end;
begin
clrscr;
writeln('ecuacion cubica AX^3+BX^2+CX+D=0');
write('Introduzca A ');read(A);
write('Introduzca B ');read(B);
write('Introduzca C ');read(C);
write('Introduzca D ');read(D);
If A= 0 then
begin write('A no puede ser igual a 0');readkey;exit;end;
pi:= 4*(4*ArcTan(1/5) - ArcTan(1/239));
t:= 0.0000000001;
a1:=B/A;
b1:=C/A;
c1:=D/A;
p:= b1 - ((a1*a1)/3);
q:= (2/27)*(a1*a1*a1) - (1/3)*(a1*b1) + c1;
dis:= (q*q) + (4/27)*(p*p*p); {discriminante}
writeln('ecuacion reducida es : Z^3 + ',p:2:3,'Z + ',q:2:3);
writeln('el discriminate es : ',dis:2:3);
if dis > t then { caso discriminate > 0}
begin
u:= racub((1/2)*(-q + sqrt(dis)));
v:= racub((-0.5)*(q + sqrt(dis)));
x1:= u + v -(a1/3);
x2:= (-1/2)*(u+v) -(a1/3);
x3:= (1/2)*sqrt(3)*(u-v);
writeln(' la ecuacion tiene 1 raiz real 2 raices complejas');
writeln(' la solucion real es : ',x1:2:3);
writeln(' la solucion compleja 1 es : ',x2:2:3,' + ',abs(x3):2:3,'i');
writeln(' la solucion compleja 2 es : ',x2:2:3,' - ',abs(x3):2:3,'i');
end;
if ((dis < t) and (dis > -t)) and ((p < t) and (p > -t)) then
{caso discriminante = 0 y p= 0}
begin
writeln('la ecuacion tiene solucion unica');
writeln('la solucion es :',-(a1/3):2:3);
end;
if ((dis < t) and (dis > - t)) and ((p >= t) or (p <= -t)) then
{caso discriminate = 0 y p<> 0}
begin
u:= racub((1/2)*(-q));
x1:= 2*u -(a1/3);
x2:= -u -(a1/3);
writeln('la ecuacion tiene soluciones multiples');
writeln('la primera solucion es :',x1:2:3);
writeln('la solucion repetida es :',x2:2:3);
end;
if dis < -t then { caso discriminante < 0}
begin
x1:= (2*sqrt(-p/3))*cos((1/3)*arcs((-q/2)*sqrt(-27/(p*p*p)))) -(a1/3);
x2:= (2*sqrt(-p/3))*cos((1/3)*arcs((-q/2)*sqrt((-27)/(p*p*p))) +(2*pi/3)) -(a1/3);
x3:= (2*sqrt(-p/3))*cos((1/3)*arcs((-q/2)*sqrt((-27)/(p*p*p))) +2*(2*pi/3)) -(a1/3);
writeln('la ecuacion tiene raices distintas');
writeln('la solucion 1 es ',x1:2:3);
writeln('la solucion 2 es ',x2:2:3);
writeln('la solucion 3 es ',x3:2:3);
end;
readkey;
end.