Saturday, February 11, 2006

Eliminación Gaussiana

Es un método para resolver sistemas de ecuaciones que consta en hacer un triangulo de 0 debajo de la diagonal de la matriz. Esto se hace sumando, multiplicando, y moviendo las ecuaciones. Una vez se cumple se puede aplicar dos métodos para resolver la ecuación; Gauss-Jordan o Sustitución.

Los sistemas de ecuaciones se pueden representan de la siguiente forma:





Para facilitar el proceso de eliminación Gaussiana se re-escribe de la siguiente manera:





Si le aplicamos el proceso de eliminación Gaussiana al la matriz de arriba nos resultaría la siguiente matriz:








En el caso del algoritmo, no nos devuelve esta misma matriz, sino una equivalente. De este punto en adelante utiliza sustitución para resolver el sistema. El sistema también se puede hacer utilizando Gauss-Jordan, utilizando matrices inversas, y multiplicación de matrices.

Pero este método es el mas rápido, utilizando multiplicación (el segundo mas rapido) el tiempo tomado es aproximadamente n2.81….Este método tiene un tiempo promedio de n3/2,

Donde n es el tamaño de la matriz.


#include cstdlib

#include iostream

using namespace std;

int main(int argc, char *argv[])

{

//Declaracion de los enteros que voy a utilizar

int i,j,k,N,max;

//Este float se utiliza como una variable temporal para cambiar variables

float t;

//Pedir la entrada del tamaño de la matriz

cout<<"Que tan grande quieres la matriz?"<> N;

//se declara float porque las proximas sentencias aritmeticas pueden resultar en decimal

float Gauss[N][N+1];

//Esto pide N columnas de N + 1 numeros

cout<<"Porfavor entre la matriz:"<< k =" 0;k">> temp;

Gauss[j][k] = temp;

}

cout<<"Proxima Columna\n"; } /*los for anidados 2 y 3, son la rutina conocida como "Eliminate" esta rutina se asegura de subir el registro con el primer numero mas alto a la posicion 0 os For 1, 4 y 5 recore la matriz para crear ceros debajo de la diagonal de la matriz*/ /*1*/for(i = 0 ; i < max =" i;" j =" i+1;j"> abs((int)Gauss[max][i])){

max = j;

}

/*3*/for(k = i; k <=N;k++) { t = Gauss[i][k]; Gauss[i][k] = Gauss[max][k]; Gauss[max][k] =t; } /*4*/for(j = i+1;j <= N;j++) { /*5*/for(k = N; k >=i;k--)

{

Gauss[j][k] = Gauss[j][k] - Gauss[i][k] * Gauss[j][i] / Gauss[i][i];

}

}

}

}

/*Este Segmento de codigo es el proceso de sustitucion, funciona de abajo para arriba*/

int x[N];

for(int i = 0 ; i < j =" N">= 0;j--)

{

t = 0.0;

for(k = N-1 ; k >= 0 ; k--)

{

t= t + Gauss[j][k]*x[k]; //Crea una sumatoria de todas la varibales de la matriz multiplicado por las respuestas conocidas

}

x[j]= (Gauss[j][N] + t*-1)/Gauss[j][j]; //Se pasa al otro lado de la igualdad y se divide entre el numero correspondiente

}

/*Esto solo imprime la matriz y las N respuetas*/

for(i = 0; i < j =" 0;" cout=""><<<"Las respuestas X1,X2...Xn:"<<>


Preguntas Para responder:

  1. ¿Por qué se hace la matriz de [N][N+1]?
  2. ¿Cual utiliza más operaciones aritméticas, Gauss-Jordan o Sustitución?
  3. ¿Si cambiamos las columnas de la matriz, como afecta la respuesta?
  4. ¿Cómo podemos verificar por ecuaciones contradictorias o idénticas?
  5. ¿De que uso seria eliminación Gaussiana si tenemos una matriz de M ecuaciones y N desconocidos siendo N <>
  6. De un ejemplo de porque el proceso “Elimínate” , utilizando una computadora mítica, que sus números solo pueden ser de 2 dígitos significativos.
  7. ¿Cuanto tiempo tomaría Eliminación Gaussiana con una matriz N*N, cunado N vale 7?
  8. ¿Porque en el sistema de ecuación siguiente no funciona Eliminación Gaussiana?
    1. 5x+5y+5z = 5

3x+3y+3z = 3

x+y+z = 1

  1. ¿Por qué el cuarto y quinto ‘for’ están dentro del primero y el segundo pero no del tercero?
  2. ¿Porque la ecuación aritmética del quinto ‘for’ crea cero?

No comments: