funcion coseno

Iniciado por Beginner Web, 28 Marzo 2019, 04:11 AM

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

Beginner Web

Hola como hago para hacer la formula de Maclaurin pero enviando a esa funcion 1 solo parametro?  :huh:
Porque este no me da ademas son dos parametros que le mando, quiero mandar solo el angulo :(

Código (cpp) [Seleccionar]
main()
{
int i, terminos=8;
double x=1, coseno=0;
for(i=1;i<=terminos;i++)
coseno+=pow(-1,i)*(pow(x,2*i)/factorial(i));
cout<<"Coseno("<<x<<"): "<<coseno<<endl;
}


Código (cpp) [Seleccionar]
int factorial(int n)
{
if(n==0)
return 1;
else
return n*factorial(n-1);
}


No se ve la funcion pero hagan de cuenta que lo del main es la funcion double coseno(terminos, x){...}
7w7

K-YreX

Imagino que quieres una función que calcule el <cos(x)> usando el Polinomio de Taylor. La forma de pasar un único argumento es predefinir un número constante para <terminos>. Al fin y al cabo cuanto mayor sea <terminos>, mayor será la precisión/exactitud del resultado. Entonces puedes declarar como constante <terminos = 10> y usar siempre ese número.


Además me parece que el Polinomio de Taylor para la función <coseno> no es esa. La función <cos(x)> se aproxima usando el polinomio:

P(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + x⁸/8!...

Y en tu caso estás calculando:

P(x) = - x²/2! + x⁴/3! - x⁶/4!...
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

Y como es la formula?
7w7

K-YreX

En C++ el bucle para calcular la fórmula sería algo así:
Código (cpp) [Seleccionar]

double cos = 0;
int exponente = 0;
for(size_t i = 0; i < num_terminos * num_terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(x,i)/factorial(i);


Y si la función factorial la modificas un poco, te ahorras una llamada para calcular cada factorial:
Código (cpp) [Seleccionar]

int factorial(int n){
    if(n < 1)
        return 1;
    else
        return n * factorial(n-1);
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

No me sale, en num_terminos que va?

tengo esto no se que estoy haciendo mal

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <math.h>

using namespace std;

int factorial(int n)
{
if(n<1)
return 1;
else
return n*factorial(n-1);
}

long double coseno(int numero)
{
long double cos=0;
int terminos=5, exponente=0;
for(size_t i = 0; i < terminos * terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(numero,i)/factorial(i);
    return cos;
}

main()
{
cout<<"Coseno: "<<coseno(10)<<endl;
}
7w7

K-YreX

Hay un problema con el factorial que si intentamos calcular factoriales muy grandes como por ejemplo 24! que llega a calcularse en ese programa que muestras, se produce un desbordamiento. El <num_terminos> muestra la precisión porque determina el número de términos que se van a calcular.

Además hay que tener en cuenta que los ángulos se pasan en radianes. Por lo que 10 radianes es mucho. Para que funcione correctamente hay que reducir el ángulo a la primera vuelta. Reduciendo un poco el número de términos para evitar el desbordamiento del factorial, ya salen resultados bastante bien aproximados.
Código (cpp) [Seleccionar]

// aproximacion del numero PI
const double PI = 3.141592;

long double coseno(double numero)
{
        // reduce el angulo a la primera vuelta de forma simple
while(numero > 2*PI)
numero -= 2*PI;
long double cos=0;
int terminos=10, exponente=0;
for(size_t i = 0; i < terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(numero,i)/factorial(i);
    return cos;
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

En la calculadora me sale 0,984807753 y en la consola me sale -0,713883  :huh:
7w7

K-YreX

Como comentaba antes, el programa recibe un ángulo en radianes.
En la calculadora lo estás calculando en grados.

angulo_grad = x
andulo_rad = x * PI / 180
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

Haa en algun lado lo vi, sabia que tenia que ver con eso,bueno muchas gracias por tu ayuda :)  ;-)

7w7

Beginner Web

Cita de: YreX-DwX en 29 Marzo 2019, 01:20 AM
En C++ el bucle para calcular la fórmula sería algo así:
Código (cpp) [Seleccionar]

double cos = 0;
int exponente = 0;
for(size_t i = 0; i < num_terminos * num_terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(x,i)/factorial(i);


Y si la función factorial la modificas un poco, te ahorras una llamada para calcular cada factorial:
Código (cpp) [Seleccionar]

int factorial(int n){
    if(n < 1)
        return 1;
    else
        return n * factorial(n-1);
}


No me convence tu algoritmo factorial porque aun sigue haciendo una llamada recursiva adicional   :laugh:
7w7