Newsgroup: it.scienza.astronomia
Titolo: Implementazione del calcolo delle eclissi di Meeus in c++

Ho un problema a implementare l'algoritmo per il calcolo delle eclissi
di Meeus che nel suo libro "Astronomia con il computer" si trova a
pagina 175. Sto cercando di implementare questo algoritmo in c++,non
trovo problemi per calcolarmi le variabili k t m m' f s perň dopo
molte prove non riesco ancora a calcolare c. Ho definito la costante:
#define SIN(gradi) sin((gradi)*3.14159265/180.0)
che mi trasforma gli angoli espressi gradi in radianti
poi quando voglio definire la variabile c scrivo:
double c = 0.2020*SIN(m) + 0.0024*SIN(2*m) - 0.0390*SIN(m1) +
0.0115*SIN(2*m1) - 0.0073*SIN(m+m1) - 0.0067*SIN(m-m1) +
0.0117*SIN(2*f);
Ad esempio per calcolare il primo esempio,cioč dell'eclissi del
2/10/1978 l'esempio del libro riporta c = -0.1616 mentre il valore che
ottengo nel mio programma č -0.1565
Qualcuno di voi sa quale puň essere l'errore?? o sa dove posso trovare
lo stesso algoritmo descritto su internet(anche in inglese)??

 Qualcuno di voi sa quale può essere l'errore?? o sa dove posso trovare


 Qualcuno di voi sa quale può essere l'errore?? o sa dove posso trovare


 Se riporti i valori delle variabili possiamo provare insieme.
Ad esempio volendo calcolare il primo esempio che da il libro(pg. 179)
cioè il calcolo dell'eclissi solare del 2/10/1978
Per essere sicuro che non si tratti di un errore di programmazione,ho
risolto questi calcoli con il programma MathCad(che mi da lo stesso
valore sbagliato del programma creato da me). Ho seguito il consiglio
di Aldebaran,cioè quello di convertire prima i gradi in radianti anche
se il programma da me creato lo faceva già direttamente.
Il mio programma funziona fino al calcolo della variabile S quindi
riporto le variabili presenti nell'esempio del libro fino a quel
punto:
m = 267.8410
m1 = 251.7102
f = 14.3687
utilizzando la proporzione gradi : radianti = 180 : pi greco
definisco la funzione Conv che converte gradi in radianti:
Conv(gradi):=gradi*pi/180
converto i 3 numeri in radianti assegnando come nomi le lettere
maiuscolo delle precedenti variabili,quindi M M1 e F
M = 4.675
M1 = 4.393
F = 0.251
e calcolo C
C= 0.2020*sin(M) + 0.0024*sin(2*M) - 0.0390*sin(M1) + 0.0115*sin(2*M1)
- 0.0073*sin(M+M1) - 0.0067*sin(M+M1) + 0.0117 * sin(2*F) =
0.2020*sin(4.675) + 0.0024*sin(2*4.675) - 0.0390*sin(4.393) +
0.0115*sin(2*4.393) - 0.0073*sin(4.675+4.393) -
0.0067*sin(4.675+4.393) + 0.0117 * sin(2*0.251) = -0.1565793
mentre nel libro riporta come soluzione C=-0.1616
e anche se provo a calcolare gli altri esempi del libro,mi da sempre
un errore nel calcolo della variabile C.
Ciao

 non si è risolto
Taglio tutto il resto per comodità.
Ho notato che usi pochi valori decimali per PI.
Hai provato a dare
  PI = 4# * Atn(1#)
(la funzione è scritta per VB ma penso che non ci siano problemi a metterla
in C, che non conosco)
Siccome operi con valori molto piccoli, anche arrotondamenti leggeri possono
causare danni pesanti.
--
Cieli sereni.
Renzo Del Rosso
http://www.renzodelrosso.com
NONSCR...@renzodelrosso.com
sostituisci NONSCRIVERMI con SCRIVIMI per risposta privata

 0.0067*sin(4.675+4.393) + 0.0117 * sin(2*0.251) = -0.1565793
a parte l'errore -0.0067*sin(M+M1) invece di -0.0067*sin(M-M1) che però è
solo una svista perché il calcolo lo fai con M-M1, come hai riportato nel
primo post.
Ora facendo i calcoli con le variabili troncate ottengo anch'io -0.1565796,
ma con le variabili contenente tutta la precisione di m, m1 ed f come
riportate sopra, ottengo -0.1587604
Quindi il valore si avvicina al valore indicato dal libro.
I coefficienti nel libro sono anche riportati con queste cifre
significative?
Penso a questo punto che occorra aumentare il numero delle cifre
significative. Concordo anche con il suggerimento di Renzo in modo da
aumentare la precisione nella conversione gradi->radianti.
Un altro suggerimento è quello di controllare che tutti i calcoli vengano
veramente eseguiti in double, a volte basta una svista e il calcolo fatto in
single viene si poi convertito in double ma ovviamente con la precisione del
single.
Ciao,
Armando Rio