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
esta en nada
ResponderEliminar...........:)