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