Utilizando una de las más bellas fórmulas de las matemáticas, Euler's formula
exp(i*x) = cos(x) + i*sin(x)
,
sustituyendo x := n * phi
:
cos(n*phi) = Re(exp(i*n*phi))
sin(n*phi) = Im(exp(i*n*phi))
exp(i*n*phi) = exp(i*phi)^n
Poderes n
multiplicaciones repetidas. Por lo tanto, puede calcular cos(n*phi)
y simultáneamente sin(n*phi)
por multiplicación compleja repetida por exp(i*phi)
empezando por (1+i*0)
.
Ejemplos de código:
Python:
from math import *
DEG2RAD = pi/180.0 # conversion factor degrees --> radians
phi = 10*DEG2RAD # constant e.g. 10 degrees
c = cos(phi)+1j*sin(phi) # = exp(1j*phi)
h=1+0j
for i in range(1,10):
h = h*c
print "%d %8.3f"%(i,h.real)
o C:
#include <stdio.h>
#include <math.h>
// numer of values to calculate:
#define N 10
// conversion factor degrees --> radians:
#define DEG2RAD (3.14159265/180.0)
// e.g. constant is 10 degrees:
#define PHI (10*DEG2RAD)
typedef struct
{
double re,im;
} complex_t;
int main(int argc, char **argv)
{
complex_t c;
complex_t h[N];
int index;
c.re=cos(PHI);
c.im=sin(PHI);
h[0].re=1.0;
h[0].im=0.0;
for(index=1; index<N; index++)
{
// complex multiplication h[index] = h[index-1] * c;
h[index].re=h[index-1].re*c.re - h[index-1].im*c.im;
h[index].im=h[index-1].re*c.im + h[index-1].im*c.re;
printf("%d: %8.3f\n",index,h[index].re);
}
}
es y * i en radianes o grados? Si está en grados, puede usar: cos a = -1 * cos (a - 180). Si usa radianes, use: cos a = -1 * cos (a - pi). ¿Es una buena constante que se prestaría a tener que calcular solo unas pocas iteraciones (es decir, hay que costar menos de un total N diferente de cosenos)? – shoover
y * i está en radianes; el problema es que tengo que averiguar si puedo usar las propiedades periódicas de los cosenos. Creo que tendría que comprobar si este intervalo y * [1, totalN] está dentro de [0, pi] o si es más grande, y si es más grande, tendría que averiguar qué puntos se repiten debido a las propiedades periódicas . – Federico
A menos que y sea una fracción de pi (como pi/10), entonces la periodicidad de cos probablemente no ayude. –