Resolver sistema de ecuaciones, en C++

xCoNDoR

Necesito hacer una aplicación que me resuelva un sistema de ecuaciones por el sistema de Gauss, y sinceramente no se ni por donde cojerlo...

Alguno de vosotros ha hecho algo parecido o podria guiarme un poco al menos a ver si puedo meterle mano ?

/cry

Soltrac

Pues es una matriz.

Lo primero es, saber aplicar gauss? :S. Es que no se que dificultad tiene esto, tienes que tener conocimientos de matrices y saberte el algoritmo de Gauss, poco más.

tOWERR

Para resolver el metodo de gauss con una matriz bidimensional, el manejo de la matriz es sota,caballo y rey. El metodo de gauss no me acuerdo ahora mismo pero asi flashback que me vienen te va a resultar facil si tienes conceptos de las 2 cosas que tienes que utilizar.

xCoNDoR

planteandomelo un poco, podría usar un array bidimensional para jugar con esa matriz y hacer las operaciones necesarias por metodo de Gauss ?

NeB1

#1 crea una matriz de Nx( M + 1 ), donde N es el número de ecuaciones y M el número de incognitas, ok?
Asi te aseguras la representación de las variables de la siguiente forma:

2x + y = 1

x - y = -0.75

-->

{
2, 1, 1
1, -1, 0.75
}

eso se llamaba la matriz aumentada (o algo así xD), la ultima columna son las soluciones (de ahí que el tamaño de la matriz sea N x (M+1), el +1 es la columna de las soluciones).

Ahora viene el salseo, hay que buscar esta matriz:

{
1, 0, Solucion1
0, 1, Solucion2
}

es decir, dejar una matriz donde la diagonal, sin contar la parte de las soluciones es todo unos, y el resto son ceros, para lograr esto, hay que sumar o restar, a una fila, X veces la otra fila, cuando llegas a esta matriz, entonces tienes que

x = Solucion1,

y = Solucion2.

Un poco lioso te lo he explicado, no?

Edit:

La matriz anterior, escrita en C++ sería así:

Matriz[0][0] = 2;
Matriz[0][1] = 1;
Matriz[0][2] = 1;
Matriz[1][0] = 1;
Matriz[1][1] = -1;
Matriz[1][2] = -0.75;

Puedes fácilmente con un bucle restar elementos de una fila a la otra

for(i = 0; i < 3; i++)
{
    Matriz[1][i] = ElNumeroDeVeces (menos o más) Matriz[0][i];
}
xCoNDoR

#5 te agradezco la explicación, en cuanto pueda la pongo en practica y os comento.

NeB1

#6 como no me acaba de convencer la explicación, pa que veas, a la matriz de antes:

{
2, 1, 1
1, -1, 0.75
}

Eliminamos la primera columna (lo que vendría a ser la X) de la segunda fila, restandole 1/2 veces la primera fila:

(1, -1, 0.75) - 1/2(2,1,1) = (0,-1.5, -0.25)

con lo que se queda:

{
2, 1, 1
0,-1.5,-0.25
}

Y ahora, para eliminar de la primera fila, la segunda columna (la Y), pues sumamos a la primera fila 2/3 veces la segunda fila a la primera:

(2, 1, 1) + 2/3(0,-1.5,-0.25) = (2, 0, -0.83)

con lo que se nos queda:

{
2, 0 , -0.83
0,-1.5,-0.25
}

y ya tienes que 2x = -0.83 y que -1.5y = -0.25

xCoNDoR

Una pregunta mas que de programación, de matematicas (gauss),
para eliminar columnas funciona el metodo de dividir por 1/2 y despues para el siguiente 2/3 siempre ? o segun el sistema de ecuaciones puede variar ?

Lo digo porque el sistemas de ecuaciones se introduce desde el programa y cada vez se introducirá uno diferente.

#7 Te agradezco la ayuda

NeB1

es diferente para cada matriz xD

si quieres eliminar la primera columna de la segunda fila:

{
2, 1, 1
1, -1, 0.75
}

necesitas que de alguna forma, restandole X Veces el 2 al 1, te dé 0. ¿Que número cumple eso? pues 2 * 1/2 = 1 que al restar a 1, dá 0. tienes que calcular eso pero mediante programación.

Yo lo haría de la siguiente forma, dada una matriz de Nx(M+1), recorrería la matriz por columnas primero, pero sin tocar la columna de las soluciones. Si estás en la primera columna, entonces eliminaría esa columna de todas las columnas menos de la primera, si estás en la segunda columna, buscaría eliminar esa columna de todas las filas, menos de la segunda... de forma que quedaría
(numero, 0, 0, 0...)
(0, numero, 0, 0, 0...)
(0, 0, numero, 0, 0...)
(0, 0, 0, numero, 0, ...)

//Recorres la matriz por columnas, sin contar la de soluciones
for(j = 0; j < M; j++)
{
   for(i = 0; i < N; i++)
   {
       //Si la columna y la fila no son las mismas, 
       //entonces buscamos igualar el contenido a 0
       if ( j != i )
       {
           //Buscamos el número que me da 0 en esta columna operando
           //con la fila que no entra dentro de este if
           Matriz[i][j] * X * Matriz[j][j];
       }
   }
}

te falta calcular la X, fijate en lo de Matriz[j][j] que es importante.

eXtreM3

Si te urge mucho...

http://www.mygnet.net/codigos/cplusplus/analisisnumericos/gauss_jordan.1201

xCoNDoR

estoy pillado en como calcular el valor por el cual multiplicar l ecuación para que al sumarse a la otra poder eliminar uno de los valores...

alguna idea ? puf

EDIT:

En un sistema de 2 ecuaciones lo que hago es multiplicar la x de la primera por toda la segunda y la -x de la segunda por toda la primera, por lo que siempre se reducen a 0 las x.

En una de tres ecuaciones también podría hacerlo asi ?

NeB1

sí, pero en un caso tienes que eliminar la X y en otro la Y, eh?

xCoNDoR

si, en un sistema de dos ecuaciones con eliminar la x, queda Y y por lo tanto puedo ya resolverlo entero, ahora es cuando voy a hacerla de 3, donde también tengo que resolver y, supongo que me valdrá con el mismo metodo que he comentado antes no?

Despues de eliminar x con el metodo anterior, hago lo mismo con y, multiplicando cada una por el valor de Y de la otra para que la suma quede 0.

Mañana me pongo con ello..

LOc0
spoiler

Salu2 ;)

xCoNDoR

Bueno ya lo conseguí.. al final el profesor me dijo que lo hiciese en 'C' en vez de 'C++' pero bueno..

Muchas gracias a todos, cuando esté en clases pegare el codigo

Usuarios habituales

  • xCoNDoR
  • LOc0
  • NeB1
  • eXtreM3
  • tOWERR
  • Soltrac