Inversa de una matriz NxN con C++

En este enlace:

INVERSA.zip

se propone código C++ para calcular la inversa de una matriz NxN. El cálculo del determinante se usa para decidir si se ejecuta o no dicho código porque si el determinante es cero la matriz  no es invertible.

En Linux, desempaqueten, muevánse al directorio INVERSA, compilen y ejecuten (también pueden usar geany) con:

g++ inversa.c++ -o inversa
./inversa

El resultado será:

Imprime la matriz de origen

1 2 3 4
2 1 5 6
3 5 1 7
4 6 7 1

Imprime la matriz inversa

-1.205426   0.507752   0.236434   0.120155
 0.507752  -0.368217   0.019380   0.042636
 0.236434   0.019380  -0.158915   0.050388
 0.120155   0.042636   0.050388  -0.089147

Ahora, modifiquen la última fila del archivo datos.in

por esta:

3 5 1 7

para tener un sistema linealmente dependiente. El resultado será:

Imprime la matriz de origen

1 2 3 4
2 1 5 6
3 5 1 7
3 5 1 7

La matriz no tiene inversa

Este código es portable; tanto en Linux como en Windows. Para que pueda visualizarse el resultado en Windows es necesario colocar antes de:

return 0;

las instrucciones siguientes:

cout << “Pulse cualquier tecla para continuar…\n”;
cin.get();

Con el Dev-C++ (para Windows), simplemente abran el archivo inversa.c++ y modifíquenlo tal como se señala anteriormente. Este se compila y ejecuta en el Dev-C++ con F9.

Esta entrada fue publicada en Código C++. Guarda el enlace permanente.

26 respuestas a Inversa de una matriz NxN con C++

  1. Jhon Ochoa dijo:

    Funciona de maravilla, mil y mil gracias.

  2. Entonces el cin.get(); cámbialo por:

    system (“pause”);

    Debería compilar.

  3. Sara dijo:

    estoy teniendo problemas con el programa, ya que en ocasiones se utiliza por ejemplo L[n], pero si el tamaño de la matriz es n, lo indices solo pueden ir de 0 a n-1. He sustituido todas las n, por n-1 y mas o menos funciona, de hecho el determinante lo calcula bien, pero a la hora de hacer la inversa, no sale. Agradeceria muchisimo tu contestacion

  4. Sara dijo:

    si, pero aun asi, si pongo que X[n-2] = a[n-2][n-1]/a[n-2][n-2] en vez de X[n-1] = a[n-1][n]/a[n-1][n-1] que es lo que viene en el codigo, para solucionar lo del indice que he comentado antes, entonces el determinante, en este caso de 5×5 lo genera bien, pero deja la ultima columna y la ultima fila a 0, es decir, me faltan esos valores

    • No sé si entiendo lo que quieres hacer pero si estás modificando mi código para que los índices comiencen desde 1 y no desde cero entonces es a tu riesgo los resultados que obtengas. Yo lo programé en C++ y si lo quieres para cualquier otro lenguaje tendrás que buscarte un libro de análisis numérico; tal como hice yo. El determinante te da bien porque la complejidad de la programación es baja. Pero la inversa requiere un mayor esfuerzo de programación pero si tienes mi código como referencia no te será difícil encontrar por tu cuenta el resultado correcto. Plánteate una matriz más pequeña (3×3, por ejemplo) y ejecútala manualmente en pseudo código y verás que encuentras como tienen que variar los índices.

      Saludos

  5. Sara dijo:

    Al contrario, al restarles 1 los indices van de 0 a n-1. Solo he cambiado las matrices de punteros por vectores de n elementos. Si compilo el codigo tal cual (sin restar 1 a las n’s) me da error al intentar aceder al elemento n. Se que es dificil de explicar… Te agradezco enormemente tu ayuda, y por supuesto tu codigo

  6. geremy dijo:

    Quisiera saber si alguien puede ayudarme necesito un programa que me de la determinante de la matriz y ootro la inversa de la matriz

  7. Sandra dijo:

    Hola!! De verdad necesito con urgencia este codigo, el problema es que lo ejecuto, imprime la matriz de origen, y cuando va a imprimir la inversa, deja de funcionar :S. Adicionalmente queria saber si me puedes decir donde ingreso la matriz a la cual le quiero calcular la inversa.

    Gracias!

  8. El programa compila en Windows pero para que puedan ver los resultados hay que añadirles las instrucciones que señalo al final de este artículo.

    Saludos

    • adriana dijo:

      Hola!! tengo el mismo problema pero yo si lo necesito con urgencia este codigo, el problema es que lo ejecuto, imprime la matriz de origen, y cuando va a imprimir la inversa, deja de funcionar ya le modifique segun las instruciiones pero ahi deja de funcionar lo estoy ejecutando en devC++

      • El programa funciona bien en Linux (ya lo probé) pero no me compila en Windows. Tiene algún tipo de error y ahora no tengo tiempo para el debugging. Puede ser alguna violación de segmento para el cálculo de la inversa que por alguna razón las “pasa” en Linux pero no en Windows. He detectado este tipo de errores programando mi código C++ en Python y encontrado las inconsistencias. Ya me habían señalado este hecho de una manera ofensiva y por eso no aparecen los comentarios. En tu caso es diferente pero no tengo tiempo para ayudarte porque ahora me dedico a la programación SIG. Te recomiendo que analices el código, lo vayas introduciendo progresivamente en un programa y verifica donde se detiene la ejecución.

        Saludos

  9. adriana dijo:

    ok gracias

  10. juanjo23 dijo:

    Muchisimas, gracias me ha servido un buen en una tarea de splines cúbicos en opengl

  11. prol dijo:

    the error is in L matrix.. you are calling L[i][n] and havee to call L[i][n-1]

    thx for the code

    • Con C++ en Linux ese código no sé por que razón no da violación de segmento y produce resultados correctos (por lo menos para matrices pequeñas bien condicionadas).En Python ese código seguro que daría error. Después lo corrijo.

  12. Jorge dijo:

    Hola José, lo probé bajo GNU/linux y anduvo excelente, gracias. Saludos

  13. Byron Orozco dijo:

    hola!! buen aporte… pero no me funciona compila pero abre la pantalla para visualizar todo y ya le puse el system(“pause”);

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s