[C con Clase] metod de biseccion, oblemas con el manejo de tipo de variables (double)

Jose Ramon Dominguez Barba josedb_90 en hotmail.com
Vie Sep 3 07:23:35 CEST 2010


Hola Davidson,

 

el break; lo tenia porque estaba analizando por partes el programa. En si el problema general es que el ciclo se hace infinito. Por esta razon lo estaba analizando por partes

y ahi fue en donde me di cuenta que los valores que recive la funcion biseccion o mas bien los calculos que se realizan no son los debidos, como si existiera mal manejo de las variables, y por esa razon no se cumple la condicion del ciclo while()
 
> Date: Fri, 3 Sep 2010 01:02:04 -0400
> From: srd4121 en njit.edu
> To: cconclase en listas.conclase.net
> Subject: Re: [C con Clase] metod de biseccion, oblemas con el manejo de tipo de variables (double)
> 
> Hola José Ramón,
> 
> On 9/3/2010 12:45 AM, Jose Ramon Dominguez Barba wrote:
> > Buen dia amigos.
> >
> > Tengo un pequeño problema con un programa simple:
> > el programa trata de emplear el metodo de biseccion(es un metodo
> > numerico), esta es una parte del programa
> >
> > float biseccion( double x_in,double x_fin,float e_max){
> > double x_r,fx_in,fx_r,x_r2=0;
> > float error=100;
> > int i=0;
> >
> > while ( error>=e_max){
> >
> > x_r= x_in+x_fin/2; //obtiene punto medio Xr
> > fx_in= f_(x_in); // obtien Y inicial y Y del pnt medio
> > fx_r = f_(x_r);
> > if (fx_in*fx_r<0) x_fin=x_r;
> > else if (fx_in*fx_r>0) x_in=x_r;
> > else if (fx_in*fx_r==0) break;
> > break;
> >
> 
> Aquí tienes un error. Estás diciendo al programa que salga de inmediato 
> de este bucle, nada más llegar a esta sentencia. Por lo tanto, el resto 
> de las sentencias (posteriores) en este bucle nunca serán ejecutadas.
> 
> > if (x_r2!=0)
> > error=(x_r2-x_r/x_r2)*100;
> > if (error<0) error= -1*error;
> > //if(error==0) error=100;
> > x_r2=x_r;
> > i++;
> > }
> > printf("\n =D");
> > printf("La raiz de la funcion es: %lf \n Iteracion necesarias %d\n",x_r,i);
> > printf("La funcion de la raiz es: %lf \n Error maximo resultante:
> > %lf\n",fx_r,error);
> > }
> > float f_ (double x){
> > double y;
> > y=-2.1+6.21*x-3.9*pow(x,2)+0.667*pow(x,3);
> > printf("\n -D");
> > return y;
> > }
> >
> > ------se supoen que los valores se manejaran como *_flotantes dobles. _*
> >
> > ...EL PROBLEMA ES QUE AL HACER LA PRIMER OPERACION x_r= x_in+x_fin/2;
> > NO DA EL RESULTADO DEBIDO Y POR SER x_r UN VALOR QUE SE USA MAS A
> > DELANTE TODO LO DEMAS SALE MAL......
> >
> > .....QUE PUEDE SER EL PROBLEMA???...EL TIPO DE DECLARACION?? ... COMO
> > SE LEEN LOS RESULTADOS??..COMO IMPRIMEN??
> >
> 
> Si el error anterior realmente era tipográfico, y por tanto en el 
> programa original, esa sentencia 'break' no existe, entonces seguramente 
> tiene que ver con la impresión de los números de coma flotante. Elige 
> una mejor precisión en la impresión, en 'printf()'. Por ejemplo,
> 
> printf( "La raiz de la funcion es: %.8lf \n Iteracion necesarias %d\n",
> x_r, i );
> printf( "La funcion de la raiz es: %.8lf \n Error maximo resultante: 
> %.8f\n", fx_r, error );
> 
> Si esto no funciona, entonces es posible que haya algo raro con tu 
> implementación del método numérico. No lo he mirado, pero puedo hacerlo 
> mirando en uno de mis libros, si es necesario.
> 
> 
> Espero que esto te ayude.
> 
> Steven
> 
> 
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
 		 	   		  
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100903/8191ba37/attachment-0001.html>


Más información sobre la lista de distribución Cconclase