Equation du Temps

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Equation du Temps

Message par kernadec »

bonjour
j'avais besoin de calculer l'équation du temps
c'est quand même compliqué... avec pas mal de prises de tête...

comme c'était plus simple avec le code java script de l'honorable Larry Bogan.

voilà le code en PureBasic, Si ça intéresse quelqu'un..

Attention pour vérifié avec son site,
Celui-ci donne des valeurs EQT inversées en polarité et sont en décimales.

Exemple du code pour le 3/10/2012 donne l' EQT en positif sur son site.
alors que nous sommes en Europe avec ces valeurs négatives.
car vu du Continent Américain, l’Europe se trouve à l'est.

Cordialement

[code mis à jour]

Code : Tout sélectionner

;#####################################################################################################
; Conversion du code de larry Bogan pour le calcul de l'équation du temps 
; http://www.nature1st.net/bogan/astro/time/jsjdetst.html
; adapter du javascript vers PureBasic par kernadec   (10/2012)
;#####################################################################################################

Procedure.d Frac(Xfrac.d) 
  ProcedureReturn Xfrac-Int(Xfrac)  
EndProcedure 
Procedure.d dms(Xdms.d) 
  ;conversion decimales en degres minutes secondes  
  ProcedureReturn Int(Xdms)+Frac(Int(Frac(Xdms)*60)/100)+Frac(Frac(Frac(Xdms)*60)*0.006) 
EndProcedure 
Procedure.d dec(xdec.d) 
  ;conversion degres minutes secondes en decimales 
  ProcedureReturn Int(Xdec)+Int(frac(Xdec)*100)/60+(frac(Xdec)*100-Int(frac(Xdec)*100))*100/3600 
EndProcedure 

Procedure.d calcJD(year.l,month.l,day.l,time.d,tzone)
  y.d = year
  m.d = month
  d.d = day
  t.d = dec(time.d)
  If m <= 2 
    y = y - 1
    m = m + 12
  EndIf
  a.d = Round((y/100),#PB_Round_Down)
  b.d = 2 - a + Round((a/4),#PB_Round_Down)
  d.d + (t/24)
  
  jdg.d = Round((365.25*(y+4716)),#PB_Round_Down)+Round((30.6001*(m+1)),#PB_Round_Down)+d+b-1524.5
  
  ;// Correct the time For UT from local standard time - this only sets up calc To give the right jd For 0h UT
  jdg -(tzone/24)-(t/24)
  jd0.d = Round((jdg+0.5),#PB_Round_Nearest)-0.5
  ;// Julian day 0h UT
  
  ProcedureReturn jd0	
EndProcedure 

Procedure longcorr(longitude.d)  
  lngtd.d = dec(longitude)
  tzone.l = Round((lngtd/15),#PB_Round_Up)
  
  ProcedureReturn tzone
EndProcedure

Procedure.d calcET(jday.d)
  radian0.d = 180/#PI
  Tz.d = (jday-2451545.0)/36525 ; Julian (jours depuis le 1 janvier 2000 2451545 +)
  tau.d = Tz/10
  obl.d=23.439291-0.001300*Tz ; 23.439291  déclinaison du soleil le 1 janvier 2000
  obl=obl/radian0
  L.d = 280.46644567+360007.6982779*tau+0.030320*tau*tau+Pow(tau,3)/49931-Pow(tau,4)/15299
  L = L/radian0
  M.d = 357.052910+35999.05030*Tz-0.0001559*Tz*Tz-0.00000048*Tz*Tz*Tz
  M = M/radian0
  e.d = 0.01670617-0.000042037*Tz-0.0000001236*Tz*Tz
  y.d = Pow(Tan(obl/2),2)
  ET.d = y*Sin(2*L)-2*e*Sin(M)+4*e*y*Sin(M)*Cos(2*L)-y*y/2*Sin(4*L)
  ET = ET*radian0*4
  ;// inversion polarité (est-ouest) pour l'europe par rapport continent americain
  If ET>0:ET=0-ET:Else:ET=Abs(ET):EndIf 
  
  ProcedureReturn ET
EndProcedure

Procedure.s calcST(jdi.d,tzone,longitude)
  ;// calculate the siderial time at Greenwich in degrees at 0hUT
  t1.d = (jdi-2451545.0)/36525;
  st.d = 100.46061837+36000.77053608*t1+0.000387933*t1*t1-t1*t1*t1/38710000;
  ;// correct For other time And time zone 
  ;// remember that julian day is For 0h UT (add in time plus time zone (negative =west))
  ;// The following gives the UT For the time, t in time zone tzone
  ut.d = (dec(time)+tzone)
  ;// example If tzone = -4 hours And time = 15 hours (3 pm) then UT = 15+4 = 19 hours (remember st is in degrees)
  st = st + 1.002738*ut*15
  ;// Now calculate local siderial time which is your longitude less than the st at greenwich
  ;st = st+dec(longitude) ; utiliser cette addition si l'on veut ajouter le fuseau horaire pour temps sidéral local
  ;// Reduce the angle To 0-360
  
  If st < 0
    n = Round(Abs(st/360),#PB_Round_Down)
    st + ((n+1)*360)
  EndIf
  
  hr = Round((st/15),#PB_Round_Down)
  mn = Round((Mod(st,15)*4),#PB_Round_Down);
  sc = Round(((st-(hr*15)-(mn/4))*240),#PB_Round_Nearest)
  
  If hr > 24
    n = Round((hr/24),#PB_Round_Down)
    hr = hr - n*24
  EndIf
  sideral$ = ""+Str(hr)+"h"+Str(mn)+"m"+Str(sc)+"s"
  
  ProcedureReturn sideral$
EndProcedure

year.l=2012
month.l=10
day.l=3
time.d=0           ;hms
longitude.d=0      ;degres  (ouest = long négative)

tzhr.l = longcorr(longitude.d);

;// returns the julian day For 0h UT

julian0.d=calcJD(year.l,month.l,day.l,time.d,tzhr)

;// julian day For the local time

jd1.d = julian0+((dec(time)+tzhr)/24)

If (dec(time)+tzhr)>=24
  jd1 - 1
EndIf

EQT.d=calcET(jd1.d)

ts$=calcST(jd1.d,tzone,longitude)

Debug "julian0= " + StrD(julian0,2)

Debug "tzone= " + Str(tzhr)

Debug "julian= " + StrD(jd1,2)

Debug "EQ-Temps=  " + StrD(dms(EQT),8)

Debug "Temps Sidéral= "  + ts$

Debug "resultats"

Dernière modification par kernadec le mer. 03/oct./2012 15:30, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Equation du Temps

Message par kernadec »

mises à jour du code précèdent.
car je n'avais pas testé avec l' heure dans la journée :oops:
correction de ce problème

Cordialement
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

Ca à l'air un peu compliqué (ça me fait penser au "guide du routard intergalactique" ou la réponse est 42... ici la réponse est -10.5614...) :lol:

Par contre, si tu est branché sur ce genre d'équation, peut-être as-tu vu un bout de code pour calculer les heures de lever/coucher du soleil en fonction de la position et de la date ? ça m'intéresse vivement :)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Equation du Temps

Message par kernadec »

bonjour Golfy
c'est possible, mais c'est aussi compliqué que l'équation du temps..
il faut la position du soleil pour une date donnée,
donc on a besoin d'utiliser des éphémérides...
pour cela on a la libraire swedll32.dll, elle est capable de faire beaucoup de calculs sur les astres et les étoiles
regarde ce code, Au début se trouve les instructions pour télécharger et utiliser la librairie éphéméride.

http://www.purebasic.fr/french/viewtopi ... 9&start=15

Cordialement
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

J'ai voulu faire un essai pour trouver les heures de Levé/Couché du soleil... mais le programme ne semble pas au point (algo utilisé : http://williams.best.vwh.net/sunrise_su ... orithm.htm)

Code : Tout sélectionner

; calcul soleil
; =============
; Lat = Latitude (Grenoble = 45.16°)
; Longitude (Grenoble = 5.71°)
;
; http://users.electromagnetic.net/bu/astro/sunrise-set.php
; http://www.heliodon.net/downloads/Beckers_2010_Helio_007_fr.pdf
; http://jean-paul.cornec.pagesperso-orange.fr/heures_lc.htm

Procedure.i JA(jour, mois, annee)
  date$= RSet(Str(jour),2,"0")+"/"+RSet(Str(mois),2,"0")+"/"+Str(annee)
  date1= ParseDate("%dd/%mm%/%yyyy", date$)
  ProcedureReturn date1
EndProcedure

  
Mois = 3
Jour = 1
Annee= 2013


Procedure.d LeverSoleil(jour.i, latitude.d, longitude.d, rise.i)
  ; http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
  Protected lngHour.d, TSet.d, TRise.d, M.d, L.d, RA.d, Lquad.d, Rquad.d, sinDec.d, cosDec.d
  Protected cosH.d, H.d, UT.d, Ti.d
  
  lngHour  = longitude / 15
  If rise = 1
    t        = jour + (( 6 - lngHour) / 24)
  Else
    t        = jour + ((18 - lngHour) / 24)
  EndIf
  
  
  M        = (0.9856 * t) - 3.289
  L        = Mod(M + (1.916 * Sin(M)) + (0.020 * Sin(2 * M)) + 282.634,360)
  RA       = Mod(ATan(0.91764 * Tan(L)),360)
  Lquad    = (Round( L/90, #PB_Round_Down)) * 90
  RAquad   = (Round(RA/90, #PB_Round_Down)) * 90
  RA       = RA + (Lquad - RAquad)
  RA       = RA / 15
  sinDec   = 0.39782 * Sin(L)
  cosDec   = Cos(ASin(sinDec))
  cosH     = ((-0.01454) - (sinDec * Sin(latitude)))/(cosDec * Cos(latitude))  
  If rise = 1
    H = (360 - ACos(cosH))/15
  Else
    H = (ACos(cosH))/15
  EndIf
  Ti = H + RA - (0.06571 * t) - 6.622
  UT = Mod(Ti - lngHour,24)
  ProcedureReturn UT
  
  
EndProcedure


Debug LeverSoleil(DayOfYear(Date()), 45.16, 5.71, 1)
Debug LeverSoleil(JA(21,12,2012), 45.16,5.71, 1)
Debug LeverSoleil(JA(22,06,2013), 45.16,5.71, 1)


;Debug CoucherLeverSoleil(JAnnee(21,12,2012),45)
;Debug CoucherLeverSoleil(JAnnee(21,06,2012),45)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Equation du Temps

Message par Mesa »

Apparemment, il faut utiliser le rang du jour dans l'année et non le jour lui-même, c'est pourquoi l'auteur utilise cet algo

Code : Tout sélectionner

1. first calculate the day of the year

	N1 = floor(275 * month / 9)
	N2 = floor((month + 9) / 12)
	N3 = (1 + floor((year - 4 * floor(year / 4) + 2) / 3))
	N = N1 - (N2 * N3) + day - 30
pour cela, je pense que la fonction Resultat = DayOfYear(Date) de PB suffit.

De plus les équations sont faites pour des angles en degrés alors que PB fait ses calculs en radians, ce qui nécessite des conversions dans les deux sens comme le dit l'auteur:
NOTE: the algorithm assumes the use of a calculator with the
trig functions in "degree" (rather than "radian") mode. Most
programming languages assume radian arguments, requiring back
and forth convertions. The factor is 180/pi. So, for instance,
the equation RA = atan(0.91764 * tan(L)) would be coded as RA
= (180/pi)*atan(0.91764 * tan((pi/180)*L)) to give a degree
answer with a degree input for L.
Il faut donc transformer l'angle concerné en radian avant chaque sin, cos et tan, puis transformer le résultat en degré (si le résultat est un angle).

Mesa.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

Tout juste ! :oops:

Cependant, le nouveau code ne me donne toujours pas de résultat satisfaisant (les équinoxes devraient être à peu près égaux, non ?)
De plus, je ne sais pas convertir ce nombre décimal en heure et minute :roll:

Code : Tout sélectionner

; calcul soleil
; =============
; Lat = Latitude (Grenoble = 45.16°)
; Longitude (Grenoble = 5.71°)
;
; http://users.electromagnetic.net/bu/astro/sunrise-set.php
; http://www.heliodon.net/downloads/Beckers_2010_Helio_007_fr.pdf
; http://jean-paul.cornec.pagesperso-orange.fr/heures_lc.htm

Procedure.i JA(jour, mois, annee)
  date$= RSet(Str(jour),2,"0")+"/"+RSet(Str(mois),2,"0")+"/"+Str(annee)
  date1= ParseDate("%dd/%mm%/%yyyy", date$)
  ProcedureReturn DayOfYear(date1)
EndProcedure

; Procedure to convert RADIAN <--> DEGRE
Procedure.d D2R(degree.d)
  ProcedureReturn degree.d*#PI/180  
EndProcedure
Procedure.d R2D(radian.d)
  ProcedureReturn radian.d*180/#PI  
EndProcedure

; Procedure to calculate directly with DEGRE
Procedure.d DSin(de.d)
  ProcedureReturn Sin(de*#PI/180)*180/#PI  
EndProcedure
Procedure.d DaSin(de.d)
  ProcedureReturn ASin(de*#PI/180)*180/#PI  
EndProcedure
Procedure.d DCos(de.d)
  ProcedureReturn Cos(de*#PI/180)*180/#PI  
EndProcedure
Procedure.d DaCos(de.d)
  ProcedureReturn ACos(de*#PI/180)*180/#PI  
EndProcedure
Procedure.d DTan(de.d)
  ProcedureReturn Tan(de*#PI/180)*180/#PI  
EndProcedure
Procedure.d DaTan(de.d)
  ProcedureReturn ATan(de*#PI/180)*180/#PI  
EndProcedure

Mois = 3
Jour = 1
Annee= 2013


Procedure.d LeverSoleil(jour.i, latitude.d, longitude.d, rise.i)
  ; http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
  Protected lngHour.d, TSet.d, TRise.d, M.d, L.d, RA.d, Lquad.d, Rquad.d, sinDec.d, cosDec.d
  Protected cosH.d, H.d, UT.d, Ti.d
  
  lngHour  = longitude / 15
  If rise = 1
    t        = jour + (( 6 - lngHour) / 24)
  Else
    t        = jour + ((18 - lngHour) / 24)
  EndIf
  
  
  M        = (0.9856 * t) - 3.289
  L        = Mod(M + (1.916 * DSin(M)) + (0.020 * DSin(2 * M)) + 282.634,360)
  RA       = Mod(dATan(0.91764 * dTan(L)),360)
  Lquad    = (Round( L/90, #PB_Round_Down)) * 90
  RAquad   = (Round(RA/90, #PB_Round_Down)) * 90
  RA       = RA + (Lquad - RAquad)
  RA       = RA / 15
  sinDec   = 0.39782 * dSin(L)
  cosDec   = dCos(dASin(sinDec))
  cosH     = ((-0.01454) - (sinDec * dSin(latitude)))/(cosDec * dCos(latitude)) 
  If rise = 1
    H = (360 - dACos(cosH))/15
  Else
    H = dACos(cosH)/15
  EndIf
  Ti = H + RA - (0.06571 * t) - 6.622
  UT = Mod(Ti - lngHour,24)
  ProcedureReturn UT
  
  
EndProcedure


Debug LeverSoleil(DayOfYear(Date()), 45.16, 5.71, 1)
Debug LeverSoleil(JA(09,01,2013), 45.16,5.71, 1)
; Date Solstices et equinoxes : http://wwp.greenwichmeantime.com/longest-day/equinox-solstice-2010-2019.htm
Debug "Solstices :"
Debug LeverSoleil(JA(21,12,2012), 45.16,5.71, 1)
Debug LeverSoleil(JA(21,06,2013), 45.16,5.71, 1)
Debug "Equinoxes :"
Debug LeverSoleil(JA(20,03,2013), 45.16,5.71, 1)
Debug LeverSoleil(JA(22,09,2013), 45.16,5.71, 1)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Equation du Temps

Message par kernadec »

bonjour Golfy
De plus, je ne sais pas convertir ce nombre décimal en heure et minute
dans le premier post, il y a les procédures mises ci dessous pour ce genre de conversions
(dms ou hms)

Cordialement

Code : Tout sélectionner

Procedure.d Frac(Xfrac.d)  
  ProcedureReturn Xfrac-Int(Xfrac)   
EndProcedure  
Procedure.d dms(Xdms.d)  
  ;conversion decimales en degres minutes secondes  
  ProcedureReturn Int(Xdms)+Frac(Int(Frac(Xdms)*60)/100)+Frac(Frac(Frac(Xdms)*60)*0.006)  
EndProcedure  
Procedure.d dec(xdec.d)  
  ;conversion degres minutes secondes en decimales  
  ProcedureReturn Int(Xdec)+Int(frac(Xdec)*100)/60+(frac(Xdec)*100-Int(frac(Xdec)*100))*100/3600  
EndProcedure  
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

Mon idée est de trouver levé 7:34, couché 17:28 par exemple

Pour le moment, la procédure ne donne pas de résultats cohérents ! :(
mois 1 Levé : 7.881 Couché : 19.969
mois 2 Levé : 10.863 Couché : -1.005
mois 3 Levé : 12.764 Couché : 0.858
mois 4 Levé : 12.790 Couché : 0.795
mois 5 Levé : 10.890 Couché : -1.159
mois 6 Levé : 7.550 Couché : -4.521
mois 7 Levé : 3.756 Couché : -8.309
mois 8 Levé : 0.356 Couché : -11.679
mois 9 Levé : -1.568 Couché : -13.542
mois 10 Levé : -1.433 Couché : -13.336
mois 11 Levé : 0.551 Couché : -11.352
mois 12 Levé : 3.645 Couché : -8.272
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

@Kermadec: j'essaye déjà de calculer le jour julien de la date. Mais ma procédure (basé sur plusieurs sites présentant le même algorithme) ne fonctionne pas... et la tienne non plus :roll:

As-tu une idée (sachant que par exemple, le 19/01/2013 = 2456311.5 (http://www.onlineconversion.com/julian_date.htm & http://aa.usno.navy.mil/data/docs/JulianDate.php#cal))

GOLFY

Code : Tout sélectionner

Procedure.d JD(J, M, A)
	; JD = 367Y -- 7[Y + (M + 9)/12]/4 -- 3([Y + (M - 9)/7]/100 + 1) /4 + (275M)/9 + D + 1721029
	; JJ = 367 * A - ENT(1,75 * (ENT((M + 9) / 12) + A )) + ENT(275 * M / 9) - ENT(0,75 * (1 + ENT(0,01 * (ENT((M - 9) / 7) + A)))) + J + 1721028,5
	; J  = 367*Y-7*(Y+(M+9)/12)/4-3*((Y+(M-9)/7)/100+1)/4+275*M/9+D+1721029
	;
	;
	JD.d = Int(367*A) - 7*Int(A+Int((M+9)/12)/4) - 3*Int((A+Int(Int((M-9)/7)/100)+1)/4) + 275*Int(M/9) + J+1721029
	JD.d = 	367*A - 7*Int((A+((M+9)/12))/4) - Int((3*(1+Int(Int((M-9)/7)+A)/100)/4)) + 275*Int(M/9) + J+1721029
	;
	;JD.d = 367 * A - Int(1,75 * (Int((M + 9) / 12) + A )) + Int(275 * M / 9) - Int(0,75 * (1 + Int(0,01 * (Int((M - 9) / 7) + A)))) + J + 1721028,5
	ProcedureReturn JD
EndProcedure
KERMADEC

Code : Tout sélectionner

Procedure.d calcJD(year.l,month.l,day.l,time.d,tzone)
  y.d = year
  m.d = month
  d.d = day
  t.d = dec2deg(time.d)
  If m <= 2 
    y = y - 1
    m = m + 12
  EndIf
  a.d = Round((y/100),#PB_Round_Down)
  b.d = 2 - a + Round((a/4),#PB_Round_Down)
  d.d + (t/24)
  
  jdg.d = Round((365.25*(y+4716)),#PB_Round_Down)+Round((30.6001*(m+1)),#PB_Round_Down)+d+b-1524.5
  
  ;// Correct the time For UT from local standard time - this only sets up calc To give the right jd For 0h UT
  jdg -(tzone/24)-(t/24)
  jd0.d = Round((jdg+0.5),#PB_Round_Nearest)-0.5
  ;// Julian day 0h UT
  
  ProcedureReturn jd0   
EndProcedure
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Equation du Temps

Message par kernadec »

bonjour Golfy

bien sur si tu prend la procédure seule :D
sinon de cette manière on obtient le numéro du jour julian

Cordialement

Code : Tout sélectionner

Procedure.d Frac(Xfrac.d) 
  ProcedureReturn Xfrac-Int(Xfrac)  
EndProcedure 
Procedure.d dms(Xdms.d) 
  ;conversion decimales en degres minutes secondes  
  ProcedureReturn Int(Xdms)+Frac(Int(Frac(Xdms)*60)/100)+Frac(Frac(Frac(Xdms)*60)*0.006) 
EndProcedure 
Procedure.d dec(xdec.d) 
  ;conversion degres minutes secondes en decimales 
  ProcedureReturn Int(Xdec)+Int(frac(Xdec)*100)/60+(frac(Xdec)*100-Int(frac(Xdec)*100))*100/3600 
EndProcedure 


Procedure.d calcJD(year.l,month.l,day.l,time.d,tzone)
  y.d = year
  m.d = month
  d.d = day
  t.d = dec(time.d)
  If m <= 2 
    y = y - 1
    m = m + 12
  EndIf
  a.d = Round((y/100),#PB_Round_Down)
  b.d = 2 - a + Round((a/4),#PB_Round_Down)
  d.d + (t/24)
  
  jdg.d = Round((365.25*(y+4716)),#PB_Round_Down)+Round((30.6001*(m+1)),#PB_Round_Down)+d+b-1524.5
  
  ;// Correct the time For UT from local standard time - this only sets up calc To give the right jd For 0h UT
  jdg -(tzone/24)-(t/24)
  jd0.d = Round((jdg+0.5),#PB_Round_Nearest)-0.5
  ;// Julian day 0h UT
  
  ProcedureReturn jd0   
EndProcedure 
Procedure longcorr(longitude.d)  
  lngtd.d = dec(longitude)
  tzone.l = Round((lngtd/15),#PB_Round_Up)
  
  ProcedureReturn tzone
EndProcedure

year.l=2013
month.l=01
day.l=20
time.d=0           ;hms
longitude.d=0      ;degres  (ouest = long négative)

tzhr.l = longcorr(longitude.d);

;// returns the julian day For 0h UT

julian0.d=calcJD(year.l,month.l,day.l,time.d,tzhr)
Debug julian0
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Equation du Temps

Message par Golfy »

Exact 8O

Bon sang, moi qui veut juste trouver les heures de lever/coucher du soleil... mes connaissances en maths sont vraiment insuffisantes :oops:
Enfin, le coté positif est que je sais enfin ce qu'est une date en jour Julien :roll:

Merci Kermadec pour ton aide précieuse ! :wink:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Equation du Temps

Message par Mesa »

J'avais fait un topic sur le jour julien :
http://forums.purebasic.fr/french/viewt ... =6&t=12710

Et quant au calcul du levé du soleil, ça fait partie des "faux-amis" : ça paraît tout bête mais en fait c'est très compliqué. :roll: :|

Il faut calculer la position de la Terre sur son orbite, assez précisément, faire un transfert de coordonnées pour utiliser les coordonnées géographique du lieu du levé et trouver l'heure (par récurrence la plupart du temps).

J'ai peut-être un algo quelque part, quand j’aurais le temps...

Code : Tout sélectionner

Procedure.d jd(Annee, Mois, jour, Heure, Minute, Seconde); Jour Julien à 0h TU (Temps Universel )
 
  Protected y.d=0
  Protected m.d=0
  Protected a.d=0
  Protected jj.d=0
  Protected z.d=0
 
 
  If Mois<3
    y=Annee-1
    m=Mois+12
  Else
    y=Annee
    m=Mois
  EndIf
 
  jj=Int(365.25*(y+4716))+Int(30.6001*(m+1))+jour-1524.5
 
  ;  Réforme Grégorienne
  ; Au Jeudi 4 Octobre 1582 succède le Vendredi 15 Octobre 1582
  ;
  a=Annee+(Mois/100)+(jour/10000)
  If a>1582.1014;
    a = Int(y/100)
    jj = jj + 2 - a + Int(a/4)
  EndIf
 
  ;Ajout h m s
  jj + (Heure + Minute/60 + Seconde/3600)/24
 
  ProcedureReturn jj
EndProcedure

Procedure.d jd2(Annee, Mois, jour, Heure, Minute, Seconde); Jour Julien à 0h TU (Temps Universel )
  ; --Ne fonctionne pas avant le 15 Octobre 15 1582 mais plus rapide que jd()--
  Protected j.d
  Protected m
  Protected a
  Protected jj.d
 
  a=Annee
  m=Mois
  j=jour+(Heure + Minute/60 + Seconde/3600)/24
 
  jj=367*a -Int(1.75*(Int((m+9)/12)+a))
  jj-Int(0.75*(1+Int((Int((m-9)/7)+a)*0.01)))
  jj+Int((275*m)/9)+j+1721028.5
 
  ProcedureReturn jj
EndProcedure

Debug "19/01/2013 = 2456311.5 "
Debug jd(2013,1,19,0,0,0)
Mesa.
Répondre