/* Metodo de Solucion Simultanea de Ecuaciones Lineales. */
/* Metodo de Gauss-Seidel de una matriz. */
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
#define max_ecu 10
#define max_inc 10
// Declaracion de variables genericas.
void encabezado( void );
void a_ceros( void );
void cap_coef( void );
void gauss_seidel( void );
float mat_coef[10][10];
float resul[10], C[10], x[10];
float margen_err;
int n_ecu, n_inc ;
int i, j, k, w ;
int lin, col1, col2, col3, col4, n_itera ;
char c;
// Programa Principal.
void main(void)
{
inicio:
a_ceros();
encabezado();
cap_coef();
gauss_seidel();
cout<<"\n\t\t Desea Calcular otra Matriz? (s/n): \t "; c = getch();
if( c == 's' || c == 'S' )
goto inicio;
else
goto final;
final:
cout<<"\n\n\t Teclee <ENTER> para continuar. "; getch();
}
// Funcion para hacer ceros a las variables.
void a_ceros( void )
{
int i = j = 0;
for( i = 0; i < max_ecu; i++ )
{
for( j = 0; j <= max_inc; j++ )
{
mat_coef[i][j] = 0.0 ;
}
}
}
// Encabezado del Programa.
void encabezado( void )
{
n_itera = 0;
margen_err = 0.0;
gotoxy(10, 6); cout<<" Metodo de GAUSS_SEIDEL de una Matriz.\n " ;
for( i = 1; i <= 78; i++ ) //Para trazar una linea sombreada.
{
printf("%c", 177 );
}
gotoxy(10, 8); cout<<" Teclee el numero de Ecuaciones. " ;
gotoxy(45, 8); cin>>n_ecu ;
gotoxy(10, 9); cout<<" Teclee el valor de epsilon." ;
gotoxy(45, 9); cin>>margen_err ;
gotoxy(10,10); cout<<" Teclee el numero maximo de iteraciones." ;
gotoxy(50,10); cin>>n_itera ;
gotoxy(10,11); cout<<" Captura de coeficientes del Sistema de Ecuaciones." ;
// Primero de trazan los Parentesis.
// primer parentesis.
lin = 12 ;
col2 = 20 + (8*n_ecu ); // Inicia en 20 + Separacion del parentesis.
for( i = 1; i <= (n_ecu); i++ )
{
if( i == 1 )
{
gotoxy( 20,lin); printf("%c", 218 ); //Se imprime un angulo sup. izq.
gotoxy(col2,lin); printf("%c", 191 ); //Se imprime un angulo sup. der.
}
lin = lin + 1 ;
gotoxy( 20,lin); printf("%c", 179 ); //Se imprime una linea vertical.
gotoxy(col2,lin); printf("%c", 179 ); //Se imprime una linea vertical.
}
lin = lin + 1 ;
gotoxy( 20,lin); printf("%c", 192 ); //Se imprime un ang inf izq.
gotoxy(col2,lin); printf("%c", 217 ); //Se imprime un ang inf der.
// Segundo parentesis.
lin = 12 ;
col3 = col2 + 2; // Separacion del 2o parentesis.
col4 = col3 + 4; // Abertura del parentesis.
for( i = 1; i <= n_ecu; i++ )
{
if( i == 1 ) // Trazo de las esquinas superiorres.
{
gotoxy(col3,lin); printf("%c", 218 ); //Se imprime un angulo sup. izq.
gotoxy(col4,lin); printf("%c", 191 ); //Se imprime un angulo sup. der.
}
lin = lin + 1 ;
gotoxy(col3,lin); printf("%c", 179 ); //Se imprime una linea vertical.
gotoxy(col4,lin); printf("%c", 179 ); //Se imprime una linea vertical.
}
lin = lin + 1 ;
gotoxy(col3,lin); printf("%c", 192 ); //Se imprime un ang inf izq.
gotoxy(col4,lin); printf("%c", 217 ); //Se imprime un ang inf der.
// Para imprimir las incognitas x's
lin = 13; //1er elemento.
col1 = 24;
col2 = col1 + 3; // Separacion entre matrices.
col3 = col2 + 7; // Espacio entre elementos.
for( i = 1; i <= n_ecu; i++ )
{
for( j = 1; j <= n_ecu; j++ )
{
gotoxy(col1,lin); printf(" X%d", i );
lin = lin + 1; // Cambio de linea.
}
lin = 13; // se regresa al principio.
col1 = col1 + 7; //Espacio entre las x's.
}
}
/* Captura de Coeficientes. */
void cap_coef( void )
{
i = j = 0;
lin = 13 ;
col1 = 22 ;
for( i = 1; i <= n_ecu; i++ )
{
for( j = 1; j <= (n_ecu + 1); j++ ) //Incluye termino independiente.
{
if( j > n_ecu )
col1 = col1 + 4 ;
gotoxy(col1,lin);
if( i == 1 && j == 1 ) // Primer elemento.
scanf("%f", &mat_coef[1][1] );
else
scanf("%f", &mat_coef[i][j] ); // Elementos restantes.
col1 = col1 + 7 ; // Separacion entre elementos.
}
lin = lin + 1 ; // Cambio de linea.
col1 = 22 ;
}
}
// Algoritmo de Gauss-Seidel.
void gauss_seidel( void )
{
float x_ante[10];
float x_nueva[10];
float suma_err = 0.0 ;
float err = 0.0;
float r = 0.0;
int z = 0.0;
int cont = 0 ;
w = n_ecu + 1;
for( k = 1; k <= n_ecu; k++ )
{
C[k] = mat_coef[k][w];
x[k] = 0.0;
x_ante[k] = 0.0;
x_nueva[k] = 0.0;
}
do
{
cont = cont + 1;
printf("\n\t\t\t Iteracion Numero: %d ", cont);
for( i = 1; i <= n_ecu; i++ )
{
for( j = 1; j <= n_ecu; j++ )
{
if( i != j )
{
r = r + mat_coef[i][j]*x[j];
}
}
x[i] = (C[i] - r)/mat_coef[i][i];
printf("\n\t\t\t x[%d] = %10.5f", i, x[i] );
x_nueva[i] = x[i];
r = 0.0;
}
suma_err = 0.0;
for( z = 1; z <= n_ecu; z++ )
{
if(x_nueva[z] != 0 )
err = ( x_nueva[z] - x_ante[z])/x_nueva[z];
err = fabs(err)*100;
x_ante[z] = x_nueva[z];
suma_err = suma_err + err;
}
printf("\n\t\t\t Margen de error =%10.5f %", suma_err ); getch();
}
while ( (margen_err > suma_err) != (cont< n_itera)) ;
}
Si no les queda muy claro dejo link para que chequen bien el tema y esta muy bien explicado y con un ejemplo resuelto
No hay comentarios:
Publicar un comentario