top of page
Foto del escritorGato Ingeniero

Resolver Sistemas Lineales de Ecuaciones

Actualizado: 6 ene 2022

-> 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;

}


7 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comentários


Publicar: Blog2_Post
bottom of page