Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 7 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 401
Ubicación: Venezuela

Nota Publicado: Jue Jul 08, 2010 4:41 am 
Arriba  
Aquí presento un código bastante conciso para resolver sistemas lineales (no se comprueba independencia lineal):

Código:
#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:
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:
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 

_________________
[Reglamento del foro] [Blog]

 Perfil  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Jue Abr 19, 2007 7:00 am
Mensajes: 1452
Ubicación: Cojutepeque, El Salvador C. A.

Nota Publicado: Jue Jul 08, 2010 7:22 am 
Arriba  
orale, con lo que cuesta resolverlas a mano cuando son muy grandes xD, gracias por compartir.

_________________
Grüße...
Maiku

Full linux alchemist!!!

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Vie Abr 27, 2007 7:00 am
Mensajes: 1905

Nota Publicado: Jue Jul 08, 2010 7:37 am 
Arriba  
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

 Perfil WWW  

Desconectado
Forista Nuevo
Forista Nuevo
Avatar de Usuario

Registrado: Jue Jul 08, 2010 7:15 am
Mensajes: 7
Ubicación: El Salvador

Nota Publicado: Jue Jul 08, 2010 7:48 am 
Arriba  
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

 Perfil WWW  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1455
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Jue Jul 08, 2010 12:56 pm 
Arriba  
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" -> (mmlf)
Última versión del gestor "Music Manager" -> (jmmm)

 Perfil  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Vie Abr 27, 2007 7:00 am
Mensajes: 1905

Nota Publicado: Jue Jul 08, 2010 3:08 pm 
Arriba  
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

 Perfil WWW  

Desconectado
Forista Medio
Forista Medio
Avatar de Usuario

Registrado: Jue Jun 17, 2010 5:23 am
Mensajes: 401
Ubicación: Venezuela

Nota Publicado: Vie Jul 09, 2010 7:00 pm 
Arriba  
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:
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]
167 veces

_________________
[Reglamento del foro] [Blog]
 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 7 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
Metodo para distribuir archivos?

en Redes y Servidores

sergiomcr

1

138

Mié Sep 07, 2016 6:36 am

helenio2112 Ver último mensaje

Metodo de tiempo para Pythong

en Programación

yehconraf

3

1451

Sab Jul 19, 2008 12:29 am

ExEKieLiTo Ver último mensaje

Distro para ARM 920 y metodo de instalacion?

en Instalación de distribuciones

leondark

2

835

Jue Sep 02, 2010 8:27 pm

mcun Ver último mensaje

Acceder a un metodo en una clase desde otra clase

en Programación

adrianeric

7

5543

Mié Feb 23, 2011 9:21 pm

mcun Ver último mensaje

sistemas informaticos

en Sistema

Bena

0

683

Dom May 25, 2008 5:29 am

Bena Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO