Si reescribimos la ecuación f(x)=0 como x=g(x) podemos emplear un método iterativo para hallar los puntos fijos. Esto consiste en escoger un punto inicial x_{0} e iterar el sistema x_{i+1}=g(x_{i}) hasta alcanzar algún criterio de convergencia.
A continuación te comparto un código en C que haya un punto fijo para las siguientes funciones:
a) x = \cos\left(x\right)
b) x = 0.5\left(x^{3}+1\right)
c) x = x^{3}+1
d) x = -\sqrt{1-x}
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"
// 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
// Estructura donde se almacena el
// punto fijo hallado y si convergio o divergio
struct puntoFijo1D
{ double punto; // almacena el punto hallado de X
int condiv; // 1: converge, 0: diverge
};
// 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 getFA(double x)
{return(cos(x));}
// Funcion inciso b)
double getFB(double x)
{return(0.5*(x*x*x+1));}
// Funcion inciso c)
double getFC(double x)
{return(x*x*x+1);}
// Funcion inciso d)
double getFD(double x)
{
if((1.0-x)<0)return(fabs((1.0-x)));
return(-sqrt(1.0-x));
}
// Retorna el punto fijo, si es que convergio o no
// para una funcion de la forma x=F(x)
struct puntoFijo1D *getPuntoFijo1D(double x0, double F(double x), FILE *file)
{ struct puntoFijo1D *point=(struct puntoFijo1D *)malloc(sizeof(struct puntoFijo1D));
double epsilon=0.0, maxDouble=0.0, x1=x0, iter=-1.0;
epsilon=overDownDouble();
maxDouble=overUpDouble();
// Buscar punto de convergencia
do
{ x0=x1;
x1=F(x0);
iter++;
fprintf(file,"\n Iteracion%7.0lf : %e",iter,x0);
if(fabs(x1)>maxDouble)// divergio
{
point->punto=x0;
point->condiv=DIVERGE;// divergio
return(point);
}// fin de if
}while(fabs(x1-x0)>epsilon);// fin del while
// sale del while significa que converge
point->punto=x1;
point->condiv=CONVERGE;// divergio
return(point);
}// fin de la funcion
// Main Principal
int main()
{
double val=0,sigVal=0.0;
FILE *outFile;
struct puntoFijo1D *punto;
printf("\n Probar diferentes procesos iterativos y su convergencia con diferentes puntos\n");
printf("\n x = cos( x )");
outFile=openFile("A1.txt", MODOW); val=-3.0;
punto=getPuntoFijo1D(val, getFA,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
outFile=openFile("A2.txt", MODOW); val=5.0;
punto=getPuntoFijo1D(val, getFA,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
printf("\n\n x = 0.5*(1+ x^3 )");
outFile=openFile("B1.txt", MODOW); val=-3.0;
punto=getPuntoFijo1D(val, getFB,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
outFile=openFile("B2.txt", MODOW); val=0.0;
punto=getPuntoFijo1D(val, getFB,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
outFile=openFile("B3.txt", MODOW); val=5.0;
punto=getPuntoFijo1D(val, getFB,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
printf("\n\n x = 1+ x^3");
outFile=openFile("C1.txt", MODOW); val=-3.0;
punto=getPuntoFijo1D(val, getFC,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
outFile=openFile("C2.txt", MODOW); val=5.0;
punto=getPuntoFijo1D(val, getFC,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e",val,punto->punto);
else printf("\n El punto %lf diverge ",val);
printf("\n\n x = - raiz( 1 - x )");
val=-10.0;
sigVal=getFD(val);
if(sigVal>0) printf("\n El punto inicial no es valido");
else
{ outFile=openFile("D1.txt", MODOW);
punto=getPuntoFijo1D(val, getFD,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e", val, punto->punto);
else printf("\n El punto diverge ");
}
val=1.0;
sigVal=getFD(val);
if(sigVal>0) printf("\n El punto inicial no es valido");
else
{ outFile=openFile("D2.txt", MODOW);
punto=getPuntoFijo1D(val, getFD,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e", val, punto->punto);
else printf("\n El punto diverge ");
}
val=5.0;
sigVal=getFD(val);
if(sigVal>0) printf("\n El punto %lf no es valido",val);
else
{ outFile=openFile("D3.txt", MODOW);
punto=getPuntoFijo1D(val, getFD,outFile);
if(punto->condiv==CONVERGE) printf("\n El punto %lf converge a %e", val, punto->punto);
else printf("\n El punto diverge ");
}
printf("\n\n Los archivos AX, BX, CX y DX, almacenan los valores");
printf("\n de la sucesion hasta la convergencia...");
return 0;
}// fin del Main
Saludos. Faith Heart.
No hay comentarios:
Publicar un comentario