0% encontró este documento útil (0 votos)
27 vistas8 páginas

Programacion Gauss Seidel

El documento presenta el código C++ para implementar diferentes métodos numéricos como Gauss, Gauss-Jordan, Gauss-Seidel y mínimos cuadrados. Se definen clases y funciones para resolver sistemas de ecuaciones lineales y no lineales mediante estos algoritmos.

Cargado por

Daniel Css
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
27 vistas8 páginas

Programacion Gauss Seidel

El documento presenta el código C++ para implementar diferentes métodos numéricos como Gauss, Gauss-Jordan, Gauss-Seidel y mínimos cuadrados. Se definen clases y funciones para resolver sistemas de ecuaciones lineales y no lineales mediante estos algoritmos.

Cargado por

Daniel Css
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

#include <iostream.

h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include<math.h>
#define N 10
#define L 40
#define A L
class menu
{
private:
float m[N][N+1], m1[N][N+1], X[N];
int i,ax,ay;
float xi[100],yi[100],xiyi[100],x2i[100];
float sumxi,sumyi,sumxiyi,sumx2i,sumxi2,sumsr,sumst;
float xprom,yprom,a1,a0,sr[100],st[100],sy,syx,r2;
float M[L][A],Z[L],CX[L],C[L];
float e, f;
int it,x,y;
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);
void jordan(int n);
void minimos(int m);
void seidel(int s);
};
void menu::obtenerm(int n)
{
int i,j;
cout<<"Introduce los coeficientes de la matriz:"<<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 menu::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 menu::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 menu::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 menu::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 menu::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 menu::gauss(int n)
{
int i,j,k;
float a;

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);
}
}
printf("\nLa matriz resultante es:\n");
imprimirm(1,n);
obtenerinc(n);
printf("\nLos valores de las incognitas son:");
for(i=0;i<n;i++)
printf("\nx%d = %5.2f",i+1,X[i]);
getch();
}
void menu::jordan(int n)
{
int i,j,k;
float a,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 resultante es:\n");
imprimirm(1,n);
obtenerinc(n);
printf("\nLos valores de las incognitas son:");
for(i=0;i<n;i++)
printf("\nx%d = %5.2f",i+1,X[i]);
printf("\nEvaluando los valores obtenidos en la 1 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);
getch();
}
void menu::seidel(int s)
{
cout<<endl;
printf("\n\tCuantas incognitas tendra el sistema: ");
scanf("%d",&s);
for(x=0;x<s;x++)
{
CX[x]=0;
Z[x]=0;
}
for(y=0;y<s;y++)
{
for(x=0;x<s;x++)
{
printf("A[%d][%d] = ",y,x);
scanf("%f",&e);
M[y][x]=e;
}
printf("Y la constante C[%d] = ",y);
scanf("%f",&f);
C[y]=f;
}
for(it=0;it<20;it++)
{
for(y=0;y<s;y++)
{
for(x=0;x<s;x++)
CX[y]-=(M[y][x]*Z[x])/M[y][y];
CX[y]+=(C[y]/M[y][y]);
Z[y]=CX[y];
}
}
printf("El resultado es ");
for(x=0;x<s;x++)
printf("\nX[%d]=%f",x+1,Z[x]);

getch();
}
void menu::minimos(int m)
{
cout<<endl;
cout<<endl<<" Ingrese el numero de datos: ";
cin>>m;
if(m>2)
{
clrscr();
for(i=0;i<m;i++)
{
clrscr();
cout<<endl<<" Dato "<<(i+1)<<":"<<endl;
cout<<endl<<" Ingrese el valor de Xi: ";
cin>>xi[i];
cout<<endl<<" Ingrese el valor de Yi: ";
cin>>yi[i];
}
clrscr();
cout<<endl<<"\t\t- - - M I N I M O S
cout<<endl<<endl<<"
Xi
Yi

C U A D R A D O S - - -"<<endl;
Xi*Yi
X^2 ";

ax=7;
ay=7;
sumxi=0;
sumyi=0;
sumxiyi=0;
sumx2i=0;
for(i=0;i<m;i++)
{
gotoxy(ax,ay);
cout<<xi[i];
gotoxy(ax+8,ay);
cout<<yi[i];
xiyi[i]=xi[i]*yi[i];
gotoxy(ax+18,ay);
cout<<xiyi[i];
x2i[i]=pow(xi[i],2);
gotoxy(ax+30,ay);
cout<<x2i[i];
sumxi=sumxi+xi[i];
sumyi=sumyi+yi[i];
sumxiyi=sumxiyi+xi[i]*yi[i];
sumx2i=sumx2i+pow(xi[i],2);
sumxi2=pow(sumxi,2);
xprom=sumxi/m;
yprom=sumyi/m;
a1=(m*sumxiyi-sumxi*sumyi)/(m*sumx2i-sumxi2);
a0=yprom-a1*xprom;
ay++;
}
gotoxy(45,5);
cout<<"Sr (Yi-a0-a1Xi)^2 St (Yi-Yprom)^2"<<endl;
ax=48;
ay=7;

for(i=0;i<m;i++)
{
sr[i]=pow(yi[i]-a0-a1*xi[i],2);
gotoxy(ax,ay);
cout<<sr[i];
st[i]=pow(yi[i]-yprom,2);
gotoxy(ax+20,ay);
cout<<st[i];
ay++;
}
sumsr=0;
sumst=0;
for(i=0;i<m;i++)
{
sumsr=sumsr+sr[i];
sumst=sumst+st[i];
}
ax=7;
ay=ay+1;
gotoxy(1,ay);
cout<<"Total";
gotoxy(ax,ay);
cout<<sumxi;
gotoxy(ax+8,ay);
cout<<sumyi;
gotoxy(ax+18,ay);
cout<<sumxiyi;
gotoxy(ax+30,ay);
cout<<sumx2i;
gotoxy(48,ay);
cout<<sumsr;
gotoxy(68,ay);
cout<<sumst;
cout<<endl;
cout<<endl<<" Xprom. = "<<xprom;
cout<<endl<<" Yprom. = "<<yprom;
cout<<endl<<" a1 = "<<a1;
cout<<endl<<" a0 = "<<a0;
cout<<endl<<" f(x) = Y = "<<a0<<" + "<<a1<<" X";
sy=sqrt(sumst/(m-1));
cout<<endl<<" Sy = "<<sy;
syx=sqrt(sumsr/(m-2));
cout<<endl<<" Sy/x = "<<syx;
r2=(sumst-sumsr)/sumst;
cout<<endl<<" r^2 = "<<r2;
}
else
{
clrscr();
cout<<endl<<"\t ***ERROR el numero de datos debe ser mayor de 2 ***";
cout<<endl<<endl<<" Presione ENTER para salir....";
}
getch();
}
void main(void)

{
int n,m,s,opc;
menu obj;
do
{
clrscr();
cout<<"\n\n\t";
cout<<"\n\t*
MENU
*";
cout<<"\n\t*
Elija una opcion
*";
cout<<"\n\t*
1. Gauss
*";
cout<<"\n\t*
2. Gauss-Jordan
*";
cout<<"\n\t*
3. Gauss Seidel
*";
cout<<"\n\t*
4. minimos cuadrados
*";
cout<<"\n\t*
5. Salir
*";
cout<<"\n\t\n";
cin>>opc;
switch (opc)
{
case 1:
{
clrscr();
cout<<endl;
cout<<"\t GAUSS ";
cout<<"\n\n Ingresa el tamao de la Matriz cuadrada \n n= ";
cin>>n;
[Link](n);
cout<<"\n \n La matriz Aumentada es:"<<endl;
[Link](0,n);
cout<<"\n Encontraremos las soluciones a las incognitas\n";
[Link](n);
}
break;
case 2:
{
clrscr();
cout<<endl;
cout<<"\t GAUSS JORDAN *.* ";
cout<<"\n\n Ingresa el tamao de la Matriz cuadrada \n n= ";
cin>>n;
[Link](n);
cout<<"\n \n La matriz Aumentada es:"<<endl;
[Link](0,n);
cout<<"encontraremos las soluciones a las incognitas";
[Link](n);
}
break;
case 3:
{
clrscr();
cout<<endl;
cout<<"\t *.* GAUSS SEIDEL";
[Link](s);
}
break;
case 4:
{
clrscr();
cout<<endl;

cout<<"\t MINIMOS CUADRADOS";


[Link](m);
}
break;
case 5:
{
clrscr();
cout<<"Salida";
opc=5;
}
break;
default:
{
clrscr();
cout<<"lo siento esta opcion no existe";
getch();
}
break;
}
clrscr();
}while(opc!=5);
getch();
}

También podría gustarte