Funcion exponencial con desarrollo de Taylor C++

Iniciado por ElFontaneroGRNA, 19 Noviembre 2016, 23:11 PM

0 Miembros y 1 Visitante están viendo este tema.

ElFontaneroGRNA

Buenas noches a todos, estoy intentando calcular la funcion exponencial a través del desarrollo de Taylor en c++ y los valores que me dan no son los correctos. He estado repasando mucho rato y sigue sin funcionar.
Si podéis echarle un ojo al siguiente código y ayudarme os lo agradecería mucho. (El codigo no está muy claro xD).

Gracias. (PD: Estoy en 1ero de fisica y llevo poco tiempo programando)
Código (cpp) [Seleccionar]

#include <iostream>
#include <cstdlib>
using namespace std;
double funcionexp (double x, int n);
double potencia (double x, int n);
double factorial (int n);

int main (void)
{
   int n;
   double x, expo;
   cout<<"Introduce dos valores, el primero sera el valor de x de la funcion exponencial\n";
   cin>>x;
   cout<<"\n Y el segundo el numero de terminos que se consideraran en la serie de Taylor: "<<endl;
   cin>>n;
   cout<<endl<<endl;
   expo=funcionexp(x,n);
   cout<<expo;
   system("PAUSE");
   return 0;
}


double potencia (double x, int n)
{
   int h;
   double pote=1.0;
   for (h=1;h<=n;h++) pote*=x;
   return pote;
}
double factorial ( int n)
{
   int k;
   double fact=1.0;
   for (k=1;k<=n;k++)
   {
       fact*=k;
   }
   return fact;
}
double funcionexp (double x, int n)
{
   int z;
   double exp, sii;
   exp=0.0;
   sii=0.0;
   for (z=0;z<=n;z++)
   {
       exp=(potencia(x,n))/(factorial(n));
       sii+=exp;
   }
   return sii;
}



Mod: los códigos deben ir en geshi

aurquiel

#1
Hola para la exponencial

porque mejor no usas pow(a,b)= a^b deberías incluir cmath

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>

using namespace std;

double exponencial(double,unsigned long int); //cabecera de la funcion exponencial
int factorial(unsigned long int); //cabezera de la funcion factorial


int main()
{
    unsigned long int n=0; //nuemro n de la serie
    double x=0; //valor de x

    cout<<"Ingrese n=";
    cin>>n;
    cout<<"Ingrese x=";
    cin>>x;

    cout<<"Resultado es= "<<exponencial(x,n)<<endl;
}

double exponencial(double x,unsigned long int n)
{
    double resultado=0; //varibale para devolver
    for (unsigned int i=0;i<=n;i++) //desde n=0 hasta donde llegue la serie
    {
        resultado+=pow(x,i)/factorial(i);   //uso de la función pow de la libreia cmath se saca esa potencia y con la función factorial se obtiene ese denominador con ese valor de n
    }
    return resultado; //devuelvo valor
}

int factorial(unsigned long int i)
{
    unsigned int resultado=1; //valor inicial 1
    if (i==0)  //si es cero se devuelve factoril 1
    {
        return resultado;
    }else     //sino se scaa el factorial
    {
        while(i>1)
        {
            resultado=resultado*i;
            i--;
        }

    return resultado;

    }
}



engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

ElFontaneroGRNA

#3
Hola muchas gracias a los dos,

Aurquiel sé que podía hacerlo con la función pow de la biblioteca cmath, pero como el ejercicio no especificaba si se podian usar funciones predefinidas pues creé la mía. Pero de todas formas las dos funcionan más o menos igual xD.

engel lex, ya ví el artículo ese antes de crear mi tema, por si me podía ayudar, y entendía todo lo que hacías, lo que no entendía era por qué a mí no me funcionaba mi programa.

Ya he encontrado mi fallo, estaba en la funcion exponencial, dentro del for :
Código (cpp) [Seleccionar]
       exp=(potencia(x,n))/(factorial(n)); ahí en las n, abría que poner z, como es lógico...

El código bien hecho quedaría así, para quien le haga falta:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
using namespace std;
double funcionexp (double x,int n);
double potencia (double x, int n);
double factorial (int n);

int main (void)
{
   int n;
   double x, expo;
   cout<<"Introduce dos valores, el primero sera el valor de x de la funcion exponencial:\n";
   cin>>x;
   cout<<"\nY el segundo el numero de terminos que se consideraran en la serie de Taylor: "<<endl;
   cin>>n;
   cout<<endl<<endl;
   expo=funcionexp(x,n);
   cout<<"El valor de la funcion exponencial con x="<<x<<" y numero de terminos de la serie de Taylor, n="<<n<<" es: "<<expo<<endl;
   system("PAUSE");
   return 0;
}


double potencia (double x, int n)
{
   int h;
   double pote=1.0;
   for (h=1;h<=n;h++) pote*=x;
   return pote;
}
double factorial ( int n)
{
   int k;
   double fact=1.0;
   for (k=1;k<=n;k++)
   {
       fact*=k;
   }
   return fact;
}
double funcionexp (double x,  int n)
{
   int z;
   double exp, sii;
   exp=0.0;
   sii=0.0;
   for (z=0;z<=n;z++)
   {
       exp=(potencia(x,z))/(factorial(z)); //Aquí estaba el fallo.
       sii+=exp;
   }
   return sii;
}

Otra cosa, ¿sería mejor definir las variables como long o long long?

ivancea96

En muchos compiladores, long es igual a int, así que yo te diría long long.
De todos modos, los valores grandes ya los tienes almacenados en double, así que... No creo que quieras un n = 4e+9 :o

ElFontaneroGRNA

Gracias ivancea96, es que no suelo utilizar nunca los long, long long, casi tampoco signed, unsigned, asi que no tengo mucho manejo con ellos.

Me acabo de dar cuenta que el ejercicio no estaba acabado, ya que para valores negativos no funciona xDD.
Este creo que ya es el codigo definitivo  ;-) :-*:

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
using namespace std;
double funcionexp ( double x, int n);
double potencia ( double x, int n);
double factorial (int n);

int main (void)
{                        //exponega=(1/(funcionexp(x,n)));
    int n;
    double x, expo;
    expo=0.0;
    cout<<"Introduce dos valores, el primero sera el valor de x de la funcion exponencial:\n";
    cin>>x;
    cout<<"\nY el segundo el numero de terminos que se consideraran en la serie de Taylor: "<<endl;
    cin>>n;
    cout<<endl<<endl;
    if (x<=0) expo=(1/(funcionexp(x,n)));   //Lo añadido
    else expo=(funcionexp(x,n));                //Lo añadido
    cout<<"El valor de la funcion exponencial con x="<<x<<" y numero de terminos de la serie de Taylor, n="<<n<<" es: "<<expo<<endl;
    system("PAUSE");
    return 0;
}


double potencia ( double x, int n)
{
    if (x<=0) x=-x; //Lo añadido
    int h;
    double pote=1.0;
    for (h=1;h<=n;h++) pote*=x;
    return pote;
}
double factorial ( int n)
{
    int k;
    double fact=1.0;
    for (k=1;k<=n;k++)
    {
        fact*=k;
    }
    return fact;
}
double funcionexp ( double x,  int n)
{
    int z;
    double exp, sii;
    exp=0.0;
    sii=0.0;
    for (z=0;z<=n;z++)
    {
        exp=(potencia(x,z))/(factorial(z));
        sii+=exp;
    }
    return sii;
}