miércoles, 5 de diciembre de 2012

MÉTODO DE GAUSS - JORDAN

En este método se trata de eliminar poco apoco para que podamos encontrar los valores de las variables. Es importante mencionar que debemos colocar la   matriz aumentada. Esta se obtiene  realizando la diagonal dominante la cual se debe de acomodar las filas de manera que los valores de mayor valor diagonalmente.

El siguiente programa realiza este método y explica  lo que va haciendo:


#include<iostream.h>
#include <conio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define N 10
#include <stdio.h>
class jordan
   {
      private:
              float m[N][N+1], m1[N][N+1], X[N];

     public:
  
            void obtenerm(int n), imprimirm(int matriz,int n);
            void mfila(float factor,int fila, int n);
            void sumarfilas(float factor,int fila1, int fila2, int n);
            float sumarX(int n,int fila);
            void obtenerinc(int n);
            void gauss(int n);
            float evaluar(int n);
            void mmain();
 
   };




 void jordan::obtenerm( int n)
{
   int i,j;

cout<<"\nINGRESA LOS COEFICIENTES DE LA MATRIZ AUMENTADA: "<<endl;
   for(i=0;i<n;i++)
   {
    for(j=0;j<n;j++)
      {
      printf("\na[%d,%d]= ",i+1,j+1);
      cin>>m[i][j];
      }
      printf("\nb%d= ",i+1);
      cin>>m[i][j];
   }
}

void jordan::imprimirm(int matriz, int n)
{
   int i,j;
   for(i=0;i<n;i++)
   {
    for(j=0;j<n;j++)
      {
         if(matriz==0)
      printf("%5.2f  ",m[i][j]);
         else
         printf("%5.2f  ",m1[i][j]);
      }
      if(matriz==0)
      printf("|  %5.2f \n",m[i][j]);
      else
printf("|  %5.2f \n",m1[i][j]);
   }
   getch();
}

void jordan::mfila(float factor,int fila, int n)
{
   int i;
for(i=0;i<=n;i++)
    m1[fila][i]=m1[fila][i]*factor;
   printf("\nSe multiplico la fila %d por el factor %4.1f, para obtener un 1 en la diagonal principal\n",fila+1,factor);
   imprimirm(1,n);
}

void jordan::sumarfilas(float factor,int fila1, int fila2, int n)
{
   int i;
for(i=0;i<=n;i++)
    m1[fila2][i]=m1[fila1][i]*factor+m1[fila2][i];
   printf("\nSe multiplico la  fila %d por el factor %5.2f",fila1+1,factor);
   printf("\nSe sumo la fila multiplicada (%d) a la fila %d\n",fila1+1,fila2+1);
   imprimirm(1,n);
}

float jordan::sumarX(int n,int fila)
{
   float suma=0;
   int i;
for(i=0;i<n;i++)
    suma=suma+(X[i]*m1[fila][i]);
   return suma;
}

void jordan::obtenerinc(int n)
{
   int i;
   for(i=0;i<n;i++)
    X[i]=0;
   X[n-1]=m1[n-1][n];
for(i=n-2;i>=0;i--)
   {
    X[i]=m1[i][n]-sumarX(n,i);
   }
}

void jordan::gauss(int n)
{
int i,j,k;
   float a=0,suma=0;



   for(i=0;i<n;i++)
   for(j=0;j<=n;j++)
   m1[i][j]=m[i][j];
   for(i=0;i<n;i++)
   {
      if(m1[i][i]==0)
      {
         exit(0);
      }
    a=1/m1[i][i];
mfila(a,i,n);
      j=i;
      for(k=i+1;k<n;k++)
      {
      a=-m1[k][j];
         sumarfilas(a,i,k,n);
      }
      if(i>0)
      for(k=i-1;k>=0;k--)
      {
      a=-m1[k][j];
         sumarfilas(a,i,k,n);
      }

   }

   printf("\nLa matriz despues de aplicar el metodo es: \n");
   imprimirm(1,n);
   obtenerinc(n);
   printf("\n\nLos valores de las incognitas son: ");
   for(i=0;i<n;i++)
    printf("\nx%d = %5.2f",i+1,X[i]);
   int z;
   printf("\n\n\nEn que ecuacion desea comprobar (1,2,3): \n\n");
   printf("Opcion:      "); cin>>z;

   if(z==1)
   {
   printf("\n\nEvaluando valores en la primera ecuacion: \n\n");;
   for(i=0;i<n;i++)
   {
      if(m[0][i]>=0)
      printf("+%5.2f(%5.2f)",m[0][i],X[i]);
      else if(m[0][i]<0)
      printf("%5.2f(%5.2f)",m[0][i],X[i]);
suma=suma+(m[0][i]*X[i]);
   }
   printf("=%5.2f",suma);
    }
   else if(z==2)
   {
   printf("\nEvaluando valores en la segunda ecuacion: \n\n");;
   for(i=0;i<n;i++)
   {
      if(m[1][i]>=0)
      printf("+%5.2f(%5.2f)",m[1][i],X[i]);
      else if(m[1][i]<0)
      printf("%5.2f(%5.2f)",m[1][i],X[i]);
suma=suma+(m[1][i]*X[i]);
   }
   printf("=%5.2f",suma);
    }
    else if(z==3)
   {
   printf("\nEvaluando valores en la tercera ecuacion: \n\n");;
   for(i=0;i<n;i++)
   {
      if(m[2][i]>=0)
      printf("+%5.2f(%5.2f)",m[2][i],X[i]);
      else if(m[2][i]<0)
      printf("%5.2f(%5.2f)",m[2][i],X[i]);
suma=suma+(m[2][i]*X[i]);
   }
   printf("=%5.2f",suma);
}
}

void jordan::mmain()
{

cout<<"                              METODO DE GAUS JORDAN"<<endl;

   int n;
 cout<<"\nINGRESA EL TAMAÑO QUE TENDRA LA MATRIZ (nxn): ";
   cin>>n;

   obtenerm(n);
   cout<<"\nLa matriz aumentada es: "<<endl;
   imprimirm(0,n);

   //cout<<"\nSe usara el metodo de Gauss - Jordan para obtener las incognitas."<<endl;
   gauss(n);

}

int main()
{

clrscr();
jordan obj;
obj.mmain();
getch();
}

Imagenes:











No hay comentarios:

Publicar un comentario