miércoles, 23 de enero de 2008

Cálculo de raices únicas reales en lenguaje C

Desarrolle en TurboPascal y en C una función que lleve a cabo el cálculo de las raíces únicas reales de una función continua en un intervalo cerrado [a,b] mediante el método de la bisección con una precisión delta -se supone que la longitud del intervalo es múltiplo de delta.

Para ello realice una función llamada raices que tenga como parámetros una función de reales en reales, dos reales que establezcan el intervalo de cálculo, un delta de precisión, y un vector con las soluciones, y que devuelva un entero indicando el número de raíces encontradas. Pruebe esta función creando un programa principal que muestre las raíces en el intervalo [-10,10] de las siguientes funciones matemáticas de reales en reales que también deberá implementar:
f1(x) = x2+x-12
f2(x) = x2-3x+2
f3(x) = x2-2x
f4(x)=sen(x)/(x+11) {seno en radianes}



#include
#include
#include

float linf;float lsup;
float f1(float x) { return (x*x+x-12 ); }
float f2(float x) { return (x*x-3*x+2 ); }
float f3(float x) { return (x*x-2*x ); }
float f4(float x) { return ((float)(sin(x)/(11+x))); }

int Raices(float(*fx)(float),float delta,float linf,
float lsup,float *soluciones)
{

float aux,y,paso,inf,sup,medio,limite;
int nraices=0;
if (linf>lsup)
{
aux = linf;
linf = lsup;
lsup = aux;
}

y = linf;
paso = delta*100;
while (y {
if ( (fabs(fx(y))) < delta ){
nraices++;
soluciones[nraices-1]=y;
y+=paso;
}
else{
if ( ( fx(y)*fx(y+paso) ) < 0 ) {
nraices++;
inf = y;
sup = y + paso;
medio = ( y + (y+paso) )/2;
limite= medio - inf;
while ( (limite>delta) && (fx(medio)!=0) ){
if (fx(inf)*fx(medio)<0)
sup = medio;
else
inf = medio;
medio = (sup + inf)/2;
limite = medio - inf;
}
soluciones[nraices-1] = medio;
}
y+=paso;
}
}
if ( fabs(fx(lsup)) < delta ){
nraices++;
soluciones[nraices-1]=sup;
}
return nraices;
}

void main()
{
float inferior,superior,delta,Sol[10];
char opcion;
int nsol,i;

printf("comienza el programa de Raices\n");
printf("Dame el limite inferior del intervalo: ");
scanf("%f",&inferior);
printf("Dame el limite superior del intervalo: ");
scanf("%f",&superior);
printf("Dame los incrementos de subdivision del intervalo(delta): ");
scanf("%f",&delta);
do
{
printf("Opciones \n");
printf(" 1 . (x*x+x-12 ) \n");
printf(" 2 . (x*x-3*x+2) \n");
printf(" 3 . (x*x-2*x ) \n");
printf(" 4 . (sin(x)/(11+x)) \n");
printf("Dame el tipo de funcion a utilizar:\n");
opcion=getch();
}
while ((opcion>'5')||(opcion<'0'));
switch (opcion){
case '1' :
{
nsol = Raices(f1,delta,inferior,superior,Sol);
printf("Existen %d soluciones\n",nsol);
for (i=0;i printf("la %d solucion es %f\n",i+1,Sol[i]);
}
break;
}
case '2' :
{
nsol = Raices(f2,delta,inferior,superior,Sol);
printf("Existen %d soluciones\n",nsol);
for (i=0;i printf("la %d solucion es %f\n",i+1,Sol[i]);
}
break;
}
case '3' :
{
nsol = Raices(f3,delta,inferior,superior,Sol);
printf("Existen %d soluciones\n",nsol);
for (i=0;i printf("la %d solucion es %f\n",i+1,Sol[i]);
}
break;
}

case '4' :
{
nsol = Raices(f4,delta,inferior,superior,Sol);
printf("Existen %d soluciones\n",nsol);
for (i=0;i printf("la %d solucion es %f\n",i+1,Sol[i]);
}
break;
}
default : printf("Hay Problemas");
}
printf("Fin. Pulsa una tecla.....");
getch();
}