Last active
November 30, 2020 07:17
-
-
Save siedentop/d0ff7fc6f7831a1411b02ed9858d48bd to your computer and use it in GitHub Desktop.
Compute the northern latitude where total daylight time is the same in May (31 days) and June (30 days).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
""" | |
Reference: https://twitter.com/djg98115/status/1333275207369277442 | |
http://mathforum.org/library/drmath/view/56478.html | |
D = daylength | |
L = latitude | |
J = day of the year | |
P = asin[.39795*cos(.2163108 + 2*atan{.9671396*tan[.00860(J-186)]})] | |
_ _ | |
/ sin(0.8333*pi/180) + sin(L*pi/180)*sin(P) \ | |
D = 24 - (24/pi)*acos{ ----------------------------------------- } | |
\_ cos(L*pi/180)*cos(P) _/ | |
""" | |
import pint # Not used just kept to show my good intention. | |
from math import asin, cos, atan, tan, sin, pi, acos | |
from datetime import date | |
from scipy import optimize | |
def daylength(latitude, day_of_year): | |
P = p_helper(day_of_year) | |
numerator = sin(0.8333 * pi / 180) + sin(latitude * pi / 180) * sin(P) | |
denominator = cos(latitude * pi / 180) * cos(P) | |
D = 24 - (24 / pi) * acos(numerator / denominator) | |
return D | |
def p_helper(day_of_year): | |
return asin( | |
0.39795 | |
* cos(0.2163108 + 2 * atan(0.9671396 * tan(0.00860 * (day_of_year - 186)))) | |
) | |
def daylength_range(start, stop, latitude): | |
return sum(daylength(latitude=latitude, day_of_year=d) for d in range(start, stop)) | |
def daylength_may(latitude): | |
jan1 = date(2021, 1, 1) | |
start = (date(2021, 5, 1) - jan1).days | |
end = (date(2021, 5, 31) - jan1).days | |
return daylength_range(start, end, latitude=latitude) | |
def daylength_june(latitude): | |
jan1 = date(2021, 1, 1) | |
start = (date(2021, 6, 1) - jan1).days | |
end = (date(2021, 6, 30) - jan1).days | |
return daylength_range(start, end, latitude=latitude) | |
if __name__ == "__main__": | |
def f(lat): | |
if lat < 0.1 or lat > 90.0: | |
return 100000 | |
diff = daylength_may(latitude=lat) - daylength_june(latitude=lat) | |
return diff ** 2 | |
result = optimize.minimize_scalar(f) | |
if result.success: | |
latitude = result.x | |
may = daylength_may(latitude=latitude) | |
june = daylength_june(latitude=latitude) | |
print(f"At latitude {latitude}") | |
print(f"May has a total of \t{may} hours of daylight. Avg: {may/31}") | |
print(f"June has a total of \t{june} hours of daylight. Avg: {june / 30}") | |
else: | |
print(f"Failed to find result. {result}") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[[source]] | |
url = "https://pypi.org/simple" | |
verify_ssl = true | |
name = "pypi" | |
[packages] | |
pint = "*" | |
sympy = "*" | |
scipy = "*" | |
[dev-packages] | |
[requires] | |
python_version = "3.8" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"_meta": { | |
"hash": { | |
"sha256": "630de5e478402d0bc4eb2c98b3ee0615132440cf3368575a577ac2e2b0b4f0d3" | |
}, | |
"pipfile-spec": 6, | |
"requires": { | |
"python_version": "3.8" | |
}, | |
"sources": [ | |
{ | |
"name": "pypi", | |
"url": "https://pypi.org/simple", | |
"verify_ssl": true | |
} | |
] | |
}, | |
"default": { | |
"mpmath": { | |
"hashes": [ | |
"sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6" | |
], | |
"version": "==1.1.0" | |
}, | |
"numpy": { | |
"hashes": [ | |
"sha256:08308c38e44cc926bdfce99498b21eec1f848d24c302519e64203a8da99a97db", | |
"sha256:09c12096d843b90eafd01ea1b3307e78ddd47a55855ad402b157b6c4862197ce", | |
"sha256:13d166f77d6dc02c0a73c1101dd87fdf01339febec1030bd810dcd53fff3b0f1", | |
"sha256:141ec3a3300ab89c7f2b0775289954d193cc8edb621ea05f99db9cb181530512", | |
"sha256:16c1b388cc31a9baa06d91a19366fb99ddbe1c7b205293ed072211ee5bac1ed2", | |
"sha256:18bed2bcb39e3f758296584337966e68d2d5ba6aab7e038688ad53c8f889f757", | |
"sha256:1aeef46a13e51931c0b1cf8ae1168b4a55ecd282e6688fdb0a948cc5a1d5afb9", | |
"sha256:27d3f3b9e3406579a8af3a9f262f5339005dd25e0ecf3cf1559ff8a49ed5cbf2", | |
"sha256:2a2740aa9733d2e5b2dfb33639d98a64c3b0f24765fed86b0fd2aec07f6a0a08", | |
"sha256:4377e10b874e653fe96985c05feed2225c912e328c8a26541f7fc600fb9c637b", | |
"sha256:448ebb1b3bf64c0267d6b09a7cba26b5ae61b6d2dbabff7c91b660c7eccf2bdb", | |
"sha256:50e86c076611212ca62e5a59f518edafe0c0730f7d9195fec718da1a5c2bb1fc", | |
"sha256:5734bdc0342aba9dfc6f04920988140fb41234db42381cf7ccba64169f9fe7ac", | |
"sha256:64324f64f90a9e4ef732be0928be853eee378fd6a01be21a0a8469c4f2682c83", | |
"sha256:6ae6c680f3ebf1cf7ad1d7748868b39d9f900836df774c453c11c5440bc15b36", | |
"sha256:6d7593a705d662be5bfe24111af14763016765f43cb6923ed86223f965f52387", | |
"sha256:8cac8790a6b1ddf88640a9267ee67b1aee7a57dfa2d2dd33999d080bc8ee3a0f", | |
"sha256:8ece138c3a16db8c1ad38f52eb32be6086cc72f403150a79336eb2045723a1ad", | |
"sha256:9eeb7d1d04b117ac0d38719915ae169aa6b61fca227b0b7d198d43728f0c879c", | |
"sha256:a09f98011236a419ee3f49cedc9ef27d7a1651df07810ae430a6b06576e0b414", | |
"sha256:a5d897c14513590a85774180be713f692df6fa8ecf6483e561a6d47309566f37", | |
"sha256:ad6f2ff5b1989a4899bf89800a671d71b1612e5ff40866d1f4d8bcf48d4e5764", | |
"sha256:c42c4b73121caf0ed6cd795512c9c09c52a7287b04d105d112068c1736d7c753", | |
"sha256:cb1017eec5257e9ac6209ac172058c430e834d5d2bc21961dceeb79d111e5909", | |
"sha256:d6c7bb82883680e168b55b49c70af29b84b84abb161cbac2800e8fcb6f2109b6", | |
"sha256:e452dc66e08a4ce642a961f134814258a082832c78c90351b75c41ad16f79f63", | |
"sha256:e5b6ed0f0b42317050c88022349d994fe72bfe35f5908617512cd8c8ef9da2a9", | |
"sha256:e9b30d4bd69498fc0c3fe9db5f62fffbb06b8eb9321f92cc970f2969be5e3949", | |
"sha256:ec149b90019852266fec2341ce1db513b843e496d5a8e8cdb5ced1923a92faab", | |
"sha256:edb01671b3caae1ca00881686003d16c2209e07b7ef8b7639f1867852b948f7c", | |
"sha256:f0d3929fe88ee1c155129ecd82f981b8856c5d97bcb0d5f23e9b4242e79d1de3", | |
"sha256:f29454410db6ef8126c83bd3c968d143304633d45dc57b51252afbd79d700893", | |
"sha256:fe45becb4c2f72a0907c1d0246ea6449fe7a9e2293bb0e11c4e9a32bb0930a15", | |
"sha256:fedbd128668ead37f33917820b704784aff695e0019309ad446a6d0b065b57e4" | |
], | |
"markers": "python_version >= '3.6'", | |
"version": "==1.19.4" | |
}, | |
"packaging": { | |
"hashes": [ | |
"sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236", | |
"sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376" | |
], | |
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", | |
"version": "==20.7" | |
}, | |
"pint": { | |
"hashes": [ | |
"sha256:63ccb7153754923fd95477be69dcf8d7d0764ec2ebb3f6945f920c31fdf13392", | |
"sha256:d43a2e9ae003164978b60fdf8cd920d8581e1a5991df8dded29b00f4850ec83a" | |
], | |
"index": "pypi", | |
"version": "==0.16.1" | |
}, | |
"pyparsing": { | |
"hashes": [ | |
"sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", | |
"sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" | |
], | |
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", | |
"version": "==2.4.7" | |
}, | |
"scipy": { | |
"hashes": [ | |
"sha256:168c45c0c32e23f613db7c9e4e780bc61982d71dcd406ead746c7c7c2f2004ce", | |
"sha256:213bc59191da2f479984ad4ec39406bf949a99aba70e9237b916ce7547b6ef42", | |
"sha256:25b241034215247481f53355e05f9e25462682b13bd9191359075682adcd9554", | |
"sha256:2c872de0c69ed20fb1a9b9cf6f77298b04a26f0b8720a5457be08be254366c6e", | |
"sha256:3397c129b479846d7eaa18f999369a24322d008fac0782e7828fa567358c36ce", | |
"sha256:368c0f69f93186309e1b4beb8e26d51dd6f5010b79264c0f1e9ca00cd92ea8c9", | |
"sha256:3d5db5d815370c28d938cf9b0809dade4acf7aba57eaf7ef733bfedc9b2474c4", | |
"sha256:4598cf03136067000855d6b44d7a1f4f46994164bcd450fb2c3d481afc25dd06", | |
"sha256:4a453d5e5689de62e5d38edf40af3f17560bfd63c9c5bd228c18c1f99afa155b", | |
"sha256:4f12d13ffbc16e988fa40809cbbd7a8b45bc05ff6ea0ba8e3e41f6f4db3a9e47", | |
"sha256:634568a3018bc16a83cda28d4f7aed0d803dd5618facb36e977e53b2df868443", | |
"sha256:65923bc3809524e46fb7eb4d6346552cbb6a1ffc41be748535aa502a2e3d3389", | |
"sha256:6b0ceb23560f46dd236a8ad4378fc40bad1783e997604ba845e131d6c680963e", | |
"sha256:8c8d6ca19c8497344b810b0b0344f8375af5f6bb9c98bd42e33f747417ab3f57", | |
"sha256:9ad4fcddcbf5dc67619379782e6aeef41218a79e17979aaed01ed099876c0e62", | |
"sha256:a254b98dbcc744c723a838c03b74a8a34c0558c9ac5c86d5561703362231107d", | |
"sha256:b03c4338d6d3d299e8ca494194c0ae4f611548da59e3c038813f1a43976cb437", | |
"sha256:cc1f78ebc982cd0602c9a7615d878396bec94908db67d4ecddca864d049112f2", | |
"sha256:d6d25c41a009e3c6b7e757338948d0076ee1dd1770d1c09ec131f11946883c54", | |
"sha256:d84cadd7d7998433334c99fa55bcba0d8b4aeff0edb123b2a1dfcface538e474", | |
"sha256:e360cb2299028d0b0d0f65a5c5e51fc16a335f1603aa2357c25766c8dab56938", | |
"sha256:e98d49a5717369d8241d6cf33ecb0ca72deee392414118198a8e5b4c35c56340", | |
"sha256:ed572470af2438b526ea574ff8f05e7f39b44ac37f712105e57fc4d53a6fb660", | |
"sha256:f87b39f4d69cf7d7529d7b1098cb712033b17ea7714aed831b95628f483fd012", | |
"sha256:fa789583fc94a7689b45834453fec095245c7e69c58561dc159b5d5277057e4c" | |
], | |
"index": "pypi", | |
"version": "==1.5.4" | |
}, | |
"sympy": { | |
"hashes": [ | |
"sha256:09aa4b3075e505108cb84785ba358e58a53d9596c8c71f07b613958b9150c481", | |
"sha256:9104004669cda847f38cfd8cd16dd174952c537349dbae740fea5331d2b3a51b" | |
], | |
"index": "pypi", | |
"version": "==1.7" | |
} | |
}, | |
"develop": {} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment