6 votos

Esquema numéricamente estable para las 3 raíces reales de un cúbico.

El libro de texto solución es totalmente conocido, pero yo te sucintamente escribirlo para corregir las notaciones. La solución de

$$-x^3+3px+2q=0,$$

al $p^3-q^2>0$ 3 raíces reales dada por

$$x = 2\sqrt{p}\cos\left(\theta+\frac{2n\pi}{3}\right)$$

para $n=0,1,2$, con

$$\theta = \frac{1}{3}\arctan\frac{\sqrt{p^3-q^2}}{q},$$

con las evidentes limitaciones al $q\to0^\pm$.

El problema es, obviamente, que la fórmula para $\theta$ no es numéricamente robusto, ya que puede producir un detrimento de la cancelación de la resta en virtud de la raíz cuadrada. Así que mi pregunta es: ¿puede esta ser modificado en una estable esquema?

7voto

Niall Connaughton Puntos 3786

El dieciséis-secuencia de operación en el pseudo-código de abajo está inspirada en el cálculo de $ab - cd$ en el siguiente artículo:

Claude-Pierre Jeannerod, Nicolas Louvet, y Jean-Michel Muller, "Análisis de Kahan del Algoritmo para el Cálculo Exacto de $2 \times 2$ Determinantes", las Matemáticas de la Computación, Vol. 82, Nº 284, Oct. 2013, pp 2245-2264 (en línea)

El algoritmo hace uso de la fusionada multiplicar-agregar o fma, la operación para el cálculo de la diferencia de dos productos con firmeza en sólo cuatro operaciones:

w := d * c
e := fma (-d, c, w)
f := fma (a, b, -w)
r := f + e

Ese algoritmo es trivialmente aplicable para el cálculo del discriminante en el cómputo de las soluciones reales de una ecuación cuadrática. El uso de fma permite implementaciones eficientes de error-libre de transformaciones, que se traducen en una cabeza-cola (o doble-nativo) representación de los operandos que, en esencia, ofrece dos veces el nativo de precisión. El algoritmo anterior proporciona un error de enlazado de 1.5 ulp, siempre que no se desbordamiento o subdesbordamiento se produce en el intermedio de la computación.

Para el cálculo de $p^{3} - q^{2}$ el algoritmo anterior de las necesidades de modificación para incorporar la cubicación, donde es preferible explícita de no computar como triple-nativo de precisión operando. La siguiente secuencia es la más eficiente, la versión que he conseguido crear en el doble; el peor de los casos el error no parece exceder de 17 de prácticas discriminatorias como lo determina razonablemente extensas pruebas con los casos de prueba en el que $p^{3}$ es muy cercano en magnitud a $q^{2}$. Mayor precisión de las versiones en potencialmente menor rendimiento son, sin duda, posible.

En el código de anotaciones w:e, s:t, u:v designar a la cabeza de la cola de los pares de los nativos de la precisión de los números que representan el producto exacto de dos nativos de precisión operandos cuando se suman. El algoritmo también se hace uso de un libre de errores de suma de dos nativos de números de precisión que se debe a D. E. Knuth, TAOCP. Se entrega el resultado en forma de un sin evaluar suma $a + b + c$.

Cuando este pseudo-código se transforma en real de programación de código procesado por un compilador, es esencial que el compilador está configurado para implementar la secuencia de las operaciones como por escrito. Muchos compiladores volver a asociar de punto flotante de expresiones en altos niveles de optimización, que puede incluso ser la predeterminada. La más estricta de punto flotante modo de evaluación disponibles en caso de ser seleccionado. Con los compiladores de Intel, esto es, /fp:strict o -fp-model=strict dependiendo de la plataforma del sistema operativo.

// w:e = -q*q exactly
w := -q * q
e := fma (-q, q, -w)
// s:t =  p*p exactly
s := p * p
t := fma (p, p, -s)
// s:t * p + w:e = s*p + w + t*p +e = s*p+w + u:v + e = f + u:v + e
f := fma (s, p, w)
u := t * p
v := fma (t, p, -u)
// error-free sum f+u. See Knuth, TAOCP vol. 2
a := u + f
b := a - u
c := a - b
b := f - b
c := u - c
// sum all terms into final result
r := (((e + a) + b) + c) + v

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X