Wednesday, February 18, 2015

Metodi di calcolo delle posizioni planetarie e verifiche di accuratezza e precisione

Con il precedente post ho mostrato come si puo' ottenere un metodo di calcolo delle posizioni planetarie basato sulle VSOP87. Rimane da fare la verifica di quanto questa metodologia sia accurata in relazione ad altri metodi. Se i risultati sono soddisfacenti, possiamo ritenere il metodo utile per le finalità di calcolo astrologico che sono l'obiettivo fondamentale di questo lavoro.

Nel frattempo ho inserito anche il Sole tra i corpi celesti misurabili e ho modificato opportunamente il programma planets.py nella directory vsop87c rinominandolo planets_sun.py. Come già detto trovate tutto in github/zdomjus60/astrometry. Nella directory principale ho inserito uno script per mettere a confronto tre diverse librerie in linguaggio Python: pyephem di Brandon Rhodes, la mia libreria vsop87c e le pyswisseph di Stanislas Marquis.

Riporto di seguito il testo integrale dello script di verifica, di cui trovate copia in github sotto il nome di test_vsop87.py, nella directory principale.

from time_func import *
import math
import random
import ephem
import numpy
import time, datetime
import swisseph
from vsop87c.planets import Planet 
planets = {'Earth': ephem.Sun, 'Mercury':ephem.Mercury, 'Venus':ephem.Venus,
           'Mars':ephem.Mars, 'Jupiter':ephem.Jupiter, 'Saturn':ephem.Saturn,
           'Uranus':ephem.Uranus, 'Neptune':ephem.Neptune}
swe_plan = {'Earth': 0, 'Mercury':2, 'Venus':3,
           'Mars':4, 'Jupiter':5, 'Saturn':6,
           'Uranus':7, 'Neptune':8}
c = []; d = []; e = []
for n in range(1000):
    year = random.randrange(-3000,3000)
    doty = random.randrange(1,365)
    date = cal2jul(year,1,1)+doty
    cal_date = jul2cal(date)
    year = cal_date[0]
    month = cal_date[1]
    day = cal_date[2]
#    print "\njulian date: %d calendar_date %s" % (date , str(cal_date))
#    print "%20s %12s %12s %12s %12s %12s %12s" % ('body','ephem','vsop87c','swisseph','diff1-2','diff2-3', 'diff1-3') 
    for body in planets:
        body_selected = planets[body](str(year)+"/"+str(month)+"/"+str(day), epoch = str(year)+"/"+str(month)+"/"+str(day))
        pos1 = math.degrees(ephem.Ecliptic(body_selected).lon)
        vsop87c_body = Planet(body, year, month, day)
        pos2 = vsop87c_body.calc()[1]
        diff12 = (pos2 - pos1)*3600
        pos3 = swisseph.calc(date, swe_plan[body])[0]
        diff23 = (pos3 - pos2)*3600
        diff13 = (pos3 - pos1)*3600
#        print "%20s %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f" % (body, pos1, pos2, pos3, diff12, diff23, diff13)
        c.append(diff12)
        d.append(diff23)
        e.append(diff13)
print "\n" * 2
print "mean(stdev) ephem-vsop87c      %12.4f(%12.4f)" % (numpy.mean(c), numpy.std(c))
print "mean(stdev) vsop87c-swisseph   %12.4f(%12.4f)" % (numpy.mean(d), numpy.std(d))
print "mean(stdev) ephem-swisseph     %12.4f(%12.4f)" % (numpy.mean(e), numpy.std(e))

Il test procede con l'estrazione casuale di 1000 date tra gli anni 3000 a.c. e 3000 d.c. e con il calcolo di posizione in longitudine di 8 corpi celesti, con l'esclusione di Luna e Plutone. Le differenze di risultato tra i tre metodi sono riportate in linea con le posizioni planetarie e al termine del computo sono calcolate medie e deviazioni standard delle differenze

Noterete che le righe di stampa dei risultati sono commentate con #, per escluderle dall'esecuzione. Questo perchè, ai fini della verifica, la stampa di 1000*8 risultati puo' risultare eccessivamente lenta. Al termine vengono presentate le statistiche relative all'elaborazione, distintamente per le differenze tra coppie di metodi

Un estratto di stampa completo delle longitudini è riportato di seguito:

julian date: 2024877 calendar_date (831, 10, 25, 0, 0, 0)
                body        ephem      vsop87c     swisseph      diff1-2      diff2-3      diff1-3
             Mercury     207.3747     207.3312     207.3156    -156.6550     -56.0983    -212.7533
             Jupiter     205.3468     205.3423     205.3313     -16.1494     -39.5695     -55.7188
              Uranus     329.9765     329.9781     329.9698       5.5322     -29.8444     -24.3122
                Mars     273.3969     273.3770     273.3673     -71.5360     -35.0396    -106.5756
               Earth     215.4045     215.3728     215.3642    -114.1573     -30.7234    -144.8807
               Venus     221.3751     221.3423     221.3272    -118.2600     -54.3486    -172.6085
              Saturn     167.9982     167.9971     167.9892      -4.0064     -28.2423     -32.2487
             Neptune     254.1742     254.1743     254.1742       0.4144      -0.2400       0.1744

julian date: 978435 calendar_date (-2034, 10, 24, 0, 0, 0)
                body        ephem      vsop87c     swisseph      diff1-2      diff2-3      diff1-3
             Mercury     209.0923     213.0602     213.0497   14284.4955     -37.6671   14246.8284
             Jupiter       9.8841     330.6850     330.6922 1154883.3028      25.9853 1154909.2881
              Uranus     261.2739     257.3849     257.3680  -14000.5191     -60.9418  -14061.4609
                Mars      35.8908     180.2785     180.2819  519795.8213      11.9315  519807.7528
               Earth     194.0403     193.7273     193.7197   -1126.8160     -27.3218   -1154.1377
               Venus     152.5836     185.1803     185.1658  117347.8506     -51.8912  117295.9594
              Saturn      42.1960      26.6255      26.6088  -56053.7974     -60.0905  -56113.8879
             Neptune      81.9239      79.7036      79.7322   -7993.3666     103.2981   -7890.0685

julian date: 2730409 calendar_date (2763, 7, 5, 0, 0, 0)
                body        ephem      vsop87c     swisseph      diff1-2      diff2-3      diff1-3
             Mercury     113.3284     113.3347     113.3312      22.7658     -12.7297      10.0361
             Jupiter     169.3535     169.3514     169.3422      -7.6423     -32.8086     -40.4509
              Uranus     359.6431     359.6444     359.6370       4.5214     -26.5551     -22.0336
                Mars      24.3008      24.2813      24.2726     -70.0481     -31.3619    -101.4100
               Earth     103.0054     102.9741     102.9637    -112.4822     -37.6763    -150.1585
               Venus     143.7745     143.7400     143.7283    -124.2814     -42.2936    -166.5750
              Saturn      30.6450      30.6448      30.6358      -0.8895     -32.2358     -33.1253
             Neptune     182.0906     182.0913     182.0795       2.4104     -42.4343     -40.0239

julian date: 2294341 calendar_date (1569, 7, 26, 0, 0, 0)
                body        ephem      vsop87c     swisseph      diff1-2      diff2-3      diff1-3
             Mercury     159.0758     159.0753     159.0686      -1.9116     -23.8803     -25.7919
             Jupiter     273.5696     273.5723     273.5738       9.5099       5.3463      14.8562
              Uranus     266.0435     266.0449     266.0466       4.8892       6.0567      10.9460
                Mars      87.9991      88.0019      87.9939       9.9529     -28.8656     -18.9127
               Earth     132.0953     132.0938     132.0879      -5.6827     -21.1337     -26.8164
               Venus     124.1023     124.0967     124.0973     -20.2555       2.2533     -18.0022
              Saturn     185.7830     185.7847     185.7794       5.9762     -18.9236     -12.9475
             Neptune      80.6680      80.6690      80.6667       3.6657      -8.1534      -4.4877

E infine una delle possibili statistiche dopo mille estrazioni casuali:

mean(stdev) ephem-vsop87c        -1672.3936( 231441.6349)
mean(stdev) vsop87c-swisseph        -5.0075(     84.1484)
mean(stdev) ephem-swisseph       -1677.4011( 231440.8876)

Per quanto ci riguarda, è interessante l'accuratezza relativa del metodo vsop87c rispetto al metodo swisseph.

La libreria pyephem fornisce risultati un po' differenti, sia pure contenuti (per i secoli più vicini al nostro tempo). D'altronde tutti i metodi forniscono un'accuratezza a priori che è relativa a intervalli di date ben definite. Quindi non siamo in alcun modo autorizzati a ritenere un metodo più o meno valido dell'altro, tanto più che c'è, nella rappresentazione delle posizioni planetarie, da considerare il sistema di riferimento e l'apparenza della posizione rispetto alla geometria pura e semplice. Per l'astronomo che deve puntare un telescopio è importante sapere dove trovare il pianeta, la cui posizione apparente risente del tempo di percorrenza della luce nello spazio e di vari fattori modificanti, relativistici e di aberrazione luminosa. L'astrologo normalmente non guarda il cielo ma i suoi grafici astrologici, per cui è interessato a collocare le longitudini dei pianeti dove si presume che le leggi del moto li portino fisicamente. Lo scarto medio di soli 5 arcsecondi con elevata precisione tra le longitudini calcolate con la nostra libreria VSOP87C rispetto alle swiss ephemerides è incoraggiante per le finalità che ci siamo proposti. Rimane il problema plutone, che affronteremo in un post successivo

No comments:

Post a Comment

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...