En este enlace:
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.
Funciona de maravilla, mil y mil gracias.
Gracias por tu comentario.
Saludos
No me va tio :S
es decir me va pero no me deja visualizarlo y pongo el código ese de:
cout << “Pulse cualquier tecla para continuar…\n”;
cin.get();
y no me compila
Entonces el cin.get(); cámbialo por:
system (“pause”);
Debería compilar.
Genius
gran aporte me ayudo a entender muy bien el algoritmo de gauss…. THX!!!!
Gracias a ti por tu comentario.
Saludos
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
Cuando dices que la inversa “no sale” probablemente es que el determinante es muy pequeño (casi cero). Eso significa que la matriz no está muy bien condicionada. Es ese el caso?
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
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
Quisiera saber si alguien puede ayudarme necesito un programa que me de la determinante de la matriz y ootro la inversa de la matriz
Aquí en el Blog está. Te agradezco que lo busques en la Categoría Código C++.
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!
En la carpeta datos, archivo datos.in:
Estás trabajando en Linux?
Hola jose, no estaba trabajndo con linux. En realidad nuna supe que era lo q pasaba, pero mil gracias, ya no lo necesito 🙂
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
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
ok gracias
Muchisimas, gracias me ha servido un buen en una tarea de splines cúbicos en opengl
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.
Hola José, lo probé bajo GNU/linux y anduvo excelente, gracias. Saludos
hola!! buen aporte… pero no me funciona compila pero abre la pantalla para visualizar todo y ya le puse el system(“pause”);