miércoles, 5 de diciembre de 2012

METODO GAUSS - SEIDEL

En este método se  trabajo de igual forma  con matrices de 3x3 , realmente en este método no entendí mucho pero aquí hay un programa para ver mejor su comportamiento:


/* 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