Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Mensaje por cerenkov » Jue Jul 08, 2010 4:41 am

Aquí presento un código bastante conciso para resolver sistemas lineales (no se comprueba independencia lineal):

Código: Seleccionar todo

#include <iostream>

#include <fstream>
#include <iomanip>

using namespace std;

void gaussjordan (int n, double **A);

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;

 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];

  }

 }

// Aplicación del método de Gauss-Jordan 

 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;

 return 0;

}

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]; 
      
   }

  }

 }

 }

}
Grábenlo como gaussjordan.c++ y coloquénlo en una carpeta llamada GAUSSJORDAN. En GAUSSJORDAN, creen un directorio llamado datos y otro llamado salida. En datos, copien el siguiente datos.dat:

Código: Seleccionar todo

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 
Compilen con:

g++ gaussjordan.c++ -o gaussjordan

y ejecuten con:

./gaussjordan

El resultado será:

Código: Seleccionar todo

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  
Avatar de Usuario
maiku
Moderador
Moderador
Mensajes: 1521
Registrado: Jue Abr 19, 2007 7:00 am
Ubicación: Cojutepeque, El Salvador C. A.
Contactar:

Re: Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Mensaje por maiku » Jue Jul 08, 2010 7:22 am

orale, con lo que cuesta resolverlas a mano cuando son muy grandes xD, gracias por compartir.
Grüße...
Maiku

Full linux alchemist!!!
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Mensaje por hipersayan_x » Jue Jul 08, 2010 7:37 am

Lo que mas me gusta es que tu mismo planteas el algoritmo en lugar de usar una librería externa, y eso significa que realmente entiendes lo que estas haciendo :)
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
VTacius
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Jue Jul 08, 2010 7:15 am
Ubicación: El Salvador
Contactar:

Gracias...

Mensaje por VTacius » Jue Jul 08, 2010 7:48 am

Lo probaré mañana: me gusta porque como era de esperarse, dejaste fuera a la librería conio.
Me gustaría haber sabido hace un mes que era totalmente posible
Me toca hacer poesía con el código, arte plástico con cada configuración
Avatar de Usuario
akodo
Moderador
Moderador
Mensajes: 1457
Registrado: Mié Nov 28, 2007 8:00 am
Ubicación: En la X del explorer (pulse para llamar)

Re: Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Mensaje por akodo » Jue Jul 08, 2010 12:56 pm

hmmm... me falta el toque ingenieril...
¿Por qué no utilizar un tipo de datos "matriz"? Utilizar un doble puntero puede dar errores si los datos no son correctos (puede haber una fila con datos de más o menos).
Así lo podrías juntar con los otros programas que has hecho para trabajar con matrices: creas una clase matriz, la lees de donde sea, la procesas (para este caso compruebas independencia lineal con el determinante de la matriz, además de realizar la operación), devuelves el resultado, y lo imprimes convenientemente.
Además puedes añadir funciones como "readFrom" o "writeTo" (además de los cálculos oportunos) para trabajar con matrices.

En cuanto al programa en sí, obligar a leer y escribir los datos de un sitio concreto no me convence. Vale que puedas leer y escribir en un sitio por defecto, pero es recomendable dejar libertad de elección al usuario.

A ver si el próximo código lo veo mejor :)

PD: No digo que el código esté mal ni que no funcione. Tan sólo planteo mejoras.
Descargue el gestor de mp3 "Music Manager" -> ([url=http://ctrlalt.iespana.es]mmlf[/url])
Última versión del gestor "Music Manager" -> ([url=http://sourceforge.net/projects/jmusicmanager/]jmmm[/url])
Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Gracias...

Mensaje por hipersayan_x » Jue Jul 08, 2010 3:08 pm

VTacius escribió:Lo probaré mañana: me gusta porque como era de esperarse, dejaste fuera a la librería conio.
Me gustaría haber sabido hace un mes que era totalmente posible
Hay que tener cuidado con la librería conio porque no es una librería standard y por lo tanto no es portable, hasta donde yo se conio solo esta disponible para los compiladores de Borland que además son privativos.
cerenkov solo uso las librerías standard de C++, y eso le da un plus porque el programa funciona con cualquier compilador y sistema operativo, sin cambiar nada.
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Resolución de Sistemas Lineales por el método de Gauss-Jordan (C++)

Mensaje por cerenkov » Vie Jul 09, 2010 7:00 pm

akodo escribió:hmmm... me falta el toque ingenieril...
¿Por qué no utilizar un tipo de datos "matriz"? Utilizar un doble puntero puede dar errores si los datos no son correctos (puede haber una fila con datos de más o menos).
Así lo podrías juntar con los otros programas que has hecho para trabajar con matrices: creas una clase matriz, la lees de donde sea, la procesas (para este caso compruebas independencia lineal con el determinante de la matriz, además de realizar la operación), devuelves el resultado, y lo imprimes convenientemente.
Además puedes añadir funciones como "readFrom" o "writeTo" (además de los cálculos oportunos) para trabajar con matrices.

En cuanto al programa en sí, obligar a leer y escribir los datos de un sitio concreto no me convence. Vale que puedas leer y escribir en un sitio por defecto, pero es recomendable dejar libertad de elección al usuario.

A ver si el próximo código lo veo mejor :)

PD: No digo que el código esté mal ni que no funcione. Tan sólo planteo mejoras.
Este código funciona muy bien. La teoría de ejecución está basada en el libro de Chapra y Canale "Metodos numéricos para Ingenieros" pero la implementación es mia porque allí, en el mejor de los casos, sólo hay pseudo código. Si mal no recuerdo, fue uno de mis primeros programas para entrenarme en C++. Tuve que hacerlo de manera autodidacta y desde cero (sólo programaba en BASIC) porque el que contratamos sólo quería trabajar con ACCESS :D. Con relación a los de los punteros dobles esa es la manera como lo implementaba un físico del cual adapté esa forma de programar en C++. Todavía no me ha dado errores.

Con respecto a lo de leer desde un sitio en concreto yo lo implemente de esa manera pero se puede hacer de forma diferente. Esta es una propuesta que puede ser cambiada a gusto del usuario. No me gusta ingresar los datos por pantalla; sobre todo si tienes la matriz "escrita" en tu memoria.

Con relación a la clase Matriz yo la implemente en un foro y la BORRARON en el mantenimiento (no sólo lo mio sino todos los posts: más nunca escribí nada allí). La intención es implementarla también aquí pero, por problemas personales, he estado alejado como 2 años de esto y tengo que volver a familiarizarme. Con esa clase Matriz recuerdo que tenía definidas varias funciones amigas y sobrecarga de operadores y en los programas principales, muy cortos por cierto, sólo bastaba definir los objetos y operar con ellos de una manera tan natural como cuando se hace con los tipos int o double.

Saludos

Editado -- Jue Jul 08, 2010 9:08 am --
hipersayan_x escribió:Lo que mas me gusta es que tu mismo planteas el algoritmo en lugar de usar una librería externa, y eso significa que realmente entiendes lo que estas haciendo :)
Tenía que hacerlo. Con este entrenamiento me tomó luego 1 mes para desarrollar un modelo de generación de datos sintéticos de temperaturas máximas, temperaturas mínimas y radiación solar empleando métodos multivariados.

Saludos

Editado -- Jue Jul 08, 2010 9:16 am --
hipersayan_x escribió:
VTacius escribió:Lo probaré mañana: me gusta porque como era de esperarse, dejaste fuera a la librería conio.
Me gustaría haber sabido hace un mes que era totalmente posible
Hay que tener cuidado con la librería conio porque no es una librería standard y por lo tanto no es portable, hasta donde yo se conio solo esta disponible para los compiladores de Borland que además son privativos.
cerenkov solo uso las librerías standard de C++, y eso le da un plus porque el programa funciona con cualquier compilador y sistema operativo, sin cambiar nada.
Efectivamente. Sólo uso librerías estándares. Los códigos que hasta ahora he propuesto funcionan también en Windows posiblemente agregando antes del return sólo la instrucción:

Código: Seleccionar todo

cin.get()
Este es un "truco" que tomé del foro de el Hacker.net porque antes usaba system ("pause") pero allí recomiendan no usarlo en un tema que se intitula algo así como "Las 10 cosas que no se deberían hacer en C++" y, si mal no recuerdo, otra de ellas es NO usar librerías no estándares.

Saludos

Editado -- Vie Jul 09, 2010 12:30 pm --

Adjunto una versión que si verifica independencia lineal. Para una clase Matriz habría que arreglar algunos detalles: me di cuenta una vez que estaba hecha esta versión pero aún así funciona tal como está.

Saludos
Adjuntos
GAUSSJORDAN2.zip
(6.51 KiB) Descargado 207 veces
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje