#include <iostream> #include <fstream> #include <iomanip> using namespace std; void gaussjordan (int n, double **A); void determ(int n, double **a, double &det); int main(){ ifstream label1 ("datos//datos.dat"); ofstream label2 ("salida//salida.dat"); int i, j, k; cout << "Resolucion de sistemas lineales por el metodo de Gauss-Jordan\n\n"; label2 << "Resolucion de sistemas lineales por el metodo de Gauss-Jordan\n\n"; int n; label1 >> n; cout << "Numero de incognitas = " << n; cout << "\n\n"; double **A, det = 0; A = new double *[n+1]; for (j=0; j < n+1; j++) A[j] = new double [n+1]; cout.setf(ios::fixed); cout.precision(4); label2.setf(ios::fixed); label2.precision(4); // Introducción de datos a partir del archivo correspondiente for (i = 0; i < n; i++) { for (j = 0; j < n + 1; j++) { label1 >> A[i][j]; } } // Calculo del determinante determ(n, A, det); // Aplicación del método de Gauss-Jordan if (det !=0){ gaussjordan (n, A); // Impresión de valores de las incógnitas for (i = 0; i < n; i++) { cout << "X[" << i+1 << "] = " << setw(10) << setiosflags(ios::right) << A[i][n] << " "; label2 << "X[" << i+1 << "] = " << setw(10) << setiosflags(ios::right) << A[i][n] << " "; cout << endl; label2 << endl; } cout << endl;} else cout << "La matriz del sistema es singular. No existe solución.\n\n"; return 0; } void determ(int n, double **a, double &det) { int i, j, k; double **B; B = new double *[n+1]; for (j=0; j < n+1; j++) B[j] = new double [n]; for (i = 0; i < n; i++) { for (j = 0; j < n + 1; j++) { B[i][j] = a[i][j]; } } // Algoritmo para la eliminación simple de Gauss double factor; for (k = 0; k < n - 1; k++) { for (i = k+1; i < n; i++) { factor = B[i][k]/B[k][k]; for (j = k+1; j < n + 1; j++) { B[i][j] = B[i][j] - factor * B[k][j]; } } } // Cálculo del determinante det = 1.; for (i = 0; i < n; i++) { det = det * B[i][i]; } } void gaussjordan (int n, double **A) { // Aplicación del método de Gauss-Jordan int i, j, k; // Normalización de la fila pivote double factor; for (k = 0; k < n; k++) { factor = A[k][k]; for (j = k; j < n + 1; j++) { A[k][j] = A[k][j]/factor; } // Eliminación de variables por fila for (i = 0; i < n + 1; i++) { if (i != k) { factor = A[i][k]; for (j = 0; j < n + 1; j++) { A[i][j] = A[i][j] - factor * A[k][j]; } } } } }
Se emplea para resolver el siguiente sistema linealmente independiente (el programa verifica dependencia lineal):
4x + 2y + 3z – v + w = 16
x + y + z + v + w = 3
x – y + z – v + w = 1
x + y + 2z + v + w = 6
x + y – z + v + 2w = -5
El número de incógnitas y la matriz extendida del sistema los introduce desde datos/datos.dat y los resultados los imprime, con formato, en pantalla y en el archivo salida/salida.dat.
Después crear las carpetas datos y salida y colocar en la primera el siguiente archivo datos.dat:
5 4 2 3 -1 1 16 1 1 1 1 1 3 1 -1 1 -1 1 1 1 1 2 1 1 6 1 1 -1 1 2 -5
grabamos el código anterior como gaussjordan.c++ y lo compilamos con:
g++ gaussjordan.c++ -o gaussjordan
Su ejecución (./gaussjordan [Enter]) produce está salida en pantalla:
Resolucion de sistemas lineales por el metodo de Gauss-Jordan Numero de incognitas = 5 X[1] = 1.0000 X[2] = 2.0000 X[3] = 3.0000 X[4] = -1.0000 X[5] = -2.0000
y una similar en datos/datos.dat. Los valores de las incógnitas son 1, 2, 3, -1, -2 para x, y, z, v, w; respectivamente.
Pingback: Estimación de datos acumulados (englobados) de precipitación |
Pingback: Resolución de sistemas lineales: Clase Matriz |
Su algoritmo solo retorna “numero de incognitas = 0” pero cuando yo escribo “int n=3;” en la linea 23, no se solicita entrada de datos y imprime “X[1] = nan X[2] = nan X[3] = nan”. ¿Que pasa?
Tienes que crear dos carpetas (“pastas” en portugués): una llamada datos y otra llamada salida. En datos colocas el datos.dat y después de compilar (asumo que usas Linux) ejecutas con ./gaussjordan [Enter]. El resultado es el de arriba (lo acabo de probar). El programa está hecho para que al ejecutarlo con diferentes sistemas lineales sólo tengas que modificar el datos.dat; no el código como tu has hecho.