-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathECU DE 3ER GRADO.cpp
112 lines (98 loc) · 3.05 KB
/
ECU DE 3ER GRADO.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*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;
}