How to declare a function

Hi! I'm new at C++ programming.
I'm trying to declare a new function in my program, but I can't solve it
Someone can give to me any advice?

* Sorry, i have a problem with my PC, and I lost one file of my code. Please wait until 14:00 PM, and I upload it. Thanks!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  // 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,
 const int 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
}


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

// FUNCION QUE IMPLEMENTA EL METODO DE NEWTON-RAPHSON SIN CONOCER LA FUNCION DERIVADA
int mn_newton_raphson (real (*f)(const real), real &root, const int 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);
}



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
// FUNCION QUE IMPLEMENTA EL METODO DE LA SECANTE
int mn_secante (real (*f)(const real), real &root_0, real &root_1,const int 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);
}


Last edited on
Possible answers:

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
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 x0 = 0.;
    real x1 = 0.5;

    for(int i = 0; i < NiterMax; i++){
        real f_x0 = cos(x0) - x0;
        cout<<(f_x0);
        real f_x1 = cos(x1) - x1;
        if(f_x1 == 0){
            cout << "La raiz es x1 =" << x1 << endl;
            return 0;
        }
        if(f_x0 == f_x1){
            cout << "No se puede continuar" << endl;
            return 0;
        }
        real x2 = x1 - f_x1*((x1-x0)/(f_x1-f_x0));
        if(fabs(x2-x1) <= fabs(x2)*TOL){
            cout << "La raiz es x2 =" << x2 << endl;
            return 0;
        }
        x0 = x1;
        x1 = x2;
    }
}


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
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;
  }
}


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
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 x0 = 0.;
  real f_x0 = cos(x0) - x0;
  for(int i = 0; i < NiterMax; i++){
        f_x0 = cos(x0) - x0;
        if(f_x0 == 0){
            cout << "La raiz es x0 =" << x0 << endl;
            return 0;
        }
        real f1_x0 = - sin(x0) - 1;
        if(f1_x0 == 0){
            cout << "no se pudo continuar" << endl;
            return 0;
        }
        real x1 = x0 - (f_x0/f1_x0);
        if(fabs(x1-x0)<= fabs(x1)*TOL){
            cout << "La raiz es x1 =" << x1 << endl;
            return 0;
        }
        x0 = x1;
  }

}
Topic archived. No new replies allowed.