Título: Funcion exponencial con desarrollo de Taylor C++
Publicado por: ElFontaneroGRNA en 19 Noviembre 2016, 23:11 pm
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) #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
Título: Re: Funcion exponencial con desarrollo de Taylor C++
Publicado por: aurquiel en 20 Noviembre 2016, 00:41 am
Hola para la exponencial porque mejor no usas pow(a,b)= a^b deberías incluir cmath #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; } }
Título: Re: Funcion exponencial con desarrollo de Taylor C++
Publicado por: engel lex en 20 Noviembre 2016, 01:45 am
Aquí un tema sobre las series de taylir que escribí hace algún tiempo , espero sea útil
https://foro.elhacker.net/programacion_cc/calculando_funciones_trigonometricas_sin_librerias_series_de_taylor_aporte-t443463.0.html (https://foro.elhacker.net/programacion_cc/calculando_funciones_trigonometricas_sin_librerias_series_de_taylor_aporte-t443463.0.html)
Título: Re: Funcion exponencial con desarrollo de Taylor C++
Publicado por: ElFontaneroGRNA en 20 Noviembre 2016, 12:21 pm
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 : 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: #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?
Título: Re: Funcion exponencial con desarrollo de Taylor C++
Publicado por: ivancea96 en 20 Noviembre 2016, 13:12 pm
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
Título: Re: Funcion exponencial con desarrollo de Taylor C++
Publicado por: ElFontaneroGRNA en 20 Noviembre 2016, 16:45 pm
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 ;-) :-*: #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; }
|