Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/10/2014, 01:17
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 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. }