Método de Descomposición LU

La descomposición de LU es una técnica que consta de dos pasos, la descomposición de LU y la sustitución; Al igual que la técnica de gauss requiere de la aplicación de técnicas de pivoteo para evitar la división por cero y evitar errores en los resultados.

Paso 1: descomposición de L y U, es posible utilizar gauss para descomponer nuestro sistema de ecuaciones en una matriz L y otra U.
 
Matriz L         
 
F21 = a21 / a11
F31 = a31 / a11
F32 = a’32 / a’22

Matriz U obtenida mediante eliminación de gauss


d1, d2, y d3 permanecen intactos.
 
Algoritmo escrito en C# que realiza la descomposición de LU, en este algoritmo que se realiza técnica de pivoteo por lo que se pueden producir errores al dividir por cero.
 
        /// <summary>
        /// Algoritmo que realiza descomposicion LU
        /// </summary>
        /// <param name="matrixU">matriz que contiene el sistema de ecuaciones a resolver (completo)</param>
        /// <param name="matrixL">matriz vacia que contendra (L) del mismo tamaño que matrixU</param>
        /// <param name="filas">cantidad de filas de ambas matrices</param>
        /// <param name="columnas">cantidad de columnas de ambas matrices</param>
        private void MetodoLU(ref double[,] matrixU, ref double[,] matrixL, int filas, int columnas)
        {
            for (int fpivot = 0; fpivot < filas - 1; fpivot++)
            {
                matrixL[fpivot, fpivot] = 1;

                for (int f = fpivot + 1; f < filas; f++)
                {
                    double k = matrixU[f, fpivot] / matrixU[fpivot, fpivot];

                    matrixL[f, fpivot] = matrixU[f, fpivot] / matrixU[fpivot, fpivot];

                    for (int c = fpivot; c < columnas - 1; c++)
                    {
                        matrixU[f, c] = matrixU[f, c] - (k * matrixU[fpivot, c]);
                    }
                }
            }
        }

Paso 2: realizar sustitución adelante y atrás para obtener nuestra solución
Igualar la matriz L a D y hacer sustitución adelante para obtener los valores de D

=  

Igualar la matriz U a nuestros nuevos valores D y hacer sustitución hacia atrás para obtener los valores de D que representan la solución del sistema.

Algoritmo escrito en C# para la sustitución hacia adelante, este método hace uso del algoritmo de sustitución hacia atrás empleado en el método de gauss:
        /// <summary>
        /// Algoritmo que realiza descomposicion LU
        /// </summary>
        /// <param name="matrixU">matriz que contiene el sistema de ecuaciones a resolver (completo)</param>
        /// <param name="matrixL">matriz vacia que contendra (L) del mismo tamaño que matrixU</param>
        /// <param name="filas">cantidad de filas de ambas matrices</param>
        /// <param name="columnas">cantidad de columnas de ambas matrices</param>
        /// <returns>devuelve un string que contiene la solucion</returns>
        private string SustitucionAdelante(ref double[,] matrixU,ref double[,] matrixL, int filas, int columnas)
        {
            StringBuilder sb = new StringBuilder();
            matrixL[0, columnas - 1] = matrixU[0, columnas - 1];
            sb.AppendLine("D1 = " + matrixL[0, columnas - 1].ToString());

            for (int i = 1; i < filas; i++)
            {
                double suma = 0;

                for (int j = 0; j < i; j++)
                {
                    suma += matrixL[i, j] * matrixL[j, columnas - 1];
                }

                matrixL[i, columnas - 1] = matrixU[i, columnas - 1] - suma;
                sb.AppendLine("D" + (i + 1) + "= " + matrixL[i, columnas - 1].ToString());
            }

            for (int i = 0; i < filas; i++)
            {
                matrixU[i, columnas - 1] = matrixL[i, columnas - 1];
            }

            //aplicar el algoritmo de sustitucion hacia atras empleado en el metodo de gauss a la matriz U
            sb.AppendLine(SustitucionAtras(matrixU));

            return sb.ToString();
        }
    Programa que realiza Descomposición de LU en C#
     

    Descarga solución para VS 2010

    Comentarios

    1. En la parte de la sustitucion, que se supone que es "matrix" Con que valores se inicializa? De que tama;o es? De donde salio? Creo que esa parte no queda muy clara

      ResponderEliminar

    Publicar un comentario

    Temas relacionados

    Entradas populares de este blog

    tkinter Grid

    Detección de líneas y círculos usando la transformada de Hough con OpenCV

    tkinter Canvas

    Conectar SQL Server con Java

    Controles y Contenedores JavaFX 8 - I