• Domingo 15 de Diciembre de 2024, 11:43

Autor Tema:  Funcion de error, erf(X)  (Leído 2114 veces)

Lomko

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Funcion de error, erf(X)
« en: Jueves 29 de Julio de 2010, 09:02 »
0
Hola a todos,

soy un novato en la programación y es que no se como arreglar el problema que tengo.
Estoy programando en Visual Studio 2008 en c++. Quiero utilizar la función de error, erf(x) o erfc(x). He visto por la red que añadiendo el encabezado math.h (he probado poner #include "math.h" y #include <math.h>) el problema estaría solucionado ya que estaría ahí incluido. Me pasó lo mismo con anterioridad para el exponencial, exp(x), y el logaritmo, log(x). Pero resulta que ahora al utilizar erf(x) no funciona (y con el logaritmo y exponencial no tuve ningún problema). Al compilar me da el error C3861 y me dice que no se ha encontrado el identificador. ¿Puede alguien ayudarme en saber qué pasa y comó arreglarlo? #include "stdafx.h" también está incluido en el código.

gracias y un saludo

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Funcion de error, erf(X)
« Respuesta #1 en: Viernes 30 de Julio de 2010, 01:30 »
0
Visual Studio (incluyendo VS 2010) no soporta esas funciones. Como son parte del estándar C99 la palabra oficial de MS es que VS es un compilador de C++, no de C.  :bad:

En esta página puedes encontrar una implementación de erf() para C++:  http://www.johndcook.com/cpp_erf.html

Lo copio abajo, por si desaparece dicha página:
Código: C++
  1.  
  2. #include <cmath>
  3. #include <cstdio>
  4.  
  5. double erf(double x)
  6. {
  7.     // constants
  8.     double a1 =  0.254829592;
  9.     double a2 = -0.284496736;
  10.     double a3 =  1.421413741;
  11.     double a4 = -1.453152027;
  12.     double a5 =  1.061405429;
  13.     double p  =  0.3275911;
  14.  
  15.     // Save the sign of x
  16.     int sign = 1;
  17.     if (x < 0)
  18.         sign = -1;
  19.     x = fabs(x);
  20.  
  21.     // A&S formula 7.1.26
  22.     double t = 1.0/(1.0 + p*x);
  23.     double y = 1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x);
  24.  
  25.     return sign*y;
  26. }
  27.  
  28. void main()
  29. {
  30.     // Select a few input values
  31.     double x[] =
  32.     {
  33.         -3,
  34.         -1,
  35.         0.0,
  36.         0.5,
  37.         2.1
  38.     };
  39.  
  40.     // Output computed by Mathematica
  41.     // y = Erf[x]
  42.     double y[] =
  43.     {
  44.         -0.999977909503,
  45.         -0.842700792950,
  46.         0.0,
  47.         0.520499877813,
  48.         0.997020533344
  49.     };
  50.  
  51.     int numTests = sizeof(x)/sizeof(double);
  52.  
  53.     double maxError = 0.0;
  54.     for (int i = 0; i < numTests; ++i)
  55.     {
  56.         double error = fabs(y[i] - erf(x[i]));
  57.         if (error > maxError)
  58.             maxError = error;
  59.     }
  60.  
  61.     printf("Maximum error: %fn", maxError);
  62. }    
  63.  
  64.  

Lomko

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Funcion de error, erf(X)
« Respuesta #2 en: Lunes 2 de Agosto de 2010, 11:57 »
0
Gracias Amilius, pero como ya dije, soy un novato muy novato.

Lo que entiendo de este código es que al principio define la función de error. Luego con el "void main" empieza lo que sería un programilla en el que introduce un array de valores para que le resuelva en otro array de respuestas, no? Pero como tendría que hacer para darle yo x=2 y que me saque a ser posible en la ventanita negra (de MSdos?¿?) su valor de la función de error? He estado jugando un poco y sí, añadiendo al final getchar(); me saca el error del cálculo (o eso entiendo que hace). Pero yo quiero el valor de la función de error, asike tras jugar, no he llegado a nada sustancial. Agradecería toda ayuda en este sentido, gracias.

Un saludo

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Funcion de error, erf(X)
« Respuesta #3 en: Lunes 2 de Agosto de 2010, 22:10 »
0
Bueno eso es bastante básico, en lugar del anterior main, tendrías que usar uno como este:

Código: C++
  1.  
  2. void main()
  3. {
  4.     double x = 2.0;
  5.     printf("erf(%f) = %fn", x, erf(x));
  6. }
  7.  
  8.  

Sería mejor si buscas un tutorial para que vayas aprendiendo a usar estos aspectos básicos paso a paso.