Výpočet východů a západů slunce

Nezávazné povídání o všem, co se týka astronomie.
Odpovědět
Uživatelský avatar
Flyingman
Příspěvky: 5
Registrován: 14. 06. 2015, 02:50

Výpočet východů a západů slunce

#1

Příspěvek od Flyingman »

Ahoj lidi,
prosím o pomoc s algoritmem pro výpočet východů a západů slunce. Moje idea je napsat skript pro jednočipový procesor, který mi vypočte podle zadané polohy a aktuálního data čas východu a západu slunce.
Nevím nic o astronomii a matika taky není moje silná stránka, ale našel jsem tady na fóru odkaz na nějaký polopatický algoritmus výpočtu na adrese http://williams.best.vwh.net/sunrise_su ... orithm.htm .
Není tam bohužel příliš podrobný popis ani příklad výpočtu. Zkusil jsem ty vzorečky převést do excelu, ale vychází mi z toho nějaký hausnumera.

Chtěl bych poprosit někoho znalého, jestli by na to nemohl hodit očko, kde je bota :)

Odkaz na soubor: http://lehcivzduchu.cz/astro/astro.xlsx

Předem díky za pomoc ;-)
Tomáš
Uživatelský avatar
Flyingman
Příspěvky: 5
Registrován: 14. 06. 2015, 02:50

Výpočet východů a západů slunce

#2

Příspěvek od Flyingman »

Ještě jsem objevil na stránce https://gist.github.com/Tafkas/4742250# ... sunrise-js kód napsaný v JavaScriptu podle tohoto příkladu, tak jsem to zkusil zadat s těmito údaji pro Prahu:

    longitude = 14.433271;
    latitude = 50.069815;
    zenith = 96;
    den v roce: 184 (14.6.)

Ale stejně vychází nějaký nesmysl, viz. http://www.lehcivzduchu.cz/astro/test.html


Vypocet vychodu slunce:
6.317537463501806
Vypocet zapadu slunce:
16.05236319962266

Skript: http://www.lehcivzduchu.cz/astro/computeSunrise.js

Kód: Vybrat vše

function computeSunrise(day, sunrise) {

    /*Sunrise/Sunset Algorithm taken from
        http://williams.best.vwh.net/sunrise_sunset_algorithm.htm
        inputs:
            day = day of the year
            sunrise = true for sunrise, false for sunset
        output:
            time of sunrise/sunset in hours */

    //lat, lon for Praha
    var longitude = 14.433271;
    var latitude = 50.069815;
    var zenith = 96;
    var D2R = Math.PI / 180;
    var R2D = 180 / Math.PI;

    // convert the longitude to hour value and calculate an approximate time
    var lnHour = longitude / 15;
    var t;
    if (sunrise) {
        t = day + ((6 - lnHour) / 24);
    } else {
        t = day + ((18 - lnHour) / 24);
    };

    //calculate the Sun's mean anomaly
    M = (0.9856 * t) - 3.289;

    //calculate the Sun's true longitude
    L = M + (1.916 * Math.sin(M * D2R)) + (0.020 * Math.sin(2 * M * D2R)) + 282.634;
    if (L > 360) {
        L = L - 360;
    } else if (L < 0) {
        L = L + 360;
    };

    //calculate the Sun's right ascension
    RA = R2D * Math.atan(0.91764 * Math.tan(L * D2R));
    if (RA > 360) {
        RA = RA - 360;
    } else if (RA < 0) {
        RA = RA + 360;
    };

    //right ascension value needs to be in the same qua
    Lquadrant = (Math.floor(L / (90))) * 90;
    RAquadrant = (Math.floor(RA / 90)) * 90;
    RA = RA + (Lquadrant - RAquadrant);

    //right ascension value needs to be converted into hours
    RA = RA / 15;

    //calculate the Sun's declination
    sinDec = 0.39782 * Math.sin(L * D2R);
    cosDec = Math.cos(Math.asin(sinDec));

    //calculate the Sun's local hour angle
    cosH = (Math.cos(zenith * D2R) - (sinDec * Math.sin(latitude * D2R))) / (cosDec * Math.cos(latitude * D2R));
    var H;
    if (sunrise) {
        H = 360 - R2D * Math.acos(cosH)
    } else {
        H = R2D * Math.acos(cosH)
    };
    H = H / 15;

    //calculate local mean time of rising/setting
    T = H + RA - (0.06571 * t) - 6.622;

    //adjust back to UTC
    UT = T - lnHour;
    if (UT > 24) {
        UT = UT - 24;
    } else if (UT < 0) {
        UT = UT + 24;
    }

    //convert UT value to local time zone of latitude/longitude
    localT = UT + 1;

    //convert to Milliseconds
    
    //return localT * 3600 * 1000;
    return UT;
}
Uživatelský avatar
stawq
Příspěvky: 229
Registrován: 03. 04. 2013, 07:36
Bydliště: Ratměřice
Věk: 63

Výpočet východů a západů slunce

#3

Příspěvek od stawq »

Ahoj, dívám se na to jen zběžně (do těch javascriptů), protože někam vyjíždím. Ale zdá se mně, že je tam víc problémů...

1. Parametr zenith = Sun's zenith for sunrise/sunset. Má být ne 96, to je hodnota pro občanský soumrak, ale těch 90 degrees 50' (tedy cca 90.83)...
2. Zdá se mně, že parametr "day" nemůže být pro dnešek 184, ať počítám jak počítám...
3. Každopádně ten parametr dne nějak někde vstupuje do výpočtu nešťastně. Když vložím "0", tak vyjde hezký výsledek pro 1. leden. Ale pro hodnotu 80 (kolem jarní rovnodennosti), už ne... Určitě se na ten parametr podívej, jestli s ním zacházíš stejně jako je v originálním kódu. Třeba ale někdo chytřejší tam objeví chybu na první pohled. Jinak se na to podívám večer.

Standa

Uživatelský avatar
Boramyr
Příspěvky: 189
Registrován: 22. 09. 2007, 03:37
Bydliště: Útušice
Věk: 40

Výpočet východů a západů slunce

#4

Příspěvek od Boramyr »

V tom Excelovském souboru máš chyby v tom, že předáváš goniometrickým i cyklometrickým funkcím argumenty ve stupních. Tyto funkce ale pracují s radiány!

Edit: Druhá chyba: V řádce 28 místo dělení patnácti odečítáš.

Na řádce 22 pak nemáš obecně platnou opravu do rozsahu 0-360° ale zrovna pro dnešek to nevadí.

Po těchto opravách to již funguje. Pouze čas západu vyjde záporný a je třeba přičíst 24h a nezapomenout, že je to v UT
Uživatelský avatar
MilAN
Příspěvky: 24313
Registrován: 17. 04. 2004, 23:56
Bydliště: Jablonec nad Nisou
Věk: 75

Výpočet východů a západů slunce

#5

Příspěvek od MilAN »

Ještě jde o to, k čemu ten výpočet a s jakou přesností potřebuješ.
lepší rada žádná než špatná
milantos(šnek)centrum(puntík) cz
Uživatelský avatar
Flyingman
Příspěvky: 5
Registrován: 14. 06. 2015, 02:50

Výpočet východů a západů slunce

#6

Příspěvek od Flyingman »

Cau lidi,
diky za rady! Co se tyka tech vypoctu, tak tem opravdu nerozumim, asi jako kdyby mi nekdo nadaval ::). V podstate mi slo o to v nejakym srozumitelnym jazyce zprovoznit spravny vypocet, abych se mel ceho chytit a spravne pak rozchodit takovyto vypocet v jednocipovem mikroprocesoru. V podstate pro me je vyuziti takove, jako treba zapinat a vypinat osvetleni podle vypocteneho casu a k tomu nejake dalsi funkce. Takze ta presnost ani nemusi byt nijak zvlast precizni.

Nicmene se mi nakonec podarilo diky vasim radam odhalit botu v tom JavaScriptu. Jednak jsem tam mel spatne zadany cislo dne v roce a pak tam byla chyba v uhlu slunce pod horizontem.

Ted jsem to poupravil a vysledek pro zadane parametry celkem spravny:

Vychod slunce v UTC
2:52
Zapad slunce v UTC
19:13

Ale jeste to budu muset otestovat pro ruzne souradnice a data.

Tady prikladam funkcni skript v html dokumentu, treba se to bude nekomu hodit 8-)

Kód: Vybrat vše

<html>
<head>
<title>Test2</title>
</head>
<body>

<script type="text/javascript">
 document.write("Vychod slunce v UTC<BR>");
 document.write(computeSunrise("sunrise"));
 document.write("<BR><BR>Zapad slunce v UTC<BR>");
 document.write(computeSunrise(""));

 function computeSunrise(sunrise) {

  //lat, lon for Praha
  var day = 165
  var longitude = 14.433271;
  var latitude = 50.069815;
  var zenith = 90.833333333;
  var D2R = Math.PI / 180;
  var R2D = 180 / Math.PI;

  // convert the longitude to hour value and calculate an approximate time
  var lnHour = longitude / 15;
  var t;
  if (sunrise) {
   t = day + ((6 - lnHour) / 24);
  } else {
   t = day + ((18 - lnHour) / 24);
  };

  //calculate the Sun's mean anomaly
  M = (0.9856 * t) - 3.289;

  //calculate the Sun's true longitude
  L = M + (1.916 * Math.sin(M * D2R)) + (0.020 * Math.sin(2 * M * D2R)) + 282.634;
  if (L > 360) {
   L = L - 360;
  } else if (L < 0) {
   L = L + 360;
  };

  //calculate the Sun's right ascension
  RA = R2D * Math.atan(0.91764 * Math.tan(L * D2R));
  if (RA > 360) {
   RA = RA - 360;
  } else if (RA < 0) {
   RA = RA + 360;
  };

  //right ascension value needs to be in the same qua
  Lquadrant = (Math.floor(L / (90))) * 90;
  RAquadrant = (Math.floor(RA / 90)) * 90;
  RA = RA + (Lquadrant - RAquadrant);

  //right ascension value needs to be converted into hours
  RA = RA / 15;

  //calculate the Sun's declination
  sinDec = 0.39782 * Math.sin(L * D2R);
  cosDec = Math.cos(Math.asin(sinDec));

  //calculate the Sun's local hour angle
  cosH = (Math.cos(zenith * D2R) - (sinDec * Math.sin(latitude * D2R))) / (cosDec * Math.cos(latitude * D2R));
  var H;
  if (sunrise) {
   H = 360 - R2D * Math.acos(cosH)
  } else {
   H = R2D * Math.acos(cosH)
  };
  H = H / 15;

  //calculate local mean time of rising/setting
  T = H + RA - (0.06571 * t) - 6.622;

  //adjust back to UTC
  UT = T - lnHour;
  if (UT > 24) {
   UT = UT - 24;
  } else if (UT < 0) {
   UT = UT + 24;
  }

  //convert UT value to local time zone of latitude/longitude
  //localT = UT + 1;

  //prevod na hodiny

  var hrs = parseInt(Number(UT));
  var min = Math.round((Number(UT)-hrs) * 60);
  return hrs+':'+min;
}

</script>
</body>
</html>
Uživatelský avatar
elon254
Příspěvky: 1057
Registrován: 09. 12. 2011, 12:40

Výpočet východů a západů slunce

#7

Příspěvek od elon254 »

V podstate pro me je vyuziti takove, jako treba zapinat a vypinat osvetleni podle vypocteneho casu
Na to perfektně funguje soumrakový spínač se světelnou sondou. (Ale proč to dělat jednoduše, když by to šlo udělat složitěji...)
UL 6", UL 14", Meopta AD, 70/900, CZ 8x30, 7x50,
okulary: ATC 32/8/4, Cz 10/16/20, GSO 30, SPL25, TV Radian 18/10/6, TS 8,Vixen LV 4/2,5
filtr: O Ill, UHC, H-beta, solar
http://planety.g6.cz/
http://www.boto.cz
http://elon254.rajce.idnes.cz/
Uživatelský avatar
Flyingman
Příspěvky: 5
Registrován: 14. 06. 2015, 02:50

Výpočet východů a západů slunce

#8

Příspěvek od Flyingman »

Jasne, v hodne pripadech si vystacis se soumrakovym spinacem. A pak mas treba pripad, ze uz neni mozne natahnout dalsi kabel do rozvadece pro centralni rizeni, nebo potrebujes neco rozsvitit se soumrakem a chces, aby se to ve dve rano vypnulo, ale treba jen od pondelka do patku atd.. potrebujes tam dalsi funkce, podminky, zavislosti, ma to s necim komunikovat a tak.. Muzes to kombinovat s dalsima prvkama, delat harakiri.. Proste, potom nastava otazka co je jednoduse a co je slozite ;).
Uživatelský avatar
MilAN
Příspěvky: 24313
Registrován: 17. 04. 2004, 23:56
Bydliště: Jablonec nad Nisou
Věk: 75

Výpočet východů a západů slunce

#9

Příspěvek od MilAN »

No, ale soumrak je velmi proměnlivá veličina , pokud jde o jeho délku ( léto -zima), takže bych nevycházel z času západu /východu, ale z doby , kdy dosáhne Slunce určité hranice pod obzorem- potom by mělo být osvětlení krajiny stejné. Možná, že vyhovuje přesně onen občanský soumrak, kdy je Slunce horním okrajem 6°pod obzorem - čili tak nějak, jak jsi to měl na začátku -zenitová vzdálenost Slunce cca 96°
lepší rada žádná než špatná
milantos(šnek)centrum(puntík) cz
Uživatelský avatar
Flyingman
Příspěvky: 5
Registrován: 14. 06. 2015, 02:50

Výpočet východů a západů slunce

#10

Příspěvek od Flyingman »

Presne tak. To uz je pak jen vec aktualniho nastaveni. Obcansky soumrak, nebo par minut pred tim.. to je hracka, kdyz uz se vzorecky doberou toho ceho maji :-)

Lidi, jeste jednou dekuju za pomoc !
Uživatelský avatar
Psion
Příspěvky: 11563
Registrován: 02. 01. 2001, 05:03
Bydliště: Praha
Věk: 61
Kontaktovat uživatele:

Výpočet východů a západů slunce

#11

Příspěvek od Psion »

On je i rozdíl, zda je zataženo, nebo jasno a samozřejmě taky záleží na místě, kde je umístěno čidlo apod., takže soumrakový spínač je v tomto podle mě lepší.
Odpovědět