Ecuaciones cúbicas por el Algoritmo de Cardano
Dev - C++
12.945 visualizaciones desde el 17 de Abril del 2020
Este código sirve para obtener la solución de ecuaciones cúbicas forma Ax^3 +Bx ^2 + C x + D = 0.
/*Ecuaciones cubicas según el Algoritmo/Método de Cardano
Fuente: https://es.wikipedia.org/wiki/Método_de_Cardano */
#include<iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main(){
double A,B,C,D;
double a1,b1,c1;
double p,q,dis;
double x,y,z,pi;
double ab,ac;
double u,v,t;
cout<<" Ecuacion cubica de la forma AX^3 + BX^2 + CX + D"<<endl;
cout<<" Introduzca "<<endl;
cout<<" A :"; cin>> A;
cout<<" B :"; cin>> B;
cout<<" C :"; cin>> C;
cout<<" D :"; cin>> D;
cout.precision(3); // muestra la cantidad de decimales deseada
t = 0.0000000009; // tolerancia o margen de error
pi = 3.141592654; // el numero pi
a1 = B/A;
b1 = C/A;
c1 = D/A;
p = b1 - (a1*a1)/3; // variable p del metodo
q = (2*a1*a1*a1)/27 - (a1*b1)/3 + c1; // variable q del metodo
dis = (q*q) + (4*p*p*p)/27; // discriminante
cout<< " Ecuacion reducida : Z^3 + "<<p<< " Z + "<<q<<endl;
cout<< " El discriminante es "<<dis<<endl;
if ( dis >= t ) { //discriminante > 0
ab = 0.5*(-q + sqrt(dis));
double racub(ab); // raiz cubica 1, calculo de u
if (ab> 0) {
racub = exp(log(ab)/3);
};
if (ab== 0){
racub = 0;
};
if (ab<0) {
racub =-exp(log(-ab)/3);
};
ac = -0.5*(q + sqrt(dis));
double racub2(ac);
if (ac> 0) {
racub2 = exp(log(ac)/3); //raiz cubica 2, calculo de v
};
if (ac== 0){
racub2 = 0;
};
if (ac<0) {
racub2 =-exp(log(-ac)/3);
};
u = racub; // variable u del metodo de cardano
v = racub2; // variable v del metodo de cardano
x = u + v -(a1/3);
y = (-0.5)*(u+v) -(a1/3);
z = (0.5)*sqrt(3)*(u-v);
cout<<" La ecuacion tiene una raiz real y 2 complejas "<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2 :"<<y<<" + "<<z<<"i"<<endl;
cout<<" X3 :"<<y<<" - "<<z<<"i"<<endl;
};
if ((dis < t and dis > -t) and (p>=-t and p<=t)){ //discriminante= p = 0
cout<<" La ecuacion tiene una sola raiz"<<endl;
cout<<" X :"<<-(a1/3);
};
if ((dis < t and dis > -t) and (p>=t or p<=-t)){ // discriminante = 0
ab = -0.5*q;
double racub(ab);
if (ab> 0) {
racub = exp(log(ab)/3); // raiz cubica de u, solo se calcula u
};
if (ab== 0){
racub = 0;
};
if (ab<0) {
racub =-exp(log(-ab)/3);
};
u = racub;
x = 2*u -(a1/3);
y = -u -(a1/3);
cout<<" La ecuacion tiene raices multiples"<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2=X3 :"<<y<<endl;
};
if ( dis <= -t ) { // discriminate < 0
x = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt(-27/(p*p*p)))/3) -(a1/3);
y = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt((-27)/(p*p*p)))/3 +2*pi/3) -(a1/3);
z = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt((-27)/(p*p*p)))/3 +4*pi/3) -(a1/3);
cout<<" La ecuacion tiene 3 raices distintas "<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2 :"<<y<<endl;
cout<<" X3 :"<<z<<endl;
};
getch(); // Hace una pausa al programa
return 0;
} //fin del programa
/*Notas
1.cin>> equivale a read en pascal
2.iostream es la libreria principal como system en pascal
3.conio.h esta libreria contiene getch()
4.gethc() equivale a readkey en pascal
5.int main() {} equivale a begin end en pascal
6.double equivale a real en pascal
7.cout.precision se encarga de la precision decimal,
en pascal variable:ancho:decimales
8.en el calculo de una raiz cubica debe considerarse el metodo
si se usa tablas de exponenciales y logaritmos
se debe tener presente que el logaritmo calcula x > 0
En el calculo de la raiz cubica se considera x>0 x=0 x<0
9.En este programa se empleara una tolerancia t
para que discriminantes de valor peqeñisimo se consideren 0
10.cout<< + endl equivale a writeln en pascal
11. la libreria math.h contiene la funcion arcocoseno*/
Comentarios sobre la versión: Dev C++ 5.0.0.4 (1)
#include<iostream>
#include <conio.h>
#include <math.h>
using namespace std;
double rcu (double E) { //funcion raiz cubica
// calculo por el metodo de tablas exponenciales y logaritmicas
// formula exp(ln(E)/3)
double raiz;
if (E> 0) { // el logaritmo natural puede calculaa E>0
raiz = exp(log(E)/3);
};
if (E== 0){ // el logaritmo natural no puede calcular E=0
raiz = 0;
};
if (E<0) {
raiz =-exp(log(-E)/3); // el logaritmo natural no calcula E < 0
// es necesario poner el signo "-" a E
};
return raiz;
};
int main(){
double A,B,C,D; // variables de la ecuacion principal
double a1,b1,c1;
double p,q,dis; // variables de la ecuacion reducida
double u,v;
double x,y,z; // valores de las raices
double pi,t; // pi y margen de error
cout<<" Ecuacion cubica de la forma AX^3 + BX^2 + CX + D"<<endl;
cout<<" Introduzca "<<endl;
cout<<" A :"; cin>> A;
cout<<" B :"; cin>> B;
cout<<" C :"; cin>> C;
cout<<" D :"; cin>> D;
cout.precision(3); // muestra la cantidad de decimales deseada
t = 0.0000000009; // tolerancia o margen de error
pi = 3.141592654; // el numero pi
a1 = B/A;
b1 = C/A;
c1 = D/A;
p = b1 - (a1*a1)/3; // variable p del metodo
q = (2*a1*a1*a1)/27 - (a1*b1)/3 + c1; // variable q del metodo
dis = (q*q) + (4*p*p*p)/27; // discriminante
cout<< " Ecuacion reducida : Z^3 + "<<p<< " Z + "<<q<<endl;
cout<< " El discriminante es "<<dis<<endl;
if ( dis >= t ) { //discriminante > 0
u = rcu(0.5*(-q + sqrt(dis))); // variable u del metodo de cardano
v = rcu(-0.5*(q + sqrt(dis))); // variable v del metodo de cardano
x = u + v -(a1/3);
y = (-0.5)*(u+v) -(a1/3);
z = (0.5)*sqrt(3)*(u-v);
cout<<" La ecuacion tiene una raiz real y 2 complejas "<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2 :"<<y<<" + "<<fabs(z)<<"i"<<endl;
cout<<" X3 :"<<y<<" - "<<fabs(z)<<"i"<<endl;
};
if ((dis < t and dis > -t) and (p>=-t and p<=t)){ //discriminante= p = 0
cout<<" La ecuacion tiene una sola raiz"<<endl;
cout<<" X :"<<-(a1/3);
};
if ((dis < t and dis > -t) and (p>=t or p<=-t)){ // discriminante = 0
u = rcu(-0.5*q); // no es necesario calcular v, ya que u=v
x = 2*u -(a1/3);
y = -u -(a1/3);
cout<<" La ecuacion tiene raices multiples"<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2=X3 :"<<y<<endl;
};
if ( dis <= -t ) { // discriminate < 0
x = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt(-27/(p*p*p)))/3) -(a1/3);
y = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt((-27)/(p*p*p)))/3 +2*pi/3) -(a1/3);
z = (2*sqrt(-p/3))*cos(acos((-q/2)*sqrt((-27)/(p*p*p)))/3 +4*pi/3) -(a1/3);
cout<<" La ecuacion tiene 3 raices distintas "<<endl;
cout<<" X1 :"<<x<<endl;
cout<<" X2 :"<<y<<endl;
cout<<" X3 :"<<z<<endl;
};
getch(); // Hace una pausa al programa
return 0;
} //fin del programa