Resolucion de sistemas lineales: método de Gauss-Jordan

El siguiente código resuelve sistemas lineales utilizando el método de Gauss-Jordan (función gaussjordan):

#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.

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

2 respuestas a Resolucion de sistemas lineales: método de Gauss-Jordan

  1. Pingback: Estimación de datos acumulados (englobados) de precipitación |

  2. Pingback: Resolución de sistemas lineales: Clase Matriz |

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