Estoy tratando de resolver una ecuación de Poisson en 2D por diferencias finitas. En el proceso, obtengo una matriz dispersa con solo variables en cada ecuación. Por ejemplo, si las variables fueran , entonces la discretización produciría:
Sé que puedo resolver este sistema mediante un método iterativo, pero se me ocurrió pensar que si ordenaba las variables de manera adecuada, podría obtener una matriz con bandas que podría resolverse mediante un método directo (es decir, eliminación gaussiana w / o pivotante). es posible? ¿Hay alguna estrategia para hacer esto para otros sistemas dispersos, quizás menos estructurados?
Respuestas:
Este es un problema bien estudiado en el campo de los solucionadores dispersos directos. Recomiendo leer la descripción general de Joseph Liu del método multifrontal para tener una mejor idea de cómo los reordenamientos y los supernodos afectan el tiempo de llenado y solución.
La disección anidada es una forma extremadamente común de generar el reordenamiento, y esencialmente consiste en una partición gráfica recursiva. MeTiS es el estándar de facto para la partición de gráficos, y puede leer sobre algunas de las ideas detrás de esto aquí . Otro paquete de uso común es SCOTCH , y Chaco también es importante, ya que sus autores introdujeron la partición de gráficos multinivel , que también es la idea fundamental detrás de MeTiS .
George y Liu mostraron en su libro clásico que las soluciones 2d de dispersión directa solo requieren trabajo y memoria, mientras que 3d sparse-direct requiere trabajo y memoria.O ( n log n ) O ( n 2 ) O ( n 4 / 3 )O ( n3 / 2) O ( n logn ) O ( n2) O ( n4 / 3)
fuente
Cuthill-McKee es el estándar de facto para lo que quieres hacer. Si desea jugar con este método, hay una implementación fácil de usar del algoritmo (y su reverso) en la Biblioteca de gráficos Boost (BGL), y la documentación contiene ejemplos de cómo usarlo.
fuente
Hablando de métodos multifrontales, Tim Davis , que trabaja en métodos multifrontales para la factorización LU ( UMFPACK ) tiene una serie de rutinas que reordenarán las matrices para minimizar el llenado. Puede encontrarlos aquí como parte de SuiteSparse . SuiteSparse usa MeTiS.
Otra cosa a tener en cuenta: en algunos problemas, puede ser inteligente al ordenar variables para que se agrupen o se acerquen a patrones, lo que puede ahorrarle el problema (y el tiempo de CPU) de llamar a estos algoritmos. Sin embargo, este reordenamiento inteligente requiere una visión de su parte y no es tan general como los algoritmos de reordenamiento basados en la teoría de gráficos que la gente ha mencionado en sus respuestas aquí.
fuente
Hay un algoritmo llamado ADI (Alternando la dirección implícita) en los círculos matemáticos aplicados y el operador Split en los círculos de física que hace básicamente lo que usted describe. Es un método iterativo, y sigue este procedimiento básico:
Por cada valor de , relájese en la dirección x . Esta matriz debe ser tridiagonal, por lo que se puede resolver directamente en relativamente poco tiempo.y X
Para cada valor de , relájese en la dirección y . De nuevo, esto debería ser bastante rápido.X y
Repita 1 y 2 hasta que el error sea tan pequeño como desee.
No conozco la complejidad formal de este algoritmo, pero he encontrado que converge en menos iteraciones que cosas como Jacobi y Gauss-Seidel cada vez que lo uso.
fuente