¿Cómo identificar los cálculos de punto flotante inestables?

15

En numérica, es muy importante poder identificar esquemas inestables y mejorar su estabilidad. ¿Cómo identificar los cálculos de punto flotante inestables?

Estoy trabajando en una simulación muy compleja donde muchos esquemas numéricos trabajan juntos y estoy buscando un método para identificar sus partes débiles. Estoy trabajando en un modelo físico que involucra ecuaciones diferenciales. Una vista panorámica del proceso general es:

  1. (Etapa preliminar) Reunir las observaciones físicas P .

  2. Determinar los parámetros iniciales de la simulación. Esto utiliza un algoritmo de optimización, donde caminamos en un espacio de parámetros y buscamos los parámetros C de manera que se minimice alguna función de error E (F (C), P) , donde F es una cantidad derivada de los parámetros.

  3. Enchufe C en el motor de simulación. Este es un esquema de Euler del EDP, por lo que en cada paso de tiempo, calculamos los términos que impulsan la dinámica (cada uno de ellos es una función compleja, potencialmente sujeta a inestabilidad) y alimentamos el esquema de Euler con estos términos dinámicos para calcular el siguiente estado. Esto continúa por miles de puntos de tiempo.

  4. Al final de la simulación, calculamos alguna función Prueba (S) del estado final S y la comparamos con algunas cantidades Requerir (P) deducidas de las cantidades observadas. Esto no es una prueba formal del resultado, más una verificación de plausibilidad.

Además, veo una torre de operaciones complejas (cálculo de términos dinámicos, dentro del esquema de Euler, dentro de la Prueba ). Y me gustaría reconocer las "partes malas" y arreglarlas.

Especulo que el uso de una implementación de software de números de coma flotante con precisión reducida aumentaría la inestabilidad de los esquemas numéricos, facilitando así la comparación entre diferentes implementaciones. ¿Es esta una técnica común para investigar esta pregunta? ¿Es posible usar una máquina virtual, como Bochs, para lograr esto sin alterar el programa?

Para abordar adecuadamente la cuestión de la estabilidad, a veces es aceptable apuntar a la entrada típica del procedimiento numérico, de modo que se pueda ajustar para que funcione bien en esa entrada y tal vez menos en otra entrada válida, aunque poco probable. Dada una muestra de entradas típicas, es posible espiar algunos resultados intermedios y preparar un perfil estadístico para ellos. Nuevamente, ¿es esta una técnica común para estudiar problemas de estabilidad? ¿Es útil una máquina virtual para esto?

usuario40989
fuente
puede ser que tenga respuestas más interesantes en math.stackexchange.com
Simon Bergot
@ Simon Puede que tengas razón, pero esta es definitivamente una pregunta de dominio cruzado. Supongo que las personas capaces de responder están registradas tanto en matemáticas como en programadores o en ninguno ... ¡Esperemos un poco para ver si esta pregunta encuentra su respuesta aquí!
user40989
1
Intervalo de aritmética?
SK-logic
2
Usar a Euler para propagar el estado no es necesariamente malo; tampoco lo es la optimización, pero realmente debe dividir el problema en subtareas. La inestabilidad numérica puede ser el menor de sus problemas: la convergencia a un máximo falso y los problemas relacionados con la rigidez de las EDO / PDE son mayores que eso. Y sí, nunca use precisión única :)
Deer Hunter

Respuestas:

6

El estudio de la estabilidad del cálculo de coma flotante es parte del análisis numérico y si realmente desea un resultado sólido, realmente desea que alguien con conocimientos en ese dominio haga el análisis de los algoritmos utilizados.

Hay algunas cosas que pueden ayudar a identificar experimentalmente algoritmos inestables. Ejecutar con redondeo configurado en diferentes modos (arriba / abajo / aleatorio) o con diferente precisión y verificar que el resultado no varíe demasiado. ¿Responder es demasiado? no es simple en absoluto e incluso cuando la respuesta es no, eso no significa que el algoritmo sea estable, solo que no se detectó inestable en el conjunto de datos que usó.

La aritmética de intervalos se ha propuesto en los comentarios. Cuando lo miré, incluso el defensor más rabioso de la aritmética de intervalos admitió que funcionaba bien con algoritmos diseñados para la aritmética de intervalos, pero que cambiar a él sin analizar el algoritmo y asegurarse de que no tenía patrones conocidos no funcionaría bien. ser útil (los opositores parecían considerar que las condiciones previas para que la aritmética de intervalos sea útil eran demasiado restrictivas para ser de interés práctico)

Un programador
fuente
3

El diseño de algoritmos de coma flotante estables es altamente no trivial. Aquellos más hábiles matemáticamente que yo sugieren usar bibliotecas bien consideradas siempre que sea posible en lugar de intentar crear una propia. La referencia estándar en el área parece ser:

NJ Higham. Precisión y estabilidad de los algoritmos numéricos. Society for Industrial and Applied Mathematics, Filadelfia, PA, EE. UU., Segunda edición, 2002. ISBN 0-89871-521-0

No saber más sobre qué tipos de cálculos, idiomas, etc. hace que sea difícil dar una respuesta concreta. Hay una buena conferencia aquí: http://introcs.cs.princeton.edu/java/91float/ esto puede ser un poco básico, pero es una buena introducción si está utilizando Java.

WPrecht
fuente
1

¿Cómo identificar los cálculos de punto flotante inestables? ¿Es esta una técnica común para investigar esta pregunta?

Creo que a menos que necesite mostrar algunas estadísticas sobre errores, realmente no necesita recopilar muestras. Lo que necesita es Análisis numérico , que también se incluye en los temas de Métodos numéricos, Álgebra lineal numérica, etc. Y son parte de la informática, por lo que también puede obtener algunas respuestas en cs.stackexchange.

De todos modos, en la programación general, la mayoría de los problemas son fáciles de detectar dada la comprensión básica sobre cómo funciona el punto flotante y los métodos numéricos básicos. Pero los problemas aún más complejos son "más fáciles" de resolver hoy en día con la disponibilidad de flotadores de 128 bits, razón aún menor para producir muestras de error. Aquí hay algunos problemas de ejemplo para mostrar mi punto:

  1. utilizando coma flotante para calcular valores monetarios.
  2. usando coma flotante para grandes números.
  3. no hacer divisiones antes de otras operaciones cuando es posible hacerlo. (para acercar el valor a 0).
  4. cálculo largo sin tratamiento especial para la propagación de errores.

También hay un ejemplo de un algoritmo ingenuo y un algoritmo de error compensado aquí algoritmo para calcular la varianza . En el ejemplo, mirando la versión ingenua, puede oler que hacer el cálculo en bucles conllevará algunos errores y no se está compensando.

imel96
fuente
Gracias por su respuesta, sin embargo, estoy buscando información más detallada. Tengo un cálculo muy grande y quiero identificar sus partes débiles. Edité la pregunta en consecuencia.
user40989
No estoy exactamente seguro de cuál es su situación cuando dice que tiene un gran cálculo y quiere identificar las partes débiles. Los cálculos numéricos tienen errores inherentes, incluso una simple operación de suma. Entonces, a menos que su cómputo grande sea compensado por error, entonces deben ser reparados en su conjunto. Mejorar los puntos débiles podría no ser lo suficientemente bueno. Si ahora es el "épsilon" de su modelo de coma flotante, un análisis simple mostrará cuán grande puede ser el error a medida que se propagan a través del largo cálculo.
imel96
0

Puede evitar errores numéricos utilizando los tipos de datos apropiados (como, por ejemplo, fracciones continuas). Si necesita o desea usar aritmética de coma flotante, debe aplicar conocimientos numéricos para conocer los errores.

Ingo
fuente
No quiero evitar errores numéricos, quiero encontrar qué partes del cálculo son inestables. Es similar a localizar cuellos de botella de velocidad cuando se optimiza la velocidad. Entonces, quiero optimizar la precisión y, por lo tanto, quiero encontrar cuellos de botella de precisión. (Las fracciones continuas no son útiles aquí.)
user40989
1
@ user40989, entonces definitivamente necesitas aritmética de intervalos.
SK-logic