Título: [C++] Series de Taylor: sen(x) Publicado por: Zeta255 en 23 Marzo 2021, 19:07 pm Hola tengo una duda, me pide hacer una funcion de sen con sumatoria, para eso ingresare un valor x y me dara el valor con sumatoria pero las funciones tiene el mismo criterio de numero impar pero los signos +- son intercarlados como podria hacer para que me salga de igual manera;
Código
Título: Re: Ayuda con codigo de c++ Publicado por: K-YreX en 23 Marzo 2021, 21:32 pm La verdad es que la explicación es un poco complicada para el que no sepa de qué le están hablando.
Intuyo que la historia empieza por las series de Taylor y su forma de aproximar funciones como el sen(x) mediante una sumatoria. Para ver la fórmula de la serie de Taylor para sen(x): https://es.wikipedia.org/wiki/Serie_de_Taylor#Funciones_trigonom%C3%A9tricas La fórmula dice algo así como: Código: sen(x) = SUM(n=0->inf) ((-1)^n / (2n+1)! * x^(2n+1)) = Si te das cuenta tú estás calculando: Código: sen(x) = 1+x^1/1 + x^2/2 + x^3/4 + x^4/16 + ... De todas formas, cambiar el signo es muy sencillo. Aunque no nos demos cuenta, cuando cambiamos el signo de algo lo estamos multiplicando por -1. Entonces: Código Salida: Código: 5 -5 5 -5 5 -5 5 -5 5 -5 Título: Re: Ayuda con codigo de c++ Publicado por: Zeta255 en 23 Marzo 2021, 23:14 pm segun lo que entendi va asi, pero no me compila no se que estare haciendo mal, me tira nan.
Código
Título: Re: [C++] Series de Taylor: sen(x) Publicado por: K-YreX en 24 Marzo 2021, 07:29 am Lo primero: avisarte de que he borrado el otro tema que has abierto para el mismo problema.
Lo segundo: es mejor si los títulos de los temas son algo más descriptivos así que he cambiado el título de este tema. En C++ el operador ^ es un XOR (OR exclusivo) que funciona bit a bit. Para usar potencias hay que utilizar la función pow(). Podrías hacerlo así limitándote a usar la fórmula con potencias y factoriales pero la cantidad de cálculos que va a tener que hacer tu programa va a ser muy grande. Lo mejor es aprovechar que tu programa es iterativo para ahorrarte operaciones que ya tienes. Piensa que si en una iteración tienes 1! y lo multiplicas por 2, ya tienes 2!. Si 2! lo multiplicas por 3, ya tienes 3!; y así sucesivamente sin tener que hacer todas las operaciones en cada iteración. Lo mismo pasa con una potencia: si tienes x y lo multiplicas por x, ya tienes x^2. Si x^2 lo multiplicas por x, ya tienes x^3 y así sucesivamente también. Ahora tienes que ver cómo ir almacenando estos resultados parciales en cada iteración. No puedo ser más concreto ahora mismo porque no tengo tiempo. Título: Re: [C++] Series de Taylor: sen(x) Publicado por: BloodSharp en 24 Marzo 2021, 15:20 pm Esta es la implementación de la función seno multiplataforma de ReactOS, espero que te sirva:
Código
B# Título: Re: [C++] Series de Taylor: sen(x) Publicado por: Zeta255 en 24 Marzo 2021, 22:17 pm lo he modificado con respecto a lo que me has dicho sinceramente no se que hacer ya, lo hago asi segun la formular pero me sigue dando nan no se porque no me calcula nada.
Código
Título: Re: [C++] Series de Taylor: sen(x) Publicado por: K-YreX en 26 Marzo 2021, 22:36 pm El problema de que te muestre nan como resultado es porque estás calculando números demasiado grandes. Realizar una serie de Taylor para el sen(x) con una precisión de 360 (como estás calculando tú) es una locura.
Llamando precisión al número de elementos de la serie que se calculan, tenemos lo siguiente: Código: Elemento 1: denominador = 1! = (1 * 2 - 1)! Una precisión de 10 es más que suficiente para una aproximación decente. Dicho esto volvamos con el código en sí. La cosa es calcular cada uno de los elementos de la serie correctamente. Empezamos. La estructura general del programa es la siguiente: Código Ahora falta calcular cada una de las variables (signo, numerador, denominador). Para calcular el signo, como ya te dije, basta con ir multiplicando por -1 en cada iteración. Código
Ahora para calcular el numerador, como ya dije también, hay que darse cuenta de que en cada iteración está elevado a un exponente 2 veces mayor. Código: Elemento 1: numerador = x^1 = x ^ (1 * 2 - 1) Código Pero esto requiere demasiados cálculos innecesarios. Como ya dije: Citar Lo mismo pasa con una potencia: si tienes x y lo multiplicas por x, ya tienes x^2. Si x^2 lo multiplicas por x, ya tienes x^3 y así sucesivamente también. Entonces la mejor opción es:Código
Y ya sólo quedaría el denominador. Vuelvo a mencionar lo que dije en el mensaje anterior: Citar Piensa que si en una iteración tienes 1! y lo multiplicas por 2, ya tienes 2!. Si 2! lo multiplicas por 3, ya tienes 3!; y así sucesivamente sin tener que hacer todas las operaciones en cada iteración. Aquí también podríamos calcular el factorial de (2^n-1) pero volverían a ser un montón de cálculos innecesarios. Vamos a ver cómo funcionan los factoriales otra vez:Código: Elemento 1: denominador = 1! = (1 * 2 - 1)! Código Tenemos que sumar 2 a i porque al empezar en 0, obtendríamos números negativos en las primeras iteraciones. Este valor que se suma a i dependerá del número (i) con el que se empiecen a contar las iteraciones. |