1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
//Newton-Rapshon, cálculo de 0s
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "an_calculo_ceros.h"
// FUNCION QUE IMPLEMENTA EL METODO DE NEWTON-RAPHSON CONOCIENDO LA FUNCION DERIVADA
int an_newton_raphson (real (*f)(const real), real (*f_1)(const real), real &root, const int Nmax, const real TOL)
{
real f_root=(*f)(root); // evaluacion de la funcion
for(int i=0;i<Nmax;i++){
if(an_distancia(f_root,0.)<TOL){return(i);} // test de salida por el valor de la funcion
real derivada=(*f_1)(root); // calculo de la derivada
//printf("root=%e derivada=%e\n",(double) root, (double) derivada);
if(derivada==0.) return(-1); // test de salida por el valor de la derivada
real root2=root-f_root/derivada; // calculo nuevo valor raiz
f_root=(*f)(root2); // calculo de la función en el nuevo valor
if(an_distancia(root2,root)<TOL){ // test de salida por proximidad de raices
root=root2;
return(i);
}
root=root2; // actualizacion raiz
}
return(-2); // salida si se ha superado el numero de iteraciones maximo
}
// FUNCION QUE IMPLEMENTA EL METODO DE NEWTON-RAPHSON SIN CONOCER LA FUNCION DERIVADA
int an_newton_raphson (real (*f)(const real), real &root, const int Nmax, const real TOL)
{
real h=(double) sqrtl((long double) an_precision_aritmetica());
real f_root=(*f)(root);
for(int i=0;i<Nmax;i++){
if(an_distancia(f_root,0.)<TOL){return(i);}
real derivada=((*f)(root*(1+h)+h)-f_root)/(root*h+h);
//printf("root=%e derivada=%e\n",(double) root, (double) derivada);
if(derivada==0.) return(-1);
real root2=root-f_root/derivada;
f_root=(*f)(root2);
if(an_distancia(root2,root)<TOL){
root=root2;
return(i);
}
root=root2;
}
return(-2);
}
// FUNCION QUE IMPLEMENTA EL METODO DE LA SECANTE
int an_secante (real (*f)(const real), real &root_0, real &root_1,const int Nmax, const real TOL)
{
real f_root_0=(*f)(root_0);
real f_root_1=(*f)(root_1);
for(int i=0;i<Nmax;i++){
if(an_distancia(f_root_1,0.)<TOL){return(i);}
real h=root_1-root_0;
if(h==0.) return(-1);
real derivada=(f_root_1-f_root_0)/h;
//printf("root_1=%e derivada=%e\n",(double) root_1, (double) derivada);
if(derivada==0.) return(-2);
real root_2=root_1-f_root_1/derivada;
f_root_0=f_root_1;
f_root_1=(*f)(root_2);
if(an_distancia(root_1,root_2)<TOL){
root_0=root_1;
root_1=root_2;
return(i);
}
root_0=root_1;
root_1=root_2;
}
return(-3);
}
|