Desarrollo en serie del Coseno en C/C++

El desarrollo en serie del coseno tiene la forma que se señala a continuación:

Como puede observarse, es una sucesión infinita de términos de un polinomio de grado n cuyos coeficientes guardan una relación predecible matemáticamente. Los coeficientes con las potencias impares X, X3, X5, X7, …, son todos iguales a cero por lo que no revestiría mayor dificultad generarlos dentro del programa. Por otra parte, los coeficientes de las potencias pares X2, X4, X6, X8, …, se hacen alternadamente negativos para los n/2 impares (1, 3, 5, …) por lo cual tampoco sería un problema generarlos. En definitiva, la evaluación de la función coseno en cualquier punto de su dominio real, expresada como serie de potencias, sería equivalente a evaluar a un polinomio de grado n en el mismo dominio. Mientras mayor sea el grado del polinomio mayor será la precisión de la evaluación. Para evaluar polinomios en cualquier punto de su dominio real tenemos este código:

Evaluación de polinomios en puntos de su dominio real

el cual tendríamos que adaptar para que genere los coeficientes de manera adecuada pero en orden creciente. El algoritmo de evaluación en el punto no requiere modificación. Combinándolo con el código de:

Factoriales en C/C++

se generó finalmente el siguiente programa:

#include <iostream>
#include <cstdlib>
#include <iomanip>

using namespace std;

void evaluapoli(int n, double *f, double x, double &p);
double factorial(int n);

int main(){

	system ("clear");

	int i, n, prod = -1;

	//Introduce el grado del polinomio
	
	cout << "Aproximacion polinomica para el coseno (grado) = ? ";

	cin >> n; 

	double *f;	

	f = new double [n+1];      // Define el arreglo para los valores de los coeficientes del polinomio

	// Se generan los coeficientes del polinomio

	for (i = 0; i <= n; i+=2) {		

		prod *= -1;		

		f[i] = prod * (1/factorial(i));

	}

	for (i = 1; i < n; i+=2) {		

		f[i] = 0;

	}

	cout << "\n";

	cout << "El coseno será evaluado en el punto (radianes)\n\nX = ? ";

	double x, p=0;

	// Se introduce el valor de x

	cin >> x;

	cout << endl;

	/* Esta es la función que evalua el polinomio en el punto x. Evita el uso de una fórmula

	con la función pow de la libreria math.h */

	evaluapoli (n, f, x, p);

	cout << "Cos(" << x << ") = ";

	cout.setf(ios::fixed);
	cout.precision(9);

	cout << p << endl;

	cout << endl;

	return 0;

}

void evaluapoli(int n, double *f, double x, double &p){

	int i;	

	double *a;

	a = new double [n];

	for (i = 0; i <= n; i++) {  // Crea una copia de los elementos de f[i]

                                        // porque el ciclo for inferior los destruye

		a[i] = f[i];                   

	}	

	for (i = n; i > 0; i--) {

		p = a[i] * x + a[i - 1];

		a[i - 1] = p;

	}

// P es el valor del polinomio en el punto x

}

double factorial(int n){

	int i;
	
	double factor = 1;

	for (i = n; i >= 1; i--)

		factor *= i;

	return factor;	

}

Para compilar y ejecutar en cónsola de Linux:

g++ coseno.c++ -o coseno [Enter]
./coseno [Enter]

Esta es la salida para la aproximación polinómica de grado 18 para el coseno:

Aproximacion polinomica para el coseno (grado) = ? 18

El coseno será evaluado en el punto (radianes)

X = ? 2.5

Cos(2.5) = -0.801143616

Produce el mismo resultado que la calculadora gcalctool de Gnome/Linux. Si se usa la aproximación de grado 16 ya se observa una ligera variación, en valor absoluto, de 3×10-9 unidades.

Esta entrada fue publicada en Código C++, Linux. Guarda el enlace permanente.

3 respuestas a Desarrollo en serie del Coseno en C/C++

  1. Pingback: Desarrollo en serie del Seno en C/C++ |

  2. Pingback: Desarrollo en serie de la función exponencial en C/C++ |

  3. Solo anda si lo compilas para c++ original, tiene negradas que no andan con otros compiladores.

    salufos

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s