Beispiel #1
0
int main(void) {
    
    int n = 0, result;
    double tol = 0.f;
    double **A, **B, **C = NULL;
    double **copiaA = NULL;
    /* Leer dimensiones */
    printf("\nDimensiones matriz: ");
    scanf("%d", &n);
    
    /* Leer tolerancia */
    printf("\nTolerancia: ");
    scanf("%lf", &tol);
    
    /* Leer matriz */
    printf("\nMatriz ecuaciones (A):");
    A = leer_matriz(n, n);
    B = gen_matriz(n,n);
    C = gen_matriz(n,n);
    copiaA = gen_matriz(n,n);
    copiar_en_matriz(n,A,copiaA);
    
    /* Calcular matriz inversa */
    result = inversaA(n,A,B,tol);
    if(result==KO){
        printf("\nNo tiene matriz inversa");
    } else {
        printf("\nSolucion: Matriz inversa:");
        mostrar_matriz(n,n,B);
    }
    
    
    /* Comprobar que el producto nos da la identidad
    C = A·B */
    prodMatMat(n,copiaA,B,C);
    
    printf("\nComprobar solucion\n(deberia salir una matriz identidad)");
    mostrar_matriz(n,n,C);
    
    return 0;
}
Beispiel #2
0
void multiplicacion_matriz(int **a, int **b, int **c, int fila1, int fila2, int columna2)

{
    int i, j, k;
    for(i=0; i<fila1; i++)
    {
        for(j=0; j<columna2; j++)
        {
            for(k=0; k<fila2; k++)
            {
                *(*(c+i)+j) = *(*(c+i)+j) + *(*(a+i)+k) * *(*(b+k)+j);
            }
        }
    }
    mostrar_matriz(fila1, columna2,c);
}
Beispiel #3
0
int inversaA(int n, double **A, double **B, double tol){
    
    int i,j,k;
    double c,d;
    double det;
    
    mostrar_matriz(n,n,A);
    det = determinante_matriz(A,n);
    
    if(det==0){
        /* Si det = 0, no tiene inversa */
        return KO;
    }
    
    /* Crear matriz identidad */
    for (i=0 ; i<n ; i++) {
        for(j=0;j<n;j++){
            if(i==j){
                /* Rellenar diagonal con 1's */
                B[i][j] = 1;
            } else {
                /* El resto 0's */
                B[i][j] = 0;
            }
        }
    }
    
    /* Pivoteando */
    for(i=n-1;i>0;i--) {
        if( A[i-1][0] < A[i][0] ) {
            /* Si es menor hay que cambiar fila */
            for(j=0;j<n;j++) {
                /* pivotar A */
                c = A[i][j];
                A[i][j]=A[i-1][j];
                A[i-1][j]=c; 
                /* pivotar B */
                d = B[i][j];
                B[i][j]=B[i-1][j];
                B[i-1][j]=d;
            }
            
        }
    }
    
    for(i=0;i<n;i++) {
        
        for(j=0;j<n;j++) {
        
            if(j!=i) {
                
                if(fabs(A[j][i])<tol){
                    A[j][i] = 0;
                }
                
                d = A[j][i]/A[i][i];
                
                for(k=0;k<n;k++){
                    /* Operar sobre A */
                    A[j][k] -= A[i][k] * d;
                    /* Operar sobre B */
                    B[j][k] -= B[i][k] * d;
                    
                }
                
            }
        }
        
    }
    
    for(i = 0; i<n; i++) {
        d = A[i][i];
        for(j = 0;j<n;j++) {
            /* divison sobre ambas */
            A[i][j] = A[i][j]/d;
            B[i][j] = B[i][j]/d;
        }
    }
    
    
    return OK;
}