varias titulos titulo poner leyenda grafico graficas grafica derivada como color cambiar calcular matlab numerical-methods derivative differentiation

poner - titulos a graficas matlab



¿Cuál es la mejor manera de calcular un derivado numérico en MATLAB? (2)

(Nota: esto pretende ser una comunidad wiki).

Supongamos que tengo un conjunto de puntos xi = { x0 , x1 , x2 , ... xn } y los valores de función correspondientes fi = f (xi) = { f0 , f1 , f2 , ..., fn }, donde f ( x ) es, en general, una función desconocida. (En algunas situaciones, podemos conocer f ( x ) antes de tiempo, pero queremos hacerlo en general, ya que a menudo no sabemos f ( x ) por adelantado). ¿Cuál es una buena manera de aproximar la derivada de f ( x ) en cada punto xi ? Es decir, ¿cómo puedo estimar los valores de dfi == d / d x fi == d f ( xi ) / d x en cada uno de los puntos xi ?

Desafortunadamente, MATLAB no tiene una rutina de diferenciación numérica de propósito general muy buena. ¡Parte de la razón de esto es probablemente porque elegir una buena rutina puede ser difícil!

Entonces, ¿qué tipo de métodos hay? ¿Qué rutinas existen? ¿Cómo podemos elegir una buena rutina para un problema particular?

Hay varias consideraciones al elegir cómo diferenciar en MATLAB:

  1. ¿Tienes una función simbólica o un conjunto de puntos?
  2. ¿Está su rejilla espaciada de manera uniforme o desigual?
  3. ¿Su dominio es periódico? ¿Se puede asumir condiciones de frontera periódicas?
  4. ¿Qué nivel de precisión estás buscando? ¿Necesita calcular los derivados dentro de una tolerancia dada?
  5. ¿Le importa que su derivado se evalúe en los mismos puntos en que se define su función?
  6. ¿Necesitas calcular múltiples órdenes de derivados?

¿Cuál es la mejor manera de proceder?


Creo que hay más en estas preguntas en particular. Así que he elaborado más sobre el tema de la siguiente manera:

(4) P: ¿Qué nivel de precisión está buscando? ¿Necesita calcular los derivados dentro de una tolerancia dada?

R: La precisión de la diferenciación numérica es subjetiva a la aplicación de interés. Por lo general, la forma en que funciona es que, si está utilizando el ND en el problema hacia adelante para aproximar los derivados para estimar las características de la señal de interés, entonces debe tener en cuenta las perturbaciones de ruido. Por lo general, tales artefactos contienen componentes de alta frecuencia y, según la definición del diferenciador, el efecto de ruido se amplificará en el orden de magnitud de $ i / omega ^ n $. Por lo tanto, aumentar la precisión del diferenciador (aumentar la precisión del polinomio) no ayudará en absoluto. En este caso, debería poder cancelar el efecto del ruido para la diferenciación. Esto se puede hacer en orden de caso: primero suavizar la señal y luego diferenciar. Pero una mejor manera de hacerlo es usar el "diferenciador de paso bajo". Un buen ejemplo de la biblioteca MATLAB se puede encontrar here .

Sin embargo, si este no es el caso y está utilizando ND en problemas inversos, como las PDE de solvigno, la precisión global del diferenciador es muy importante. Dependiendo de qué tipo de condición de bounady (BC) se adapte a su problema, el diseño se adaptará en consecuencia. La regla del golpe es aumentar la precisión numérica conocida es el diferenciador de banda completa. Es necesario diseñar una matriz derivada que cuide de la BC adecuada. Puede encontrar soluciones integrales para tales diseños utilizando el enlace anterior.

(5) ¿Le importa que su derivado se evalúe en los mismos puntos en que se define su función? A: Sí, absolutamente. La evaluación del ND en los mismos puntos de la cuadrícula se denomina esquemas "centralizados" y fuera de los puntos "escalonados". Tenga en cuenta que al utilizar un orden impar de derivados, el ND centralizado desviará la precisión de la respuesta de frecuencia del diferenciador. Por lo tanto, si está utilizando dicho diseño en problemas inversos, esto perturbará su aproximación. Además, lo contrario se aplica al caso de orden de diferenciación utilizado por esquemas escalonados. Puede encontrar una explicación completa sobre este tema usando el enlace de arriba.

(6) ¿Necesita calcular múltiples órdenes de derivados? Esto depende totalmente de su aplicación a la mano. Puede consultar el mismo enlace que he proporcionado y cuidar múltiples diseños de derivados.


Estas son solo algunas sugerencias rápidas y sucias. ¡Esperemos que alguien los encuentre útiles!

1. ¿Tienes una función simbólica o un conjunto de puntos?

  • Si tiene una función simbólica, es posible que pueda calcular la derivada analíticamente. (Lo más probable es que lo hubieras hecho si fuera tan fácil, y no estarías aquí buscando alternativas).
  • Si tiene una función simbólica y no puede calcular la derivada analíticamente, siempre puede evaluar la función en un conjunto de puntos y usar algún otro método que se menciona en esta página para evaluar la derivada.
  • En la mayoría de los casos, tiene un conjunto de puntos (xi, fi), y tendrá que usar uno de los siguientes métodos ...

2. ¿Está su rejilla espaciada de manera uniforme o desigual?

  • Si su cuadrícula está espaciada de manera uniforme , es probable que desee usar un esquema de diferencias finitas (vea cualquiera de los artículos de Wikipedia here o here ), a menos que esté usando condiciones de límites periódicas (vea a continuación). Here hay una introducción decente a los métodos de diferencias finitas en el contexto de la resolución de ecuaciones diferenciales ordinarias en una cuadrícula (ver especialmente las diapositivas 9-14). En general, estos métodos son computacionalmente eficientes, simples de implementar y el error del método se puede estimar simplemente como el error de truncamiento de las expansiones de Taylor utilizadas para derivarlo.
  • Si su cuadrícula está espaciada de manera desigual , aún puede usar un esquema de diferencias finitas, pero las expresiones son más difíciles y la precisión varía mucho según la uniformidad de su cuadrícula. Si su cuadrícula no es uniforme, es probable que necesite usar tamaños de plantilla grandes (puntos más adyacentes) para calcular la derivada en un punto determinado. Las personas a menudo construyen un polinomio de interpolación (a menudo el polinomio de Lagrange ) y diferencian ese polinomio para calcular la derivada. Ver, por ejemplo, this pregunta StackExchange. A menudo es difícil estimar el error usando estos métodos (aunque algunos han intentado hacerlo: here y here ). El método de Fornberg es a menudo muy útil en estos casos ...
  • Se debe tener cuidado en los límites de su dominio porque la plantilla a menudo involucra puntos que están fuera del dominio. Algunas personas introducen "puntos fantasma" o combinan condiciones de contorno con derivados de diferentes órdenes para eliminar estos "puntos fantasma" y simplificar la plantilla. Otro enfoque es utilizar los métodos de diferencias finitas del lado derecho o del lado izquierdo.
  • Here''s una excelente "hoja de trucos" de métodos de diferencias finitas, que incluyen esquemas centrados, a la derecha y a la izquierda de órdenes bajas. Guardo una impresión de esto cerca de mi estación de trabajo porque me resulta muy útil.

3. ¿Es su dominio periódico? ¿Se puede asumir condiciones de frontera periódicas?

  • Si su dominio es periódico, puede calcular los derivados con una precisión de orden muy alto utilizando los métodos espectrales de Fourier. Esta técnica sacrifica un poco el rendimiento para obtener una alta precisión. De hecho, si está utilizando N puntos, su estimación del derivado es aproximadamente N ° orden exacta. Para obtener más información, consulte (por ejemplo) este WikiBook .
  • Los métodos de Fourier a menudo usan el algoritmo de la Transformada rápida de Fourier (FFT) para lograr un rendimiento aproximado de O (N log (N)), en lugar del algoritmo O (N ^ 2) que podría emplear una transformada de Fourier discreta (DFT) implementada ingenuamente.
  • Si su función y dominio no son periódicos, no debe usar el método espectral de Fourier. Si intenta utilizarlo con una función que no es periódica, obtendrá grandes errores y fenómenos de "timbre" no deseados.
  • El cálculo de derivadas de cualquier orden requiere 1) una transformación del espacio de cuadrícula a espacio espectral (O (N log (N))), 2) multiplicación de los coeficientes de Fourier por sus números de onda espectral (O (N)), y 2) una Transformación inversa del espacio espectral al espacio de la cuadrícula (nuevamente O (N log (N))).
  • Se debe tener cuidado al multiplicar los coeficientes de Fourier por sus números de onda espectrales. Cada implementación del algoritmo FFT parece tener su propio ordenamiento de los modos espectrales y parámetros de normalización. Consulte, por ejemplo, la respuesta a esta pregunta en Math StackExchange, para obtener información sobre cómo hacerlo en MATLAB.

4. ¿Qué nivel de precisión estás buscando? ¿Necesita calcular los derivados dentro de una tolerancia dada?

  • Para muchos propósitos, un esquema de diferencias finitas de primer o segundo orden puede ser suficiente. Para mayor precisión, puede usar expansiones de Taylor de orden superior, eliminando términos de orden superior.
  • Si necesita calcular los derivados dentro de una tolerancia determinada, puede buscar un esquema de alto orden que contenga el error que necesita.
  • A menudo, la mejor manera de reducir el error es reducir el espacio de la cuadrícula en un esquema de diferencias finitas, pero esto no siempre es posible.
  • Tenga en cuenta que los esquemas de diferencias finitas de orden superior casi siempre requieren tamaños de plantilla más grandes (más puntos adyacentes). Esto puede causar problemas en los límites. (Vea la discusión anterior sobre los puntos fantasma).

5. ¿Le importa que su derivado se evalúe en los mismos puntos en que se define su función?

  • MATLAB proporciona la función diff para calcular diferencias entre elementos de matriz adyacentes. Esto se puede usar para calcular derivados aproximados a través de un esquema de primer orden de diferenciación hacia adelante (o diferencia finita hacia adelante ), pero las estimaciones son estimaciones de orden bajo. Como se describe en la documentación de MATLAB de diff ( link ), si ingresa una matriz de longitud N, devolverá una matriz de longitud N-1. Cuando estima los derivados utilizando este método en N puntos, solo tendrá estimaciones del derivado en N-1 puntos. (Tenga en cuenta que esto se puede usar en cuadrículas desiguales, si están ordenadas en orden ascendente).
  • En la mayoría de los casos, queremos que el derivado se evalúe en todos los puntos, lo que significa que queremos usar algo además del método diff .

6. ¿Necesita calcular múltiples órdenes de derivados?

  • Uno puede configurar un sistema de ecuaciones en el que los valores de la función del punto de la cuadrícula y las derivadas de primer y segundo orden en estos puntos dependan el uno del otro. Esto se puede encontrar combinando las expansiones de Taylor en los puntos vecinos como de costumbre, pero manteniendo los términos derivados en lugar de cancelarlos y vinculándolos con los de los puntos vecinos. Estas ecuaciones se pueden resolver a través del álgebra lineal para dar no solo la primera derivada, sino también la segunda (o órdenes superiores, si se configuran correctamente). Creo que estos se denominan esquemas combinados de diferencias finitas y, a menudo, se usan junto con esquemas compactos de diferencias finitas, que se analizarán a continuación.
  • Esquemas compactos de diferencias finitas ( link ). En estos esquemas, uno configura una matriz de diseño y calcula los derivados en todos los puntos simultáneamente mediante una resolución de matriz. Se les llama "compactos" porque generalmente están diseñados para requerir menos puntos de plantilla que los esquemas ordinarios de diferencias finitas de precisión comparable. Debido a que involucran una ecuación matricial que une todos los puntos, se dice que ciertos esquemas compactos de diferencias finitas tienen una "resolución espectral" (por ejemplo, el documento de Lele de 1992 - ¡ excelente !), Lo que significa que imitan los esquemas espectrales al depender de todos los valores nodales y, debido a esto, mantienen la precisión en todas las escalas de longitud. En contraste, los métodos típicos de diferencias finitas solo son precisos a nivel local (la derivada en el punto # 13, por ejemplo, generalmente no depende del valor de la función en el punto # 200).
  • Un área actual de investigación es la mejor manera de resolver múltiples derivados en una plantilla compacta. Los resultados de dicha investigación, combinados, los métodos compactos de diferencias finitas, son poderosos y ampliamente aplicables, aunque muchos investigadores tienden a ajustarlos para necesidades particulares (rendimiento, precisión, estabilidad o un campo particular de investigación como la dinámica de fluidos).

Rutinas de Ready-to-Go

  • Como se describió anteriormente, se puede usar la función diff ( link a la documentación) para calcular derivadas aproximadas entre elementos de matriz adyacentes.
  • La rutina de gradient de MATLAB ( link a la documentación) es una excelente opción para muchos propósitos. Implementa un esquema de diferencia central de segundo orden. Tiene las ventajas de computar derivados en múltiples dimensiones y respaldar el espaciado de cuadrícula arbitrario. (¡Gracias a @thewaywewalk por señalar esta omisión evidente!)

  • Utilicé el método de Fornberg (ver arriba) para desarrollar una pequeña rutina ( nderiv_fornberg ) para calcular diferencias finitas en una dimensión para separaciones de cuadrícula arbitrarias. Me resulta fácil de usar. Utiliza plantillas laterales de 6 puntos en los límites y una plantilla central de 5 puntos en el interior. Está disponible en MATLAB File Exchange here .

Conclusión

El campo de la diferenciación numérica es muy diverso. Para cada método enumerado anteriormente, hay muchas variantes con su propio conjunto de ventajas y desventajas. Este post no es un tratamiento completo de diferenciación numérica.

Cada aplicación es diferente. Esperamos que esta publicación le brinde al lector interesado una lista organizada de consideraciones y recursos para elegir un método que se adapte a sus propias necesidades.

Esta wiki de la comunidad podría mejorarse con fragmentos de código y ejemplos específicos de MATLAB.