Derivados numéricos y coeficientes de diferencia finita: ¿alguna actualización del método Fornberg?

11

Cuando se quiere calcular derivadas numéricas, el método presentado por Bengt Fornberg aquí (y reportado aquí ) es muy conveniente (preciso y simple de implementar). Como el documento original data de 1988, me gustaría saber si hay una mejor alternativa hoy (como (o casi como) simple y más precisa).

Vincent
fuente
1
Difícil de decir sin saber lo que quiere diferenciar. ¿Has considerado la diferenciación automática ?
Biswajit Banerjee
@BiswajitBanerjee: Para coeficientes de diferencia finita, no se aplica la diferenciación automática.
Geoff Oxberry
@ GeoffOxberry: Me refería al problema físico real, es decir, la parte científica de la "ciencia computacional".
Biswajit Banerjee
@ Vincent: ¿Estás tratando de diferenciar una función o una tabla? Si los datos de la tabla, ¿son ruidosos los datos de la tabla? ¿Estás tratando de discretizar un PDE?
user14717

Respuestas:

9

Visión general

Buena pregunta. Hay un documento titulado "Mejora de la precisión del método de diferenciación de matriz para puntos de colocación arbitrarios" por R. Baltensperger. No es gran cosa en mi opinión, pero tiene un punto (que ya era conocido antes de la aparición en 2000): destaca la importancia de una representación precisa del hecho de que la derivada de la función constante f(x)=1 debería ser cero (esto se cumple exactamente en el sentido matemático, pero no necesariamente en la representación numérica).

Es simple ver que esto requiere que las sumas de filas de las n-ésimas matrices derivadas D(n) sean cero. Es común hacer cumplir esta restricción ajustando la entrada diagonal, es decir, estableciendo

(1)Djj(n):=i=1ijNDij.
Está claro que esta característica no se cumple exactamente cuando se trabaja en una computadora debido a errores de redondeo en los cálculos de coma flotante. Lo que es más sorprendente es que estos errores son aún más graves cuando se utilizan las fórmulas analíticas para la matriz derivada (que están disponibles para muchos puntos de colocación clásicos, por ejemplo, Gauss-Lobatto).

Ahora, el documento (y las referencias en él) establece que el error de la derivada está en el orden de la desviación de las sumas de la fila desde cero. Por lo tanto, el objetivo es hacer que estos sean numéricamente lo más pequeños posible.

Pruebas numéricas

Lo bueno es que el procedimiento de Fornberg parece ser bastante bueno a este respecto. En la siguiente imagen, he comparado el comportamiento de la matriz de primera derivada exacta, es decir, analítica, y la derivada por el algoritmo de Fornberg, para un número variable de puntos de colocación de Chebyshev-Lobatto.

Nuevamente, creyendo en la declaración en el documento citado, esto implica que el algoritmo de Fornberg producirá resultados más precisos para la derivada.

(2)f(x)=11+x2.
(3)En=maxi{0,,n}|f(xi)j=1nDijf(xj)|.
(4)D~jj=Djj(i=1nDji),for all j.

Conclusión

En conclusión, el método de Fornberg parece ser bastante preciso, en el caso de incluso en aproximadamente 3 órdenes de magnitud más precisos que los resultados de las fórmulas analíticas. Esto debería ser lo suficientemente preciso para la mayoría de las aplicaciones. Además, esto es notable porque Fornberg no parece incluir explícitamente este hecho en su método (al menos no se menciona en los dos documentos de Fornberg).N=512

Se puede obtener otro orden de magnitud para este ejemplo a través de una inclusión directa de la ecuación (4). Como este es un enfoque bastante simple y se aplica solo una vez para cada derivado, no veo ninguna razón para no usarlo.

El método del artículo de Baltensperger, que utiliza un enfoque más sofisticado para evaluar la suma en la ecuación (1) para reducir los errores de redondeo, produce aproximadamente el mismo orden de magnitud para el error. Entonces, al menos para este ejemplo, es más o menos equivalente al método "Fornberg ajustado" anterior.

davidhigh
fuente
4

Suponiendo que está tratando de diferenciar una implementación numérica de una función continua, hay una gran cantidad de métodos:

1) Diferenciación automática. El método más preciso y general. Doloroso de codificar, que requiere sobrecarga del operador y búsqueda dependiente de argumentos. Pone una carga en el usuario para comprender estos conceptos. También lucha con singularidades removibles, como diferenciar sinc en .x=0

2) Una transformación de Chebyshev. Proyecte su función en un lapso de polinomios de Chebyshev y diferencie la recurrencia de tres términos. Súper rápido, muy preciso. Pero requiere que tenga un dominio de interés compatible de forma compacta; fuera del dominio seleccionado , la recurrencia de tres términos es inestable.[a,b]

3) Diferenciación finita. Subestimado en 1D; ver los consejos y trucos de Nick Higham en computación numérica . La idea es que si equilibra el error de truncamiento y el error de redondeo, no necesita seleccionar un tamaño de paso; Se puede elegir automáticamente. En Boost, esta idea se usa para recuperar (por defecto) 6/7 de los dígitos correctos para el tipo. (Higham solo muestra la idea para el caso más simple de la mitad de los dígitos correctos, pero la idea se extiende fácilmente.) Los coeficientes son de la tabla equiespaciada de Fornberg, pero el tamaño de pasos se elige bajo el supuesto de que la función se puede evaluar a 1ULP exactitud. La desventaja es que requiere 2 evaluaciones de funciones para recuperar la mitad de los dígitos del tipo, 4 para recuperar 3/4 de los dígitos, etc. En 1D, no es un mal negocio. En dimensiones superiores, es catastrófico.

4) La derivada del paso complejo. Use . Tome como redondeo de la unidad y esto se recuperará casi por completo. Sin embargo, es un poco engañoso, porque generalmente es más difícil implementar una función en el plano complejo que codificar manualmente su derivada real. Sigue siendo una idea genial y útil en ciertas circunstancias.f(x)(f(x+ih))h

usuario14717
fuente
1

No estoy al tanto de que nadie haya mejorado el algoritmo de Fornberg (Véase también su poco más reciente de papel ). Por otro lado, me parece que mirar su algoritmo como una forma de calcular derivadas numéricas no es correcto. Todo lo que ha hecho es derivar un algoritmo eficiente para calcular los pesos de los métodos de diferencias finitas. La ventaja de su método es que le brinda los pesos de todos los derivados hasta el derivado deseado de una sola vez.

Brian Zatapatique
fuente
No estaría de acuerdo con la afirmación "mirar su algoritmo como una forma de calcular derivadas numéricas no es correcto". Una vez que haya evaluado los pesos para el punto , puede calcular directamente la derivada numérica de cualquier función mediante . wizf(x)f(z)=iwif(xi)
davidhigh
@davidhigh: Si lees los documentos de Fornberg, hablan sobre el cálculo de pesos para aproximaciones de diferencias finitas, no sobre el cálculo de las aproximaciones en sí. Por supuesto, también puede usar el algoritmo para calcular las derivadas, pero tiene más sentido calcular los pesos, almacenarlos y luego usarlos repetidamente para calcular las derivadas aproximadas. De lo contrario, está calculando los pesos repetidamente cuando no es necesario.
Brian Zatapatique
1

Un esquema mas simple

Además de mi otra respuesta, que trata más sobre una extensión del método Fornberg, abordaré aquí la pregunta para obtener alternativas más simples.

Para esto bosquejo un esquema alternativo que produce los coeficientes derivados de la interpolación lagrangiana más directamente. Su implementación requiere solo unas pocas líneas de código, funciona para cuadrículas arbitrarias y, según mis primeros experimentos, es tan precisa como la de Fornberg.

La base de la implementación es la derivada de paso imaginario donde es una variable en el orden de precisión de máquina. Se sabe que la derivada de paso imaginario produce valores derivados de forma estable y no sufre la inestabilidad numérica de una implementación de diferencia finita con .

f(x) = 1hIm(f(x+ih)),
hh0

El segundo ingrediente es el polinomio de interpolación de Lagrange en la cuadrícula evaluado con una de las formas , por ejemplo, donde Para usar la derivada de pasos complejos, uno debe asegurarse de que estas fórmulas también funcionen para complejos argumentos . Además, para una función dada f (x) y un vector de coeficientes , denotamos el polinomio de interpolación a través de por Li(x){x1,,xN}

Li(z) = {1if z=xi μizxkkμkzxkotherwise.
μi=1ki(xixk)zfi=f(xi)(x1,fi)
P(x;f)=i=1NfiLi(x).


Algoritmo

El algoritmo se bosqueja a continuación. Tiene los mismos parámetros de entrada y salida que los de Fornberg, pero es mucho más obvio.

Entrada:

  • x : una cuadrícula con N puntos de cuadrícula distintos
  • ord : orden derivado
  • z: un punto en el que se debe evaluar la derivada
  • Posiblemente: una función o sus valores de función en los puntos de la cuadrícula (solo se requiere para la variante de salida 2.)f(x)fi

Inicialización

  • Inicialice los polinomios de Lagrange mediante interpolación baricéntrica.L
  • Inicialice una matriz de -matrices , paraN×ND(o)o=0,,ord
  • Establezca , es decir, la matriz unitaria de dimensiónD(0):=INN×N
  • Establecero:=0

Algoritmo

Mientras :o<ord

  • Calcule por la derivada de paso complejo para todo y . Aquí, denota la -ésima fila de .Dik(o+1)=CSD(P(xk;Di(o)))CSDik
    Di(o)iD(o)

  • Establecer o = o + 1;

Decidir qué producir :

  1. El vector de los coeficientes de diferencia finita en el punto , donde . Esto es lo que hace Fornberg.d(ord)zdi=P(z;Di(ord))

  2. La función de interpolación a la derivada de orden . Para esto, debe ingresar una función resp. la función valora en para el algoritmo.p(ord)(x)=i=1Nf(xi)P(x;Di(ord))f(ord)(x)ordfixi

  3. Una metafunción que devuelve la función de interpolación de la variante 2., pero para una función arbitraria que se debe interpolar en los puntos de la cuadrícula.diff(int ord,function g)g

Personalmente, me gusta más la variante 3.


Análisis del algoritmo.

Como el de Fornberg, este algoritmo es . Publicaré resultados más empíricos con respecto a la precisión, estabilidad, etc. si encuentro el tiempo.O(ordN2)

davidhigh
fuente
0

Para aumentar la precisión de la diferenciación numérica, haga lo siguiente:

1) Elija su método "estándar" favorito de alta precisión basado en algún tamaño de paso h .

2) Calcule el valor de la derivada con el método elegido en 1) muchas veces con tamaños de paso diferentes pero razonables h . Cada vez que puede elegir h como un número aleatorio del intervalo (0.5 * H / 10, 1.5 * H / 10) donde H es un tamaño de paso apropiado para el método que utiliza.

3) Promedio de los resultados.

Su resultado puede ganar 2-3 órdenes de magnitud en el error absoluto wrt. El resultado no promediado.

https://arxiv.org/abs/1706.10219

F. Jatpil
fuente
3
¡Bienvenido a SciComp.SE! Esta respuesta sería aún mejor si resumiera brevemente el método.
Christian Clason
2
Además, su nombre de usuario sugiere que escribió ese documento. Lea nuestras pautas sobre autopromoción y edite su publicación en consecuencia.
Wrzlprmft
Sinceramente, creo que la votación negativa es injusta si mi respuesta realmente apunta a una respuesta válida.
F. Jatpil
1
Yo también ... así que toma mi +1 ... :-)
davidhigh