Solução de equações de 3o. grau

Faça um programa que, dada a equação de 3o. grau:

$$ x^3 + a_1 x^2 + a_2 x + a_3 = 0 $$

calcule suas soluções:

\begin{eqnarray} x_1 & = & S + T - \frac{1}{3} a_1 \\ x_2 & = & -\frac{1}{2} (S + T) - \frac{1}{3} a_1 + \frac{1}{2} i \sqrt{3} (S-T) \\ x_3 & = & -\frac{1}{2} (S + T) - \frac{1}{3} a_1 - \frac{1}{2} i \sqrt{3} (S-T) \\ \end{eqnarray}

onde:

\begin{eqnarray} Q & = & \frac{3 a_2 - a_1^2}{9} \\ R & = & \frac{9 a_1 a_2 - 27 a_3 - 2 a_1^3}{54} \\ S & = & \left( R + \sqrt{Q^3 + R^2} \right)^{1/3} \\ T & = & \left( R - \sqrt{Q^3 + R^2} \right)^{1/3} \\ \end{eqnarray}

Finalmente, confira os resultados verificando se:

\begin{eqnarray} - a_1 & = & x_1 + x_2 + x_3 \\ a_2 & = & x_1 x_2 + x_2 x_3 + x_3 x_1 \\ - a_3 & = & x_1 x_2 x_3\\ \end{eqnarray}

Uma eventual dificuldade desse problema é a presença de números complexos $z = a + ib$, onde $i = \sqrt{-1}$. Números complexos aparecem explicitamente nas soluções para $x_2$ e $x_3$ e podem aparecer nos valores de $S$ e $T$, pois o cálculo de seus valores envolve uma raiz quadrada cujo argumento pode ser negativo.

O código fonte desse exemplo implementa a solução de dois modos.

Em um dos modos, utiliza JavaScript "puro" para resolver o problema. Isso significa que não utiliza nenhuma biblioteca matemática adicional para tratar os números complexos, apenas divide-os em duas partes (uma real e outra imaginária) e emprega as regras básicas que se aprende o Ensino Médio para fazer os cálculos.

Nessa implementação o problema é, na verdade, dividido em dois: (a) quando $D = Q^3 + R^2$ é positivo ou nulo e (b) quando $D = Q^3 + R^2$ é negativo. No primeiro caso, a raiz quadrada é real e os cálculos são relativamente triviais. No segundo caso, a raiz quadrada é imaginária e dá um pouco mais de trabalho lidar com a álgebra (mas nada que ultrapasse o que se aprende no Ensino Médio).

O outro modo utiliza a biblioteca complex.js, que fornece algumas propriedades e métodos que podem facilitar os cálculos. Utilizando essa biblioteca o código fica mais compacto e mais "próximo" das fórmulas apresentadas na definição do problema. O preço a pagar por isso é investir algum tempo para aprender os detalhes das propriedades e métodos da bilbioteca.

As tabelas a seguir mostram, na primeira coluna ($a_{1},a_{2},a_{3}$) valores sorteados (entre ±1) para os coeficientes da equação. Na segunda e terceira colunas as tabelas mostram os valores (reais e imaginários) das raízes da equação ($x_{1},x_{2},x_{3}$). As duas últimas colunas mostram, para verificação, os valores dos coeficientes calculados ($a_{1c},a_{2c},a_{3c}$)a partir das raízes encontradas.

Uma vez que os coeficientes de entrada $a_{1},a_{2},a_{3}$ são reais, os coeficientes $a_{1c},a_{2c},a_{3c}$ calculados a partir das raízes devem ser reais (devem ter componentes imaginárias iguais a zero). As raízes $x_{1},x_{2},x_{3}$, por sua vez, podem ser complexas (com componentes reais e imaginárias).

Clique sobre a página com o botão direito e visualize o código fonte para entender a diferença entre as duas implementações.


JavaScript "puro"












Utilizando "complex.js"