Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Antoniio en 13 Septiembre 2015, 22:10 pm



Título: Error al dar valor mayor de 1 en el programa
Publicado por: Antoniio en 13 Septiembre 2015, 22:10 pm
Hola, hace poco coloqué una duda sobre el método de Bisección, ahora tengo uno parecido, el de "Regla Falsa":
http://esimecu-anumerico.blogspot.mx/2011/06/metodo-de-la-regla-falsa.html (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
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. double eval_funcion(double);
  8.  
  9. int main(){
  10. float TOL, xi, xs, xr, xra;
  11. float fxi , fxs, fxr;
  12. float validador, exr, er;
  13. float A, B, C, D;
  14. int N, i;
  15.  
  16. cout<< "Ingrese el extremo inferior (Xi) : " << endl;
  17. cin >> xi;
  18. cout << "Ingrese el extremo superior (Xs) : " << endl;
  19. cin >> xs;
  20. cout << "Ingrese la tolerancia : " << endl;
  21. cin >> TOL;
  22. cout << "Ingrese el n\xA3mero de iteraciones : " << endl;
  23. cin >> N;
  24.  
  25. fxi=eval_funcion(xi);
  26. fxs=eval_funcion(xs);
  27. A = xi - xs;
  28. B = fxs * A;
  29. C = fxi - fxs;
  30. D = B/C;  
  31.  
  32. xr = xs - D;  
  33. cout<<"\nAproximaci\xA2n de la ra\xA1z buscada: " << xr;    fxr = eval_funcion(xr);
  34.  
  35. cout<<"\n"<<"n"<<"\t"<<"Ra\xA1z"<<"\t\t"<<"f(ra\xA1z)"<<"\t\t\t"<<"Error";
  36.  
  37. while(i <= N)
  38. {
  39.  xra = xr;
  40.  validador = fxi * fxr;
  41.  
  42.  if(validador < 0) {  
  43.   xs=xr;    
  44.  }
  45.  else{
  46.    xi=xr;  
  47.  }
  48.  
  49.  fxi=eval_funcion(xi);
  50.  fxs=eval_funcion(xs);
  51.  A = xi - xs;
  52.  B = fxs * A;
  53.  C = fxi - fxs;
  54.  D = B/C;
  55.  xr = xs - D;
  56.  fxr=eval_funcion(xr);    
  57.  
  58.  //error relativo
  59.  exr = xr - xra;  
  60.  er = exr/xr;
  61.  if(er<0){
  62.     er=er*(-1);
  63.  }
  64.  
  65.  //resultados iteracion a iteracion
  66.  cout<<"\n"<<i<<"\t"<<xr<<"\t\t"<<fxr<<"\t\t"<<er;
  67.  
  68.  if((fxr==0)||(er<TOL)){
  69.   cout<<"\nEl proceso se realiz\xA2 de manera correta.";
  70.  system("pause"); exit(1);
  71.  }
  72.  
  73.  i++;
  74. }
  75.  
  76. if((i>N)&&(er>TOL)) {
  77.   cout<<"\nEl m\x82todo fracas\xA2 despu\x82s de "<< N <<" iteraciones\n";
  78. }
  79.   system("pause");    
  80. }
  81. /******************************************************************************/
  82.  
  83. double eval_funcion(double v)
  84. {
  85. double r , ee, emx, logx;
  86. ee = pow(2.718281828,v); emx = 1/ee;
  87. logx = log(v);
  88.  
  89. r = emx - logx;
  90. return r;    
  91. }
  92.  

Por qué sólo funciona dando el valor de 1 en xi?, gracias de antemano.


Título: Re: Error al dar valor mayor de 1 en el programa
Publicado por: engel lex en 14 Septiembre 2015, 05:25 am
intentaste hacer un debug del programa para ver linea a linea que pasa y si se comporta como esperas?


Título: Re: Error al dar valor mayor de 1 en el programa
Publicado por: Antoniio en 14 Septiembre 2015, 06:40 am
Sí, lo hice pero no logro captar ningún error, no entiendo por qué no funciona el programa, debería funcionar perfecto así como está :s


Título: Re: Error al dar valor mayor de 1 en el programa
Publicado por: engel lex en 14 Septiembre 2015, 15:28 pm
cuando hiciste el debug, calculaste en que linea el calculo matemático deja de ser correcto?


Título: Re: Error al dar valor mayor de 1 en el programa
Publicado por: Antoniio en 15 Septiembre 2015, 05:46 am
Pues, tal parece que el error se encontraba en esta línea:

Código:
if((fxr==0)||(er<TOL)){

y ya la modifiqué por esta otra:

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

Pero sigo sin poder solucionarlo, creo que así lo dejaré, igual y debo comenzar todo desde 0.