Solución de ecuación cuártica

10

¿Existe una implementación C abierta para la solución de ecuaciones cuárticas:

ax+bx³+cx²+dx+e=0

Estoy pensando en una implementación de la solución de Ferrari. En Wikipedia leí que la solución es computacionalmente estable solo para algunas de las posibles combinaciones de signos de los coeficientes. Pero tal vez tenga suerte ... Obtuve una solución pragmática resolviendo analíticamente usando un sistema de álgebra computacional y exportando a C. Pero si hay una implementación probada, preferiría usar esto. Busco un método rápido y prefiero no usar un buscador de raíz general.

Solo necesito soluciones reales.

Highsciguy
fuente
¿Necesita todas las soluciones (reales) simultáneamente? Como dice GertVdE a continuación, si tiene problemas de estabilidad con una solución de formulario cerrado, no hay realmente una buena razón para no usar un algoritmo de búsqueda de raíz.
Godric Seer
3
Me parece curioso que esto se haya etiquetado como álgebra no lineal, ya que simplemente podría calcular los valores propios de la matriz complementaria, que ya está en forma de Hessenberg, y aplicar barridos QR sería bastante simple.
Victor Liu
2
Eche un vistazo a los solucionadores cúbicos / cuárticos publicados en ACM TOMS (Algoritmo 954) . El código que se incluye en esa revista suele ser de muy alta calidad. El documento en sí está detrás de un muro de pago, pero el código se puede descargar desde este enlace .
GoHokies
... (edición posterior) el código ACM está escrito en FORTRAN 90, pero mi primera impresión es que uno podría llamarlo desde C sin hacer un gran esfuerzo.
GoHokies
1
@GoHokies Creo que debería convertir su comentario en una respuesta porque creo que es una buena respuesta a esta pregunta. Sobre todo porque el documento vinculado logra evitar las inestabilidades numéricas habituales, y eso no es absolutamente algo trivial.
Kirill

Respuestas:

20

Recomiendo encarecidamente no utilizar soluciones de forma cerrada, ya que tienden a ser numéricamente muy inestables. Debe tener mucho cuidado en la forma y el orden de sus evaluaciones de los parámetros discriminantes y otros.

El ejemplo clásico es el de la ecuación cuadrática . Calcular las raíces como te meterá en problemas por polinomios donde desde entonces obtienes cancelación en el numerador. calcular .x 1 , 2 = - b ± ax2+bx+c=0 b4acx1=-(b+sign(b)

x1,2=b±b24ac2a
b4ac
x1=(b+sign(b)b24ac)2a;x2=ca1x1

Higham en su obra maestra "Precisión y estabilidad de los algoritmos numéricos" (2ª ed., SIAM) utiliza un método de búsqueda directa para encontrar coeficientes de un polinomio cúbico para el que la solución cúbica analítica clásica da resultados muy inexactos. El ejemplo que da es . Para este polinomio, las raíces están bien separadas y, por lo tanto, el problema no está mal condicionado. Sin embargo, si calcula las raíces utilizando el enfoque analítico y evalúa el polinomio en estas raíces, obtiene un residuo de mientras usa un método estándar estable (el método de matriz complementaria) , el residuo es de ordenO ( 10 - 2 ) O ( 10 - 15 ) O ( 10 - 11 )[a,b,c]=[1.732,1,1.2704]O(102)O(1015). Propone una ligera modificación al algoritmo, pero incluso entonces, puede encontrar un conjunto de coeficientes que conducen a residuos de que definitivamente no es bueno. Ver p480-481 del libro mencionado anteriormente.O(1011)

En su caso, aplicaría el método de Bairstow . Utiliza una combinación iterativa de iteración de Newton en formas cuadráticas (y luego se resuelven las raíces de la cuadrática) y la deflación. Se implementa fácilmente e incluso hay algunas implementaciones disponibles en la web.

GertVdE
fuente
1
¿Podría explicar a qué se refiere con "Recomiendo encarecidamente no utilizar soluciones de forma cerrada, ya que tienden a ser numéricamente muy inestables". ¿Esto se aplica solo a los polinomios de cuarto grado o es una regla general?
NoChance
@EmmadKareem He actualizado mi respuesta anterior.
GertVdE
3

Ver estos:

lhf
fuente
2
Usando este código en el polinomio con los coeficientes dados en mi respuesta, encuentro lo siguiente: , que tiene un error relativo de comparación con la raíz real (calculado usando el comando de raíces de Octave que usa el método de matriz compañera). Tiene un residuo de mientras que la raíz del método de la matriz compañera tiene un residuo de . Depende de usted si esto es lo suficientemente bueno (para gráficos de computadora puede ser, para algunas otras aplicaciones, no lo será)O ( 10 - 8 ) O ( 10 - 7 ) O ( 10 - 15 )x1=1.602644912244132e+00O(10-8)O(10-7 7)O(10-15)
GertVdE
1

Las recetas numéricas en c proporcionan una expresión de forma cerrada para raíces reales de cuadrático y cúbico que presumiblemente tienen una precisión decente. Dado que la solución algebraica del cuarto implica resolver un cubo y luego resolver dos cuadráticos, tal vez un cuarto cerrado con buena precisión no está fuera de discusión.

Nemocopperfield
fuente
Acabo de obtener la raíz del ejemplo cúbico citado dentro de 2e-16 (un poco sobre la precisión de mis flotadores) usando las recetas numéricas en c (press et al) fórmulas cúbicas. Entonces hay razones para esperar.
Nemocopperfield