Allora, il problema è quello di calcolare l'angolo la cui tangente è, per esempio, 2.
L'idea è quella di prendere il ventaglio, partire dal risultato (data la tangente, possiamo conoscere seno e coseno) e procedere all'indietro, andando verso lo zero. Cosa che avevamo già fatto per il calcolo del seno e del coseno; ciò che cambia qui è il punto di partenza: il rapporto tra S0 e C0 deve essere uguale alla tangente dell'angolo (e non è nemmeno necessario che questi valori siano davvero il seno e il coseno di un angolo, vanno bene numeri qualsiasi, purché il loro rapporto sia uguale alla tangente dell'angolo che stiamo cercando). Ecco l'algoritmo, molto simile a quello che abbiamo già incontrato:
Z0 = 0,
S0= C0T,
Zm+1 = Zm-DmAm,
Cm+1 = Cm-DmSm/2m,
Sm+1 = Sm+DmCm/2m.
Questa volta il segno di D è governato dal segno di C e S: DC e S devono avere segno opposto. Se la variabile Z è inizializzata a zero, alla fine assumerà il valore dell'angolo che stiamo cercando. Ed ecco il programmino:
from math import atan,sin,cos,pi
ango={}
seni={}
cosi={}
for i in xrange(24):
ango[i]=atan(1./2**i)
cosi[i]=cos(ango[i])
def arcotangente(x):
z0=0
c0=1
s0=x
d=1.
for i in xrange(24):
if c0*s0<0:
z1=z0-ango[i]
c1=c0-d*s0
s1=s0+d*c0
else:
z1=z0+ango[i]
c1=c0+d*s0
s1=s0-d*c0
z0=z1
c0=c1
s0=s1
d/=2
return z0
v1 = arcotangente(70./180*pi)
v2 = atan(70./180*pi)
print v1,v2,abs(v1-v2)
Che restituisce questo output:
0.884869508989 0.88486958315 7.41605976629e-08
Ora abbiamo tutto. Per i logaritmi ci servono le funzioni iperboliche.
Nessun commento:
Posta un commento