Error al dar valor mayor de 1 en el programa

Iniciado por Antoniio, 13 Septiembre 2015, 22:10 PM

0 Miembros y 1 Visitante están viendo este tema.

Antoniio

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

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.

engel lex

intentaste hacer un debug del programa para ver linea a linea que pasa y si se comporta como esperas?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Antoniio

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

engel lex

cuando hiciste el debug, calculaste en que linea el calculo matemático deja de ser correcto?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Antoniio

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.