Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kiara_luna en 29 Septiembre 2011, 15:37 pm



Título: metodo de newton rapson para calcular las raices de una funcion con n grado
Publicado por: kiara_luna en 29 Septiembre 2011, 15:37 pm
hola estoy haciendo un programa en dev c++ para hallar las raices de una funcion con el metodo de newton rapson, ya la supe hallar para cuando es de grado 2 la funcion y me quedó asi:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <time.h>

double funcion (double x);
double derivadaf (double x);

main()
{
   int Nit, i;
   double cota,xi,xsol,error;

   printf("Metodo de Newton-Raphson\n");
   printf("Cota de error maxima: ");
   scanf ("%lf",&cota);
   printf ("Numero maximo de iteraciones: ");
   scanf ("%d",&Nit);
   printf ("Punto inicial: ");
   scanf ("%lf",&xi);

   i = 1; /* Contador de iteraciones */
   error = cota + 1 ; /* Para asegurar que error > cota al ppio */

   while (i<= Nit && error > cota)
   {
      /* Aplicamos formula Newton-Raphson */
      xsol = xi - funcion (xi) / derivadaf(xi);
      error = fabs (xsol-xi);
      i++;
      /* En la siguiente iteracion xsol es xi */
      xi = xsol;
   }

   printf ("La solucion es %lf\n", xsol);
   printf ("El valor de la funcion es %g\n",funcion(xsol));
   printf ("El error alcanzado es %g\n", error);
   if (i>=Nit)
      printf ("Se ha alcanzado el maximo n. de iteraciones\n");
   else
      printf ("El n. de iteraciones ha sido %d\n",i);
      getch();
}
double funcion(double x)
{
   double f;
   f = x*x + 2*x - 35;
   return (f);
}

double derivadaf(double x)
{
   double fp;
   fp = 2*x + 2;
   return (fp);

}
el problema es que como hago ahora para hacer este programa pero que me calcule cualquier funcion con grado n, intente hacerlo del siguiente modo con vectores, pero la verdad no se como poner el formato de la ecuacion ni la derivada?? alguien me puede guiar ayuda.

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <time.h>
//vetor grado 3   posiciones, grado 5 -5 posiciones

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <time.h>

double funcion (double x);
double derivadaf (double x);

main()
{
   int Nit, i;
   double cota,xi,xsol,error;

   printf("Metodo de Newton-Raphson\n");
   printf("Cota de error maxima: ");
   scanf ("%lf",&cota);
   printf ("Numero maximo de iteraciones: ");
   scanf ("%d",&Nit);
   printf ("Punto inicial: ");
   scanf ("%lf",&xi);

   i = 1; /* Contador de iteraciones */
   error = cota + 1 ; /* Para asegurar que error > cota al ppio */

   while (i<= Nit && error > cota)
   {
      /* Aplicamos formula Newton-Raphson */
      xsol = xi - funcion (xi) / derivadaf(xi);
      error = fabs (xsol-xi);
      i++;
      /* En la siguiente iteracion xsol es xi */
      xi = xsol;
   }

   printf ("La solucion es %lf\n", xsol);
   printf ("El valor de la funcion es %g\n",funcion(xsol));
   printf ("El error alcanzado es %g\n", error);
   if (i>=Nit)
      printf ("Se ha alcanzado el maximo n. de iteraciones\n");
   else
      printf ("El n. de iteraciones ha sido %d\n",i);
      getch();
}
double funcion(double x)
{
    int i=0, g=0;   
   double f, j[100], v=0;
   printf ("digite el grado de la ecuacion:  \n" );
    scanf("%d", &g );
    g++;
    for(i=0; i<=g; i++)
    {
      printf ("digite el valor de variable:  \n" ); 
      scanf("%f", &v);   
     j=j+v;
    }
     
   f =
   return (f);
   
}
double derivadaf(double x)
{
   double fp;
   fp =
   return (fp);

}


Título: Re: metodo de newton rapson para calcular las raices de una funcion con n grado
Publicado por: kiara_luna en 30 Septiembre 2011, 01:45 am
hola ya creo que tengo la solucion pero necesito que me ayuden pues me estan saliendo los siguientes errores: iostream.h: no such file or directory, este mismo error me sale en fstream.h y cmath, in funtion main, sintaxis error before "label1", label1 undeclared(first use in this funtion), me salen todos estos errores pero no he sido capaz de corregirlos lo estoy haciendo en dev c++ ayudenmen a corregirlos.
#include <iostream.h>
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <cmath>
 
/*void evaluapoli(int n, double *f, double x, double &p); //utilizada por newton_raphson.h
void derivapoli(int n, double *f, double *fd);
void newtonraphson(int n, double *f, double *fd, double &x, int &contador);*/
 
int main(){
   
 ifstream label1 ("datos//datos.in");
   
 int n;
 
 prinft("El grado del polinomio y sus coeficientes están en datos/datos.in\n\n");
   
 //Introduce el grado del polinomio

 label1 >> n;
 prinft("grado = ", n, "\n\n");
 
 double *f, *fd;
   
 f = new double [n+1];   // Arreglo para los coeficientes del polinomio
 
 fd = new double [n];    // Arreglo para los coeficientes de la derivada del polinomio
   
 // Se introducen desde datos.in y se imprimen en pantalla los coeficientes del polinomio
   
 prinft("Coeficientes del polinomio\n\n");
 
for (int i = n; i > -1; i--) {
    label1 >> f;
   
  //scanf("%d", f);
 
  prinft("F",  i, " = ", f, "\n");
   
    }
 
    prinft("\n");
 
 derivapoli (n, f, fd);  // función que determina la primera derivada y
         // se imprimen sus coeficientes
 
 prinft("Coeficientes del polinomio primera derivada\n\n");
 
 for (int i = n - 1; i > -1; i--) {
 
  prinft("Fd", i, " = ", fd, "\n");
 
 }
   
 prinft("\n");
 
 prinft("Introduzca el valor de inicio para la raiz: \n",  "X = ");
 
    double x;
   
    int contador = 0;
 // Se introduce el valor de x
   
    scanf("%d", &x);
 
    prinft("\n");
 
 // Implementación del método de Newton-Raphson
 
 newtonraphson (n, f, fd, x, contador);
 
    prinft("La raiz es x = ", x, " y se obtuvo en ", contador, " iteraciones\n");
   
    return 0;
   
   }
   
void evaluapoli(int n, double *f, double x, double &p){
   
 int i;
   
 double *a;
 
 a = new double [n];
 
 for (i = n; i > -1; i--) {  // Crea una copia de los elementos de f
                             // porque el ciclo for inferior los destruye
 
  a = f;                 
   
    }
   
 for (i = n; i > 0; i--) {
   
 p = a * x + a[i - 1];
 
  a[i - 1] = p;
 
 }
 
// P es el valor del polinomio en el punto x
 
   }
   
   void derivapoli(int n, double *f, double *fd){
   
    int i;
   
    for (i = n; i > 0; i--){
   
    fd[i-1] = i * f;
 
 }
   
   }
   void newtonraphson(int n, double *f, double *fd, double &x, int &contador){
 
    /* La función evaluapoli determina el valor del polinomio en el punto x.*/
   
    double p=0, y1, y2, verificador, z = 0;
 
    do {    evaluapoli (n, f, x, p);  // Determina el valor del polinomio en el punto
   
  y1 = p;
 
     evaluapoli (n-1, fd, x, p);  //Valor de la primera derivada en el punto
 
     y2 = p;
   
     x = x - y1/y2;
   
     verificador = fabs(x - z);
   
  z = x;
 
  contador += 1;
   
 } while (verificador > 1e-10);
 
}