Test Foro de elhacker.net SMF 2.1

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 (cpp) [Seleccionar]
#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.
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:

if((fxr==0)||(er<TOL)){
y ya la modifiqué por esta otra:

if((fabs(fxr)<1e-6)||(er<TOL)){

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