You are currently browsing the tag archive for the ‘métodos iterativos’ tag.

Después de muchísimo tiempo sin escribir, vuelvo con este post que resume todo el trabajo que hemos realizado durante este último año.

En julio del año pasado nos enteramos de un artículo publicado por X. Yang and R. Mittal, de la Johns Hopkins University, en el que aceleraban de manera espectacular el algoritmo de Jacobi y lo utilizaban para resolver ecuaciones en derivadas parciales de tipo elíptico.

A pesar del relativo eco mediático que tuvo, y aunque aceleraba muchísimo Jacobi, seguía sin ser competitivo con los métodos utilizados actualmente para solucionar este tipo de ecuaciones. Sin embargo, como prometía en cuanto a su sencillez desde el punto de vista tanto de implementación como de paralelización, decidimos trabajar un tiempo sobre el mismo.

Finalmente, en junio presentamos unos proceedings en el CEDYA 2015 (pag. 733) y hace tres semanas enviamos un paper a JCP, donde presentamos una serie de mejoras realizadas que permiten, tal y como allí comentamos, que el SRJ sea prácticamente competitivos en ejecución secuencial con los algoritmos utilizados actualmente.

Por un lado, su inmediata implementación (todos tenemos un Jacobi implementado de nuestro curso de métodos numéricos, y es trivial convertirlo en un SRJ 🙂 ) hace pensar que mucha gente que no tenga y necesite un resolvedor elíptico eficiente sin invertir mucho esfuerzo en su implementación quiera utilizarlo. Por otro, su trivial paralelización, por ejemplo en entornos GPU, nos hace pensar en su extraordinario potencial en el ámbito de la supercomputación.

En la página de nuestro grupo de investigación tenemos disponibles todos los esquemas SRJ presentados en el paper.

¡Disfrutenlo!

Ya comentamos en el post anterior que formato tienen los sistemas Au=f que surgen a partir de la discretización de un problema de Poisson y que tendremos que resolver. Esta resolución la podriamos hacer de manera directa pero son mucho mas eficaces los métodos iterativos.

Se puede demostrar que la manera mas sencilla para obtener los algoritmos de los diferentes métodos iterativos es pensar sencillamente en la aproximación por diferencias finitas, despejando la variable central i calcularla en función de los vecinos del paso de tiempo anterior para Jacobi, introduciendo un peso para ponderar el paso anterior de la misma variable con el calculado por Jacobi para relajación y, finalmente, utilizar no las varialbles del paso anterior sino tambien las ya calculadas del paso actual para Gauss-Seidel.

Además, el hecho de trabajar con n dimensiones solo significa colocar nuestra expresión en n bucles anidados. Así de sencillo…

En el caso de 1D, tendriamos:

for (int i=1; i<nx-1; i++) {

    //Jacobi
    vj[t+1][i] = 0.5 * ( vj[t][i-1] + vj[t][i+1] + h*h*f[i] );

    //weighted Jacobi
    vwj[t+1][i] = vwj[t][i] + w * ( vwj[t][i] - vj[t+1][i] );

    //Gauss-Seidel
    vgs[i] = 0.5 * ( vgs[i-1] + vgs[i+1] + h*h*f[i] );

    //weighted Gauss-Seidel
    vwgs[i] = vwgs[i] + w * ( vwgs[i] - vgs[i] );

}
agosto 2017
L M X J V S D
« Jul    
 123456
78910111213
14151617181920
21222324252627
28293031