miércoles, 8 de febrero de 2012

Metodo de punto fijo - Sistema de ecuaciones - Código C

Continuando con el tema anterior, es posible realizar un proceso de punto fijo a un sistema de ecuaciones. Los pasos a realizar son bastante similares. Por ejemplo, el sistema de ecuaciones

$3x + 2y = 1$
$ x + 3y  = -16$

puede reescribirse de tal forma que, apartir de un $(x_{0},y_{0})$ iniciales, puedan generarse pares de valores $(x_{i+1},y_{i+1})$ hasta alcanzar un criterio de convergencia. Esto es,

$x_{i+1} = \frac{1-2y_{i}}{3}$

$y_{i+1} = -\frac{16+x_{i}}{3}$

A continuación comparto un código en C que resuelve el sistema descrito. Se aceptan votos. Espero te sea de utilidad. 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define CONVERGE 1
#define DIVERGE 0
#define MODOR "r"
#define MODOW "w"

// Estructura donde se almacena el
// punto fijo hallado y si convergio o divergio
struct puntoFijo2D
{ double puntox; // almacena el punto hallado de X
  double puntoy; // almacena el punto hallado de Y
  int condiv; // 1: converge, 0: diverge
};

// Funcion para cargar o crear un archivo
FILE *openFile(const char *nomFile, const char *modo)
{ FILE *inFile=(FILE *)malloc(sizeof(FILE));
  // Apertura de Archivo de ENTRADA y validacion de errores
  inFile = fopen(nomFile,modo);
  printf( "\n Archivo: %s ->",nomFile);
  if(inFile) printf( " ABIERTO" );
  else{printf( " NO ABIERTO" ); return(NULL);}
  return(inFile);
}// fin de cargar o crear un archivo

// Retorna el minimo double
double overDownDouble()
{ double val=1.0, ant,i=2.0;
    do
    { ant=val;
      val=val/i;
    }while((ant)==(val*i));
  return(ant);
}// fin de funcion

// Retorna el maximo Double
double overUpDouble()
{ double val=1.0, ant,i=2.0;
  do{
    do
    { ant=val;
      val=val*i;
    }while((ant)==(val/i));
    val=ant;
    i=i-1/pow(10,6);
   }while(i>1.0);
  return(val);
}// fin de funcion

// Funciones a evaluar-------------------------------------------------------
// Funcion inciso a)
double getF(double y)
{return((1.0-2.0*y)/3.0);}
// Funcion inciso a)
double getG(double x)
{return(-(16.0+x)/3.0);}

// Retorna el punto fijo, si es que convergio o no
// para una funcion de la forma x=F(x)
struct puntoFijo2D *getPuntoFijo2D(double x0, double y0, double F(double y),double G(double x), FILE *file)
{ struct puntoFijo2D *point=(struct puntoFijo2D *)malloc(sizeof(struct puntoFijo2D));
  double epsilon=0.0, maxDouble=0.0, x1=x0, y1=y0,iter=-1.0;
  epsilon=overDownDouble();
  maxDouble=overUpDouble();
  // Buscar punto de convergencia
  do
  { x0=x1;  y0=y1;
    x1=F(y0);  y1=G(x0);
    iter++;
    fprintf(file,"\n Iteracion%7.0lf --> X: %5.10e   Y: %5.10e",iter,x0,y0);
    if(fabs(x1)>maxDouble || fabs(y1)>maxDouble)// divergio
    {
      point->puntox=x0;
      point->puntoy=y0;
      point->condiv=DIVERGE;// divergio
      return(point);
    }// fin de if
  }while(fabs(x1-x0)>epsilon && fabs(y1-y0)>epsilon);// fin del while
  // sale del while significa que converge
  point->puntox=x1;
  point->puntoy=y1;
  point->condiv=CONVERGE;// Convergio
  return(point);
}// fin de la funcion


// Main Principal
int main()
{
    struct puntoFijo2D *punto;
    FILE *inFile;  double x0,y0;
    printf("\n Tabulacion de la sucesion de un sistema de ecuaciones\n");
    printf("\n Sistema: \n Xr+1 = ( 1 - 2Yr )/3  \n Yr+1 = -( 16+Xr )/3\n ");
    x0=0.0; y0=0.0;
    inFile=openFile("S1.txt",MODOW);
    punto=getPuntoFijo2D(x0, y0, getF, getG, inFile);
    printf("\n Con el par ( %3.2lf , %3.2lf ) se converge a ( %3.3e , %3.3e )",x0,y0,punto->puntox, punto->puntoy);
    x0=-10.0; y0=3.0;
    inFile=openFile("S2.txt",MODOW);
    punto=getPuntoFijo2D(x0, y0, getF, getG, inFile);
    printf("\n Con el par ( %3.2lf , %3.2lf ) se converge a ( %3.3e , %3.3e )",x0,y0,punto->puntox, punto->puntoy);
    x0=30.0; y0=-5.0;
    inFile=openFile("S3.txt",MODOW);
    punto=getPuntoFijo2D(x0, y0, getF, getG, inFile);
    printf("\n Con el par ( %3.2lf , %3.2lf ) se converge a ( %3.3e , %3.3e )",x0,y0,punto->puntox, punto->puntoy);
    printf("\n\n En los archivos SX.txt se almaceno los valores hasta la convergencia");
    return 0;
}// fin main


Saludos - Faith Heart

1 comentario: