En aritmética de coma flotante, ¿por qué la imprecisión numérica resulta de agregar un término pequeño a una diferencia de términos grandes?

13

He estado leyendo el libro Computer Simulation of Liquids de Allen y Tildesley. A partir de la página 71, los autores analizan los diversos algoritmos que se utilizan para integrar las ecuaciones de movimiento de Newton en simulaciones de dinámica molecular (DM). A partir de la página 78, los autores discuten el algoritmo Verlet, que es quizás el algoritmo de integración canónica en MD. Ellos declaran:

Quizás el método más utilizado para integrar las ecuaciones de movimiento es el adoptado inicialmente por Verlet (1967) y atribuido a Stormer (Gear 1971). Este método es una solución directa de la ecuación de segundo orden . El método se basa en las posiciones , las aceleraciones y las posiciones del paso anterior. La ecuación para avanzar las posiciones dice lo siguiente:r ( t ) a ( t ) r ( t - δ t )mir¨i=fir(t)a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

Hay varios puntos a tener en cuenta sobre la ecuación (3.14). Se verá que las velocidades no aparecen en absoluto. Se han eliminado mediante la adición de las ecuaciones obtenidas por la expansión de Taylor sobre :r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

Luego, más tarde (en la página 80), los autores declaran:

Contra el algoritmo de Verlet, ... la forma del algoritmo puede introducir innecesariamente alguna imprecisión numérica. Esto surge porque, en la ecuación (3.14), se agrega un término pequeño ( ) a una diferencia de términos grandes ( ), para generar la trayectoria. O ( δ t 0 )O(δt2)O(δt0)

Supongo que el "término pequeño" es , y la "diferencia de términos grandes" es .δt2a(t)2r(t)r(tδt)

Mi pregunta es, ¿por qué la imprecisión numérica resulta de agregar un término pequeño a una diferencia de términos grandes?

Estoy interesado en una razón conceptual bastante básica, ya que no estoy familiarizado con los detalles de la aritmética de coma flotante. Además, ¿conoce alguna referencia de "tipo general" (libros, artículos o sitios web) que me presente ideas básicas de aritmética de coma flotante relacionadas con esta pregunta? Gracias por tu tiempo.

Andrés
fuente

Respuestas:

9

Su observación "la forma del algoritmo puede introducir innecesariamente alguna imprecisión numérica" ​​es correcta. Pero su explicación '' Esto surge porque, en la ecuación (3.14), se agrega un término pequeño ( ) a una diferencia de términos grandes ( ), para generar la trayectoria. '' es espurio.O(δt2)O(δt0)

La verdadera razón de la ligera inestabilidad numérica del algoritmo de Verlet es que solo es marginalmente estable, porque la ecuación de diferencia (esencialmente el caso en el que descuidas Verlet) tiene una solución parásita proporcional a , lo que hace que los errores introducidos crezcan linealmente en mientras que para un método multipaso totalmente estable aplicado a una ecuación diferencial disipativa, el crecimiento del error está limitado.xk+1=2xkxk1akk

Editar: Tenga en cuenta que el libro trata sobre la simulación numérica de la dinámica molecular, y para obtener una precisión razonable de las expectativas resultantes, se necesita una gran cantidad de pasos, ya que la precisión se escala con solamente . (A menudo, el paso de tiempo está en los picosegundos para seguir la escala de oscilación intrínseca. Pero las escalas de tiempo biológicamente relevantes están en milisegundos o más ( ), aunque generalmente no se calcula tan lejos).NO(N1/2)N109

Para obtener más detalles, consulte http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence

Arnold Neumaier
fuente
10

Si está buscando una buena introducción, sugeriría lo que todo informático debe saber sobre la aritmética de coma flotante de David Goldberg . Puede ser un poco demasiado detallado, pero está disponible en línea de forma gratuita.

Si tiene una buena biblioteca, sugeriría la computación numérica de Michael Overton con la aritmética de coma flotante IEEE , o los primeros capítulos de la precisión y estabilidad de los algoritmos numéricos de Nick Higham .

A lo que Allen y Tildesley se refieren específicamente es a la cancelación numérica . El corto de él es que si tiene, por ejemplo, sólo tres dígitos y restar 100a partir 101, se obtiene 1.00(en tres dígitos). Parece que el número tiene una precisión de tres dígitos, pero en realidad, solo el primer dígito es verdadero y el final .00es basura. ¿Por qué? Bueno, 100y 101solo son representaciones inexactas de, digamos 100.12345y 101.4321, pero solo puedes almacenarlas como números de tres dígitos.

Pedro
fuente
-1: ¿Dónde está la cancelación que atribuyes a la fórmula de Verlet? Por lo general, es pequeño, lo que hace que , sin que se produzca una cancelación. ¡Prueba ! δtr(\tδt)r(t)r(t)=1
Arnold Neumaier
@ArnoldNeumaier: Sí, el ejemplo de Allen y Tildesley no parece tener mucho sentido, solo quería proporcionar alguna referencia para los problemas que surgen cuando "un término pequeño [...] se agrega a una diferencia de términos grandes", que es lo que el OP preguntó, no si es un problema en el caso dado.
Pedro
Pero agregar un término pequeño a un término grande es solo un error de redondeo, nada peligroso en absoluto. La cancelación es cuando se restan dos términos grandes casi iguales para obtener un término minúsculo. Esto se convierte en un problema solo cuando los intermedios restados son mucho más grandes que el resultado final de un cálculo, o cuando el pequeño resultado intermedio afectado por la cancelación se divide por otro elemento pequeño.
Arnold Neumaier
@ArnoldNeumaier: Como creo que es bastante obvio por mi respuesta, me refería al problema de calcular la diferencia, no la suma.
Pedro
1
@ArnoldNeumaier: Punto tomado, pero espero que entiendas que lo considero bastante insignificante para un "-1".
Pedro
5

(3.14)

r(t)=101
r(t-δt)=100
δt2un(t)=1,49

(3.14)

r(t+δt)=103,49

pero, dado que solo podemos usar tres dígitos, el resultado se trunca a

r(t+δt)=103

un(t)r(t+20δt)=331433.90

Igor F.
fuente
Pero el efecto es tan grande solo en aritmética decimal de 3 dígitos.
Arnold Neumaier
3

Pedro ya da el hecho importante, a saber, la cancelación. El punto es que cada número con el que calcula tiene una precisión asociada; por ejemplo, un solo número de coma flotante de precisión solo puede representar cosas de hasta aproximadamente 8 dígitos de precisión. Si tiene dos números que son casi exactamente iguales pero difieren en el séptimo dígito, entonces la diferencia será nuevamente un número de coma flotante de precisión simple de 8 dígitos y parece que tiene una precisión de 8 dígitos, pero en realidad solo el primero 1 o 2 dígitos son precisos porque las cantidades a partir de las cuales lo calculó no son precisos más allá de los primeros 1 o 2 dígitos de la diferencia.

Ahora, el libro que cita es de 1989. En aquel entonces, los cálculos se realizaban con mayor frecuencia en precisión simple y el redondeo y la cancelación eran problemas serios. Hoy en día, la mayoría de los cálculos se realizan con doble precisión con 16 dígitos de precisión, y esto es mucho menos problema de lo que solía ser. Creo que vale la pena leer los párrafos que cita con un grano de sal y tomarlos en el contexto de su tiempo.

Wolfgang Bangerth
fuente
La cancelación en aritmética de doble precisión puede ser un problema tan grande como en la precisión simple. Un ejemplo de ello es la eliminación gaussiana sin pivotar, que a menudo da resultados muy pobres debido a la cancelación, incluso con doble precisión.
Arnold Neumaier
-1: la fórmula de Verlet generalmente conserva todos los dígitos de precisión, no solo 1 o 2 de 8 en precisión simple.
Arnold Neumaier
@ArnoldNeumaier: Claro, puede obtener el mismo tipo de problemas con doble precisión. Todo lo que dije es que uno no los encuentra con tanta frecuencia.
Wolfgang Bangerth
Si pierde 6 dígitos tres veces en una cadena de cálculos, ha perdido todos los dígitos incluso con doble precisión. Los algoritmos que sufren de cancelación generalmente serán deficientes incluso con doble precisión. El algoritmo de Verlet es diferente ya que no hay cancelación sino un leve crecimiento lineal de errores. Por lo tanto, la pérdida de precisión no puede multiplicarse, lo que la hace adecuada para tiempos de integración mucho más largos. Esto seguramente lo sabían Allen y Tildesley.
Arnold Neumaier
Correcto. Pero lo que quiero decir es que si tiene un algoritmo sin cancelación, aún incurrirá en un error del orden de 1e-8 con precisión simple, y si realiza 1e8 pasos de tiempo, entonces puede tener un problema incluso si todo lo demás es exacto. 1e8 pasos de tiempo es un orden de magnitud que puede tener para ODE. Por otro lado, en doble precisión, su inexactitud en cada paso es 1e-16 y requeriría 1e16 pasos de tiempo para obtener una pérdida completa de precisión. Esa es una serie de pasos que no encontrará en la práctica.
Wolfgang Bangerth