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

Steven Davidson srd4121 en njit.edu
Vie Sep 3 07:02:04 CEST 2010


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





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