Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error al dar valor mayor de 1 en el programa

Estas en el tema de Error al dar valor mayor de 1 en el programa en el foro de C/C++ en Foros del Web. Hola, tengo un código del Método de la "Regla Falsa": http://esimecu-anumerico.blogspot.mx/2011/06/metodo-de-la-regla-falsa.html El problema es que al momento de dar un valor mayor a 1 en ...
  #1 (permalink)  
Antiguo 13/09/2015, 16:45
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 11 meses
Puntos: 0
Error al dar valor mayor de 1 en el programa

Hola, tengo un código del Método de la "Regla Falsa": http://esimecu-anumerico.blogspot.mx/2011/06/metodo-de-la-regla-falsa.html

El problema es que al momento de dar un valor mayor a 1 en el extremo inferior (xi) me marca error para cualquier número de iteraciones, este es el código:

Código:
#include <iostream>

#include <stdlib.h>

#include <math.h>

 

using namespace std;

 

double eval_funcion(double);

 

int main(){

 float TOL, xi, xs, xr, xra;

 float fxi , fxs, fxr;

 float validador, exr, er;

 float A, B, C, D;

 int N, i;

 

 cout<< "Ingrese el extremo inferior (Xi) : " << endl;

 cin >> xi;

 cout << "Ingrese el extremo superior (Xs) : " << endl;

 cin >> xs;

 cout << "Ingrese la tolerancia : " << endl;

 cin >> TOL;

 cout << "Ingrese el n\xA3mero de iteraciones : " << endl;

 cin >> N;

 

 fxi=eval_funcion(xi);

 fxs=eval_funcion(xs);

 A = xi - xs;

 B = fxs * A;

 C = fxi - fxs;

 D = B/C;

 

 xr = xs - D;

 cout<<"\nAproximaci\xA2n de la ra\xA1z buscada: " << xr;    fxr = eval_funcion(xr);

 

 cout<<"\n"<<"n"<<"\t"<<"Ra\xA1z"<<"\t\t"<<"f(ra\xA1z)"<<"\t\t\t"<<"Error";

 

 while(i <= N)

 {

  xra = xr;

  validador = fxi * fxr;

 

  if(validador < 0) {

  	 xs=xr;

  }

  else{

    xi=xr;

  }

 

  fxi=eval_funcion(xi);

  fxs=eval_funcion(xs);

  A = xi - xs;

  B = fxs * A;

  C = fxi - fxs;

  D = B/C;

  xr = xs - D;

  fxr=eval_funcion(xr);

 

  //error relativo

  exr = xr - xra;

  er = exr/xr;

  if(er<0){

     er=er*(-1);

  }

 

  //resultados iteracion a iteracion

  cout<<"\n"<<i<<"\t"<<xr<<"\t\t"<<fxr<<"\t\t"<<er;

 

  if((fxr==0)||(er<TOL)){

  	cout<<"\nEl proceso se realiz\xA2 de manera correta.";

	  system("pause"); exit(1);

  }

 

  i++;

 }

 

 if((i>N)&&(er>TOL)) {

   cout<<"\nEl m\x82todo fracas\xA2 despu\x82s de "<< N <<" iteraciones\n";

 }

   system("pause");

}

/******************************************************************************/

 

double eval_funcion(double v)

{

 double r , ee, emx, logx;

 ee = pow(2.718281828,v); emx = 1/ee;

 logx = log(v);

 

 r = emx - logx;

 return r;

}
Por qué sólo funciona dando el valor de 1 en xi?, gracias de antemano.
  #2 (permalink)  
Antiguo 13/09/2015, 23:14
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Error al dar valor mayor de 1 en el programa

En que parte de tu programa has dado valor a i de esta linea: while(i <= N) ?. Puede contener cualquier valor.
  #3 (permalink)  
Antiguo 13/09/2015, 23:58
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error al dar valor mayor de 1 en el programa

Tienes razón, olvidé colocarlo aquí pero ya le he dado valor y aún así el problema sigue siendo el mismo :s
  #4 (permalink)  
Antiguo 14/09/2015, 03:28
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al dar valor mayor de 1 en el programa

Tu problema es, básicamente, que no has tenido en cuenta que al trabajar con float o con double no puedes realizar comparaciones de igualdad directamente (a==b). La razón (si has visto como se almacenan los números en coma flotante en el ordenador y las características de de los mismos lo entenderás) es que estas representaciones no son exactas, sino que tienen una precisión determinada (unos 6 dígitos para el caso del float). Los dígitos que no pertenecen a dicha precisión no puedes tenerlos en cuenta... y en una comparación a==b se acaban teniendo en cuenta.

En resumen, dado que a==b no se puede usar la opción es restar ambos números y verificar que el resultado se encuentra dentro de un rango determinado... algo tal que fabs(a-b)<rango. En tu caso, estás comprobando si el valor es 0... no hay problema, con algo así lo puedes comprobar: fabs(a)<rango.

¿Y esto dónde te está dando problemas? En la siguiente línea:

Código C++:
Ver original
  1. if((fxr==0)||(er<TOL)){

Que más bien debería parecerse a esta otra:

Código C++:
Ver original
  1. if((fabs(fxr)<1e-6)||(er<TOL)){

Ahora bien, también he visto otros problemillas. No van a provocar que tu problema falle... pero son cosas que se pueden mejorar para evitar errores tontos. Ya es cosa tuya corregirlos o no.

1. Si en el main trabajas con float... por qué eval_funcion trabaja con double?

Deberias homogeneizar el código. Tener diferentes precisiones obliga a realizar conversiones en los números que, en tu caso, son totalmente innecesarias.

2. Al número 2.71828... se conoce como número e. C y C++ no son ajenos a este número en particular y han previsto una función específica para calcular sus potencias. Es decir, que esto:

Código C++:
Ver original
  1. double ee = pow(2.718281828,v):

es equivalente a:

Código C++:
Ver original
  1. double ee = e(v);

Con la ventaja de que es más dificil que metas la pata al introducir la constante con los decimales... e incluso puede que la función especializada sea más rápida y precisa.

Un saludo
  #5 (permalink)  
Antiguo 14/09/2015, 11:19
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error al dar valor mayor de 1 en el programa

Vaya, ya veo..gracias por comentarme eso, lo tendré en cuenta. A pesar de haber corregido ese problema sigue pasando el mismo error, entonces ese no era el problema :s
  #6 (permalink)  
Antiguo 14/09/2015, 23:43
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al dar valor mayor de 1 en el programa

te importa poner el código de tu programa actualizado? lo siento pero a mí me funciona perfectamente aplicando los cambios que te hemos indicado tanto vangodp como yo.
  #7 (permalink)  
Antiguo 15/09/2015, 12:23
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error al dar valor mayor de 1 en el programa

Claro, así es como lo tengo actualmente:
Código:
#include <iostream>
#include <stdlib.h>
#include <math.h>

using namespace std;

double eval_funcion(double);

int main(){
 double TOL, xi, xs, xr, xra;
 double fxi , fxs, fxr; 
 double validador, exr, er;
 double A, B, C, D;
 int N, i=0;
 
 cout<< "Ingrese el extremo inferior (Xi) : " << endl;
 cin >> xi; 
 cout << "Ingrese el extremo superior (Xs) : " << endl;
 cin >> xs; 
 cout << "Ingrese la tolerancia : " << endl;
 cin >> TOL; 
 cout << "Ingrese el n\xA3mero de iteraciones : " << endl;
 cin >> N; 

 fxi=eval_funcion(xi); 
 fxs=eval_funcion(xs);
 A = xi - xs;
 B = fxs * A;
 C = fxi - fxs;
 D = B/C;   

 xr = xs - D;   
 cout<<"\nAproximaci\xA2n de la ra\xA1z buscada: " << xr;    fxr = eval_funcion(xr);
 
 cout<<"\n"<<"n"<<"\t"<<"Ra\xA1z"<<"\t\t"<<"f(ra\xA1z)"<<"\t\t\t"<<"Error";

 while(i <= N)
 {
  xra = xr; 
  validador = fxi * fxr;
  
  if(validador < 0) {   
  	 xs=xr;    
  }
  else{
    xi=xr;   
  } 

  fxi=eval_funcion(xi); 
  fxs=eval_funcion(xs);
  A = xi - xs;
  B = fxs * A;
  C = fxi - fxs;
  D = B/C;
  xr = xs - D;
  fxr=eval_funcion(xr);    

  //error relativo
  exr = xr - xra;  
  er = exr/xr; 
  if(er<0){
     er=er*(-1);
  }

  //resultados iteración a iteración
  cout<<"\n"<<i<<"\t"<<xr<<"\t\t"<<fxr<<"\t\t"<<er;

  if((fabs(fxr)<1e-6)||(er<TOL)){
  	cout<<"\nEl proceso se realiz\xA2 de manera correta." << endl;
	  system("pause"); exit(1);
  }
  
  i++;
 } 
 
 if((i>N)&&(er>TOL)) {
   cout<<"\nEl m\x82todo fracas\xA2 despu\x82s de "<< N <<" iteraciones\n" << endl;
 }
   system("pause");     
}
/******************************************************************************/

double eval_funcion(double v)
{
 double r , ee, emx, logx;
 ee = pow(2.718281828,v); emx = 1/ee;
 logx = log(v);
 
 r = emx - logx; 
 return r;    
}
  #8 (permalink)  
Antiguo 16/09/2015, 02:59
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al dar valor mayor de 1 en el programa

Solo he cambiado una cosita... la tolerancia de 1e-6 la he bajado a 1e-4 y...

Código consola:
Ver original
  1. Ingrese el extremo inferior (Xi) :
  2. 1
  3. Ingrese el extremo superior (Xs) :
  4. 2
  5. Ingrese la tolerancia :
  6. 0.01
  7. Ingrese el número de iteraciones :
  8. 10
  9.  
  10. Aproximación de la raíz buscada: 1.39741
  11. n       Raíz            f(raíz)                 Error
  12. 0       1.32113         -0.0116543              0.0577384
  13. 1       1.31127         -0.00151807             0.00752016
  14. El proceso se realizó de manera correta.
  15. Presione una tecla para continuar . . .
  #9 (permalink)  
Antiguo 16/09/2015, 11:34
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Error al dar valor mayor de 1 en el programa

Sí, me funciona perfecto ya a mi también, gracias por el apoyo!!

Etiquetas: funcion, int, mayor, programa, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:14.