Generar automáticamente matrices de diferencias finitas para sistemas de PDE


8

Suponga que tiene un sistema de PDE para resolver. Al menos por simplicidad, supongamos que es independiente del tiempo, cuasi lineal (lineal en sus derivadas) resuelto en una cuadrícula rectangular en el espacio (x, y) y con condiciones de contorno especificadas por todos lados. Mi pregunta es más general, pero comencemos aquí.

Puede haber dos variables dependientes, y . La ecuación general podría tener la forma:v ( x , y )tu(X,y)v(X,y)

una(X,y)YXX+si(X,y)Yyy+CYXy+re(X,y)YX+mi(X,y)Yy=F(X,y,Y)

donde todas las funciones de a son matrices de 2x2, es una matriz de 2x1 e ese f YunamiFY

Y(X,y)=(tu(X,y)v(X,y))

Suponga que desea calcular una aproximación numérica de diferencia finita. Suponga que los puntos de la cuadrícula están espaciados uniformemente en x e y. Puede discretizar en N puntos ey en M puntos. Y luego construiría una solución como un vector de columna de 2 (nm).XnorteyMETRO

X=(tu11tunorte1tunortemetrov11vnortemetro)

Entonces resolverías algún tipo de ecuación matricial

(UNA+si+C+re+mi)X=si,

donde las matrices de 2nm x 2nm de la UNA a la mi son matrices de diferencias finitas para los operadores diferenciales correspondientes. La matriz combinada entre paréntesis tendrá algún tipo de estructura de bandas en bloque. Sus valores de borde pueden ser complicados debido a las condiciones de contorno.

Mi pregunta es simple: ¿hay una manera fácil (particularmente en Matlab ) de generar las matrices de la UNA a la mi ? O, al menos, una guía simple para crear todas las matrices necesarias (excepto quizás las modificaciones que necesita para las condiciones de contorno, que podrían ser una entrada manual).

El problema es que puedo hacer esto a mano, pero es (i) mucho álgebra; y (ii) sujeto a muchos errores tipográficos y errores cuando implementa.

Por ejemplo, aquí hay un código que le brinda todos los vectores necesarios para una 'matriz' de diferencias finitas 1D para diferentes órdenes de derivadas. ¿Existe una analogía para los sistemas de PDE en el avión?

Respuestas:


3

No conozco ninguna solución fácil, pero no es demasiado difícil automatizar esto usando un paquete de cálculo simbólico como Maple o Maxima . Puede ver aquí un ejemplo de esta idea aplicada a una ecuación de difusión 1D.

En particular, desea las funciones LinearAlgebra[GenerateMatrix](en Maple) o augcoefmatrix(en Maxima). MATLAB tiene una caja de herramientas de cálculo simbólico que creo que también se puede usar para este propósito.

Con respecto a la automatización de la implementación, puede usar el CodeGenerationmódulo en Maple para generar el código MATLAB o las funciones grindy fortrande Maxima para producir una salida cercana a MATLAB.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.