Me gustaría resolver $ax^3 + bx^2 + cx + d = 0$ utilizando la fórmula cúbica.
He codificado tres versiones de esta fórmula, descritas en tres fuentes: MathWorld , EqWorld ,
y en el libro "El intento inalcanzable de evitar el Casus Irreducibilis para las ecuaciones cúbicas".
Aunque obtengo resultados idénticos en todas las versiones, estos resultados son incorrectos.
Por ejemplo, para $a=1$ , $b=2$ , $c=3$ , $d=4$ ,
Encuentro raíces incorrectas:
$x_1 = -0.1747 - 0.8521i$ ,
$x_2 = 0.4270 + 1.1995i$ ,
$x_3 = -2.2523 - 0.3474i$ .
Las raíces correctas son:
$x_1 = -1.6506$ ,
$x_2 = -0.1747 + 1.5469i$ ,
$x_3 = -0.1747 - 1.5469i$
En caso de que esté interesado, el código real está abajo. Gracias por su ayuda.
%% Wolfram version
Q = (3*c - b^2) / 9;
R = (9*b*c - 27*d - 2*b^3) / 54;
D = Q^3 + R^2;
S = (R + sqrt(D))^(1/3);
T = (R - sqrt(D))^(1/3);
x1 = - b/3 + (S + T);
x2 = - b/3 - (S + T) / 2 + sqrt(-3) * (S - T) / 2;
x3 = - b/3 - (S + T) / 2 - sqrt(-3) * (S - T) / 2;
%% Book version
omega1 = - 1/2 + sqrt(-3)/2;
omega2 = - 1/2 - sqrt(-3)/2;
p = (3*a*c - b^2) / (3*a^2);
q = (2*b^3 - 9*a*b*c + 27*(a^3)*d) / (27*a^3);
r = sqrt(q^2/4 + p^3/27);
s = (-q/2 + r)^(1/3);
t = (-q/2 - r)^(1/3);
x1 = s + t - b/(3*a);
x2 = omega1*s + omega2*t - b/(3*a);
x3 = omega2*s + omega1*t - b/(3*a);
%% Eqworld version
p = - 1/3 * (b/a)^2 + (c/a);
q = 2/27 * (b/a)^3 - (b*c)/(3*a^2) + d/a;
D = (p/3)^3 + (q/2)^2;
A = (-q/2 + sqrt(D))^(1/3);
B = (-q/2 - sqrt(D))^(1/3);
y1 = A + B;
y2 = - 1/2 * (A + B) + sqrt(-3)/2 * (A - B);
y3 = - 1/2 * (A + B) - sqrt(-3)/2 * (A - B);
x1 = y1 - b / (3*a);
x2 = y2 - b / (3*a);
x3 = y3 - b / (3*a);
0 votos
No he mirado tu solución con detenimiento, pero un error común en casos como éste es utilizar inadvertidamente la división entera en lugar de la división fraccionaria, lo cual es un error fácil en muchos sistemas de programación. ¿Es posible que hayas hecho esto? ¿Puedes comprobar omega1 y asegurarte de que el
-1/2
no se dejó caer?0 votos
Gracias por su ayuda. Esta parte parece estar bien (estoy usando Matlab).
4 votos
A efectos de estabilidad numérica, podría interesarle esta formulación .
0 votos
Creo que es una gran alternativa; quizás un inconveniente es la necesidad de calcular funciones trigonométricas.
1 votos
Akim, es un intercambio (que ocurre a menudo en las aplicaciones de programación): en casus irreducibilis En el caso de las evaluaciones complejas, puedes elegir entre evitar la aritmética compleja y utilizar la trigonometría, o utilizar sólo radicales y aritmética, pero no podrás evitar las evaluaciones complejas.