-> Tiene su menú interactivo, es mas de lo que muestra la imagen.
-> Mantiene una precisión comprobada de 9 decimas.
-> Presenta 2 métodos para resolver el sistema planteado.
-> La ecuaciones para los métodos están dentro de sus mismas funciones, separadas entre comentarios: ///ECUACION...//ECUACION
-> Dado que el programa puede ciclarse se recomienda mejorarlo, debido a que tiene un limite en cuanto al grado de la matriz a trabajar. El programa es reducible.
-> Hay una variante dentro del código para trabajar o escalonar determinantes. Dicha variante se encuentra dentro del codigo para Resolver Ecuaciones Diferenciales que permite trabajar un determinante n*n.
-> El programa también muestra una solución detallada con las matrices cambiadas.
Acá les dejo el código:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <string.h>
///----------------------------------------------------
using namespace std;
///----------------------------------------------------
int n;
///----------------------------------------------------
struct Matriz
{
float m[9][9];
};
struct vect
{
float v[100];
};
///----------------------------------------------------GENERA LA MATRIZ IDENTIDAD
void Identidad(int lm , Matriz &a)
{
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
if(i==j)
a.m[i][j]=1;
else
a.m[i][j]=0;
}
}
}
///----------------------------------------------------MUESTRA UNA MATRIZ DE CUALQUIER TAMAÑO
void showM (int lm , Matriz &a)
{
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
printf("%10.5f",a.m[i][j]);
}
cout<<endl;
}
}
///----------------------------------------------------PERMITE INTRODUCIR UNA MATRIZ POR TECLADO
void inM (int lm, Matriz &a)
{
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
printf(" Ingresar x[%d][%d]: ",i,j);
scanf("%f",&a.m[i][j]);
}
}
}
///----------------------------------------------------PERMITE INTRODUCIR UN VECTOR POR TECLADO
void inV (int lm, vect &a)
{
for(int i=0 ; i<lm ; i++)
{
printf(" Ingresar b[%d]: ",i);
scanf("%f",&a.v[i]);
}
}
///----------------------------------------------------PERMITE ESCALONAR UNA MATRIZ DE MAXIMO 4FyC
void Escalonar(int lm , Matriz &b, vect &mul)
{
if(lm==3)
{
mul.v[0]=(float) -(b.m[1][0]/b.m[0][0]);
mul.v[1]=(float) -(b.m[2][0]/b.m[0][0]);
for(int i=1 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
b.m[i][j]=(float) b.m[i][j] + (mul.v[i-1]*b.m[0][j]);
}
}
mul.v[2]=(float) -(b.m[2][1]/b.m[1][1]);
for(int i=1 ; i<lm ; i++)
{
b.m[2][i]=(float) b.m[2][i] + (mul.v[2]*b.m[1][i]);
}
}
if(lm==4)
{
mul.v[0]=(float) -(b.m[1][0]/b.m[0][0]);
mul.v[1]=(float) -(b.m[2][0]/b.m[0][0]);
mul.v[2]=(float) -(b.m[3][0]/b.m[0][0]);
for(int i=1 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
b.m[i][j]=(float) b.m[i][j] + (mul.v[i-1]*b.m[0][j]);
}
}
mul.v[3]=(float) -(b.m[2][1]/b.m[1][1]);
mul.v[4]=(float) -(b.m[3][1]/b.m[1][1]);
for(int i=2 ; i<=lm ; i++)
{
for(int j=1 ; j<lm ; j++)
{
b.m[i][j]=(float) b.m[i][j] + (mul.v[i+1]*b.m[1][j]);
}
}
mul.v[5]=(float) -(b.m[3][2]/b.m[2][2]);
for(int i=2 ; i<=lm ; i++)
{
b.m[3][i]=(float) b.m[3][i] + (mul.v[5]*b.m[2][i]);
}
}
}
///----------------------------------------------------MUESTRA UN VECTOR Y UNA MATRIZ
void showMandV(int lm, Matriz &a, vect &r)
{
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
printf("%10.5f",a.m[i][j]);
}
printf(" | %.5f",r.v[i]);
cout<<endl;
}
}
///----------------------------------------------------EXCLUSIVO PARA SACAR EL VECTOR RESULTANTE AUMENTADO
void multivect(int lm,vect &a, vect &b, vect &r)
{/// res mul resultado
if(lm==3)
{
r.v[0]=(float) a.v[0];
r.v[1]=(float) (b.v[0]*r.v[0]) + a.v[1];
r.v[2]=(float) (b.v[2]*r.v[1]) + ((b.v[1]*r.v[0]) + a.v[2]);
}
if(lm==4)
{
r.v[0]=(float) a.v[0];
r.v[1]=(float) (b.v[0]*r.v[0]) + a.v[1];
r.v[2]=(float) (b.v[3]*r.v[1]) + ((b.v[1]*r.v[0]) + a.v[2]);
r.v[3]=(float) (b.v[5]*r.v[2]) + ((b.v[2]*r.v[0]) + a.v[3]) + (r.v[1]*b.v[4]);
}
}
///----------------------------------------------------MUESTRA EL DETERMINANTE DE UN NxN
void ShowDeterminante(int lm, Matriz &det)
{
float cont=1;
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
if(i==j)
cont=cont*det.m[i][j];
}
}
printf("\n El Determinante |A| es igual a: %.5f\n",cont);
}
///----------------------------------------------------MUESTRA UN VECTOR, MODIFICADO HASTA PARA MATRICES 4X4
void showV(int lm, vect &mv)
{
cout<<"\n";
if(lm==3)
{
for(int i=0 ; i<lm ; i++)
printf(" x[%d] =%10.5f\n",i+1,mv.v[i]);
}
if(lm==4)
{
for(int i=0 ; i<lm ; i++)
printf(" x[%d] =%10.5f\n",i+1,mv.v[i]);
}
}
///----------------------------------------------------MUESTRA UN VECTOR, MODIFICADO PARA MATRICES 4X4
void showVM(int lm, vect &mv)
{
cout<<"\n";
if(lm==3)
{
for(int i=0 ; i<lm ; i++)
printf(" m[%d] =%10.5f\n",i+1,mv.v[i]);
}
if(lm==4)
{
for(int i=0 ; i<=lm+1 ; i++)
printf(" m[%d] =%10.5f\n",i+1,mv.v[i]);
}
}
///----------------------------------------------------
void valx(int lm,Matriz &x, vect &y, vect &res)
{
if(lm==3)
{
float A=x.m[0][0],B=x.m[0][1],C=x.m[0][2],D=x.m[1][1],E=x.m[1][2],F=x.m[2][2];
res.v[2]=(float) y.v[2]/F;
res.v[1]=(float) (y.v[1]-(E*res.v[2]))/D;
res.v[0]=(float) (y.v[0]-(C*res.v[2])-(B*res.v[1]))/A;
}
if(lm==4)
{
float A=x.m[0][0],B=x.m[0][1],C=x.m[0][2],D=x.m[0][3];
float E=x.m[1][1],F=x.m[1][2],G=x.m[1][3];
float H=x.m[2][2],I=x.m[2][3];
float J=x.m[3][3];
res.v[3]=(float) y.v[3]/J;
res.v[2]=(float) (y.v[2]-(I*res.v[3]))/H;
res.v[1]=(float) (y.v[1]-(G*res.v[3])-(F*res.v[2]))/E;
res.v[0]=(float) (y.v[0]-(D*res.v[3])-(C*res.v[2])-(B*res.v[1]))/A;
}
}
///----------------------------------------------------
void ShowMMV(int lm, Matriz &a, Matriz&b, vect &r )
{
for(int i=0 ; i<lm ; i++)
{
for(int j=0 ; j<lm ; j++)
{
printf(" %.5f",a.m[i][j]);
}
printf(" |");
for(int k=0 ; k<lm ; k++)
{
printf(" %.5f",b.m[i][k]);
}
printf(" | %.5f",r.v[i]);
cout<<endl;
}
}
///----------------------------------------------------
void escalonar2 (int lm , Matriz &b , Matriz &i , vect &r)
{
float val1,val2,val3,val4,val5,val6,val7,val8,val9;
val1=(float) b.m[0][0];
for(int k=0 ; k<lm ; k++)
{
b.m[0][k]=(float) b.m[0][k]/val1;
i.m[0][k]=(float) i.m[0][k]/val1;
}
r.v[0]=(float) r.v[0]/val1;
val2=(float) -b.m[1][0];
for(int k=0 ; k<lm ; k++)
{
b.m[1][k]=(float) b.m[1][k]+(val2*b.m[0][k]);
i.m[1][k]=(float) i.m[1][k]+(val2*i.m[0][k]);
}
r.v[1]=(float) (r.v[0]*val2)+r.v[1];
val3=(float) -b.m[2][0];
for(int k=0 ; k<lm ; k++)
{
b.m[2][k]=(float) b.m[2][k]+(val3*b.m[0][k]);
i.m[2][k]=(float) i.m[2][k]+(val3*i.m[0][k]);
}
r.v[2]=(float) (r.v[0]*val3)+r.v[2];
cout<<"\n";
ShowMMV(lm,b,i,r);
val4=(float) b.m[1][1];
for(int k=1 ; k<lm ; k++)
{
b.m[1][k]=(float) b.m[1][k]/val4;
i.m[1][k-1]=(float) i.m[1][k-1]/val4;
}
r.v[1]=(float) r.v[1]/val4;
val5=(float) -b.m[0][1];
for(int k=1 ; k<lm ; k++)
{
b.m[0][k]=(float) b.m[0][k]+(val5*b.m[1][k]);
i.m[0][k-1]=(float) i.m[0][k-1]+(val5*i.m[1][k-1]);
}
r.v[0]=(float) (r.v[1]*val5)+r.v[0];
val6=(float) -b.m[2][1];
for(int k=1 ; k<lm ; k++)
{
b.m[2][k]=(float) b.m[2][k]+(val6*b.m[1][k]);
i.m[2][k-1]=(float) i.m[2][k-1]+(val6*i.m[1][k-1]);
}
r.v[2]=(float) (r.v[1]*val6)+r.v[2];
cout<<"\n";
ShowMMV(lm,b,i,r);
val7=(float) b.m[2][2];
b.m[2][2]=(float) b.m[2][2]/val7;
for(int k=0 ; k<lm ; k++)
i.m[2][k]=(float) i.m[2][k]/val7;
r.v[2]=(float) r.v[2]/val7;
val8=(float) -b.m[1][2];
b.m[1][2]=(float) b.m[1][2]+(val8*b.m[2][2]);
for(int k=0 ; k<lm ; k++)
i.m[1][k]=(float) i.m[1][k]+(val8*i.m[2][k]);
r.v[1]=(float) (r.v[2]*val8)+r.v[1];
val9=(float) -b.m[0][2];
b.m[0][2]=(float) b.m[0][2]+(val9*b.m[2][2]);
for(int k=0 ; k<lm ; k++)
i.m[0][k]=(float) i.m[0][k]+(val9*i.m[2][k]);
r.v[0]=(float) (r.v[2]*val9)+r.v[0];
cout<<"\n";
ShowMMV(lm,b,i,r);
}
void showLU(vect &ex,Matriz &tra)
{
Matriz extra;
Identidad(3,extra);
extra.m[1][0]=ex.v[0];
extra.m[2][0]=ex.v[1];
extra.m[2][1]=ex.v[2];
printf("\n La matriz L :\n");
showM(3,extra);
printf("\n La matriz U :\n");
showM(3,tra);
}
///----------------------------------------------------
void MetodoGaussR()
{
Matriz Coeficientes;
vect multiplicadores;
vect res;
vect resaumentada;
vect xs;
printf(" *****METODO DE SUSTITUCION REGRESIVA*****");
printf("\n El valor de grado de la matriz es: ");
cin>>n; //SIZE OF TMATRIZ
printf("\n Introduzca la matriz A de coeficientes : \n");
inM(n,Coeficientes);
printf("Introduzca el vector b de resultados:\n");
inV(n,res);
system("cls");
printf(" *****METODO DE SUSTITUCION REGRESIVA*****");
printf("\n LA MATRIZ [A|b] ES: \n");
showMandV(n,Coeficientes,res);
printf("\n LA MATRIZ [A|b] AUMENTADA ES: \n");
Escalonar(n,Coeficientes,multiplicadores);
multivect(n,res,multiplicadores,resaumentada);
showMandV(n,Coeficientes,resaumentada);
showLU(multiplicadores,Coeficientes);
printf("\n LOS MULTIPLICADORES SON: \n");
showVM(n,multiplicadores);
valx(n,Coeficientes,resaumentada,xs);
printf("\n LOS VALORES DEL VECTOR X-SOLUCION SON: ");
showV(n,xs);
ShowDeterminante(n,Coeficientes);
}
///----------------------------------------------------
void MetodoGaussJordan()
{
int n;
Matriz Coeficientes;
Matriz I;
vect res;
vect resaumentada;
vect multiplicadores;
printf(" *****METODO GAUSS JORDAN CON MATRIZ INVERSA*****");
printf("\n El valor de grado de la matriz es: ");
cin>>n; //SIZE OF TMATRIZ
printf("\n Introduzca la matriz A de coeficientes : \n");
inM(n,Coeficientes);
printf("Introduzca el vector b de resultados:\n");
inV(n,res);
system("cls");
printf(" *****METODO GAUSS JORDAN CON MATRIZ INVERSA*****");
printf("\n LA MATRIZ [A|I|b] ES: \n");
Identidad(n,I);
ShowMMV(n,Coeficientes,I,res);
///Coeficientes, matriz independiente, I, matriz identidad independiente, res, vector de res
escalonar2(n,Coeficientes,I,res);
printf("\n Por lo tanto la matriz inversa es: \n");
showM(n,I);
printf("\n Y el vector X de resultado es: ");
showV(n,res);
}
///----------------------------------------------------
void menu()
{
printf("\n *****CODES FOR SOLVING LINEAR EQUATIONS BY ALEXIS SEGALES*****\n");
printf(" Que metodo desea utilizar?\n\n");
int des;
printf(" 1) Metodo de sustitucion regresiva\n\n");
printf(" 2) Metodo de la matriz inversa\n\n");
printf(" >> ");
cin>>des;
system("cls");
if(des==1)
MetodoGaussR();
if(des==2)
MetodoGaussJordan();
printf("\n Desea realizar otra operacion: \n");
int desu;
printf(" 1) SI\n\n");
printf(" 2) NO\n\n");
printf(" >> ");
cin>>desu;
system("cls");
if(des==1)
menu();
if(des==2)
system("CLOSE");
system("PAUSE");
}
///----------------------------------------------------
int main()
{
menu();
return 0;
}
Comentários