LU factorization using Gaussian deletion in C ++

0

Very good day! I am trying to implement the LU factorization using Gaussian elimination (my previous post was using the Doolitle method) but I do not know what I am doing wrong. On paper, everything works but the code is not working, it throws incorrect values in the L and U matrix.

I show the code:

#include<iostream>
#include<math.h>

int main(){
int i=0,j=0,k=0,n=0;

std::cout << "\t\tDESCOMPOSICION LU";
std::cout << std::endl;
std::cout << std::endl;
std::cout << "NOTA: El orden de la matriz debe ser mayor o igual que 2 y entero." << std::endl;
std::cout << "Ingresa el orden de la matriz: ";
std::cin >> n;

//Comprobacion de ingreso de un valor correcto para el orden de la matriz
if(n<=1){
    std::cout << std::endl;
    std::cout << "No ha ingresado un valor correcto. Cerrando el programa...";
    std::cout << std::endl;
    return 0;
} else {
    float A[n][n]={0}, L[n][n]={0}, U[n][n]={0};
    std::cout << "La matriz es de " << n << "x" << n <<".";
    std::cout << std::endl << std::endl;

    //Obtencion de los elementos de la matriz A de coeficientes
    std::cout <<"Ingrese los coeficientes de la matriz A: ";
    std::cout << std::endl;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            std::cout << "Ingrese el elemento A["<<i+1<<"]["<<j+1<<"]: ";
            std::cin >> A[i][j];
        }
    }
    std::cout << std::endl;

    //Descomposicion LU

    //Copiar la matriz A en la matriz U para su triangulacion sin afectar la matriz original
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            U[i][j]=A[i][j];
           }
    }

    //Comprobacion de que la copia fue correcta
    /*for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            std::cout << U[i][j] << "    ";
           }
        std::cout << std::endl;
    }*/

    //Llenado de ceros y unos en posiciones conocidas de la matriz L
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            if(i==j){
                L[i][j]=1;    //Unos en la diagonal de L
            } else if(i>j){
                L[i][j]=0;     //Ceros encima de la diagonal para la matriz L
            }
        }
    }
    //Llenado del resto de L y eliminacion Gaussiana en la matriz U
    double a;       //Sirve para llenar la matriz L y para la triangulacion de U
    for(j=0;j<n;j++){
        for(i=1;i-1<n;i++){
            a=-(U[i][j])/(U[j][j]);
            std::cout << "a [" << i << "]= " << a;
            for(int k=j; k<n; k++){   //Sirve para que la transformacion elemental afecte a toda la fila actual
                U[i][k]+=a;
            }
            if(i>j){
                L[i][j]=a;
            }
            a=0;
        }
    }


    //Mostrar en pantalla la matriz L
    std::cout << std::endl << std::endl;
    std::cout << "Matriz L:";
    std::cout << std::endl;
    std::cout << "    ";
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            std::cout << L[i][j] <<"   ";
        }
        std::cout << "\n    ";
    }

    //Mostrar en pantalla la matriz U
    std::cout << std::endl << std::endl;
    std::cout << "Matriz U:";
    std::cout << std::endl;
    std::cout << "    ";

    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            std::cout << U[i][j] <<"   ";;
        }
        std::cout << "\n    ";
    }
}
return 0;
}

I explain what I try to do:

I copy the matrix A (given by the user) in the matrix U and then I step the latter obtaining in each iteration the values that I use for said elimination and filling the matrix L (classical method of decomposition or factoring LU).

I would really appreciate any recommendation.

Have an excellent week!

    
asked by Germán Diego Guisasola Plejo 30.03.2018 в 09:51
source

0 answers