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

newton rapson no entra al if

Estas en el tema de newton rapson no entra al if en el foro de C/C++ en Foros del Web. Pues tengo este prog que ise pero parece ser que jamas entra al if ya verifique que en menos de 100 iteraciones deberia segun yo ...
  #1 (permalink)  
Antiguo 08/10/2014, 17:07
 
Fecha de Ingreso: octubre-2014
Mensajes: 1
Antigüedad: 9 años, 6 meses
Puntos: 0
newton rapson no entra al if

Pues tengo este prog que ise
pero parece ser que jamas entra al if
ya verifique que en menos de 100 iteraciones deberia segun yo entrar al if
que hice mal?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int i, n;
float x, error, f, f2, xi;
main(){

printf("Introduzca x0\n");
scanf("%f", &x);
printf("introduzca no de iteracionez\n");
scanf("%d", &i);
printf("El Error debe ser de ");
scanf("%f",&error);

for(n=1; n<=i; n++)
{

f=4*x*x+(4/x)+3*exp(2*x)+ 5.222;
f2=(-4/x*x)+8*x+8*exp(2*x);

xi=x-(f/f2);

printf("\nIteracion y x actual= %d %f \n",n,xi);

if(fabs(xi-x) < error)
{
printf("\nLa raiz es: %f \n",xi);
goto fin;
}
x=xi;
}
fin:
return 0;
}

salu2
  #2 (permalink)  
Antiguo 09/10/2014, 01:17
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: newton rapson no entra al if

Así a bote pronto veo los siguientes errores:

* f2=(-4/x*x) ... "-4" y "x" son enteros, luego la división se va a calcular entre enteros y después ya tocará convertirla a float... pero habrás perdido los decimales.

* (-4/x*x)... esta ecuación es equivalente a (-4/x)*x... es decir -4. El operador de división tiene la misma prioridad que el de multiplicación. Ten cuidado con eso.

* f2=(-4/x*x)+8*x+8*exp(2*x)... el tercer término está mal. La derivada de 3e^(2x) es 2*3e^(2x) = 6e^(2x)

Y ahora las recomendaciones:

* goto fin: procura evitar salvo causas de fuerza mayor el uso de goto. No es necesario salvo para optimización y sólo en momentos muy puntuales. Si te ves obligado a usar un goto es que tu código no está bien escrito.

* variables globales: evita su uso. No son fáciles de usar ni de depurar. Es preferible que tengas funciones con parámetros a usar variables globales.

* Precisión: puedes mejorar la precisión del algoritmo si usas "double" en vez de "float".

Código C++:
Ver original
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. int main()
  6. {
  7.   int i, n;
  8.   double x, error, f, f2, xi;
  9.  
  10.   printf("Introduzca x0: ");
  11.   scanf("%lf", &x);
  12.   printf("introduzca no de iteraciones: ");
  13.   scanf("%d", &i);
  14.   printf("El Error debe ser de: ");
  15.   scanf("%lf", &error);
  16.  
  17.   printf( "\n" );
  18.   for(n=1; n<=i; n++)
  19.   {
  20.  
  21.     f  = 4.0*x*x + (4.0/x)   + 3.0*exp(2.0*x) + 5.222;
  22.     f2 = 8.0*x   - 4.0/(x*x) + 6.0*exp(2.0*x);
  23.  
  24.     xi = x - (f/f2);
  25.  
  26.     printf("Iteracion actual= %d %lf %lf\n",n,x,xi);
  27.  
  28.     if(fabs(xi-x) < error)
  29.       break;
  30.  
  31.     x=xi;
  32.   }
  33.  
  34.   printf("\nLa raiz es: %lf \n", xi);
  35.   return 0;
  36. }
  #3 (permalink)  
Antiguo 09/10/2014, 01:30
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: newton rapson no entra al if

1. Comprueba primero que el algoritmo de cálculo está bien implementado.
2. El método de Newton-Raphson puede ser divergente en algunos casos, por ejemplo si hay puntos de inflexión o pendientes grandes en el entorno de la raíz.

Y, sobre todo, has expresado mal la derivada de f = 4*x*x+(4/x)+3*exp(2*x)+ 5.222

Derivada Antes: f2 = (-4/x*x) + 8*x + 8*exp(2*x)
Derivada Ahora: f2 = -4/(x*x) + 8*x + 6*exp(2*x)

Prueba ahora.

Edito: Veo que entró la respuesta de Eferion mientras yo escribía la mía (lo mismo, mas alguna recomendación adicional).

Saludos,

Etiquetas: entra, int
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 02:28.