// FUNCION QUE IMPLEMENTA EL METODO DE NEWTON-RAPHSON CONOCIENDO LA FUNCION DERIVADA
int mn_newton_raphson (real (*f)(const real), real (*f_1)(const real), real &root,
constint Nmax, const real TOL)
{
// HACER ALUMNO
real f_root=(*f)(root); // evaluacion de la funcion
for(int i=0;i<Nmax;i++){
if(f_root==0.){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(mn_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 mn_newton_raphson (real (*f)(const real), real &root, constint Nmax, const real TOL)
{
real h=1e-6*mn_abs(root)+1e-20;
// HACER ALUMNO
real f_root=(*f)(root);
for(int i=0;i<Nmax;i++){
if(f_root==0.){return(i);}
real derivada=((*f)(root+h)-f_root)/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(mn_distancia(root2,root)<TOL){
root=root2;
return(i);
}
root=root2;
}
return(-2);
}
// FUNCION QUE IMPLEMENTA EL METODO DE LA SECANTE
int mn_secante (real (*f)(const real), real &root_0, real &root_1,constint Nmax, const real TOL)
{
// HACER ALUMNO
real f_root_0=(*f)(root_0);
real f_root_1=(*f)(root_1);
for(int i=0;i<Nmax;i++){
if(f_root_1==0.){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(mn_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);
}
int main()
{
int NiterMax=10000; // numero iteraciones máximo
real TOL=1e-12; // Tolerancia para detener las iteraciones
cout.precision(9); // precision para imprimir las variables usando cout
real a = 0.;
real b = 1.;
real f_a = cos(a) - a;
real f_b = cos(b) - b;
real x = ((b-a)/(f_b-f_a))*f_a;
real f_x = cos(x) - x;
for(int i = 0; i < NiterMax; i++){
f_x = cos(x) - x;
f_a = cos(a) - a;
f_b = cos(b) - b;
if(f_x == 0){
cout << "la raiz es x =" << x << endl;
return 0;
}
if(f_a*f_x < 0){
b = x;
} else {
a = x;
}
real xnew = a -((b-a)/(f_b-f_a))*f_a;
real f_xnew = cos(xnew) - xnew;
if(fabs(xnew-x)<=fabs(xnew)*TOL){
cout << "la raiz es xnew =" << xnew << endl;
return 0;
}
x = xnew;
}
}