有没有人知道一个算法来计算月相或年龄在给定的日期或找到日期的新月/满月在给定的一年?
谷歌告诉我答案在一些天文学书籍中,但我真的不想买一整本书时,我只需要一页。
- 更新日期:**
我应该更好地解释一下我关于谷歌搜索的说法,我确实找到了一些解决方案,这些方案只在一小段时间内有效(比如20世纪);和基于三角函数的解决方案,这比我想的要更昂贵。
S Lott在他的Python书中有几个算法可以计算给定年份的复活节,大多数算法不到10行代码,有些算法可以计算公历中的所有日期。找到3月的满月是找到复活节的关键,所以我认为应该有一个算法不需要三角函数,可以计算公历中的所有日期。
8条答案
按热度按时间ibrsph3r1#
不久前我把一些代码移植到了Python中,我本打算直接链接到它,但结果发现它同时从网络上掉了下来,所以我不得不把它擦干净,重新上传,参见moon.py,它是从John Walker's moontool衍生而来的。
我也找不到一个参考资料来说明它在什么时间跨度上是准确的,但看起来作者们相当严谨。这意味着是的,它确实使用了trig,但我无法想象你会用它来做什么,这会使它在计算上受到限制。Python函数调用的开销可能比trig操作的成本还要多。计算机在计算上相当快。
代码中使用的算法来自以下来源:
**Meeus,Jean.《天文学算法》,里士满:威尔曼-贝尔出版社,1991年,国际标准书号0-943396-35-2。
必备品;如果你只买一本书,一定要买这本。算法是用数学方法提出的,而不是作为计算机程序,但是实现书中许多算法的源代码可以用QuickBasic,Turbo Pascal或C. Meeus分别向出版商订购,Meeus提供了许多计算的工作示例,这些示例对调试代码至关重要,并且经常提出在精度、速度、复杂度和长期(世纪和千年)有效性之间具有不同折衷的若干算法。
Duffett-Smith,Peter,《使用计算器的实用天文学》,第3版,剑桥:剑桥大学出版社,1981年。ISBN 0-521-28411-2。
尽管标题中有计算器一词;这是一个有价值的参考,如果你有兴趣在开发软件,计算行星的位置,轨道,Eclipse,等等。更多的背景信息比在Meeus,这有助于那些还不精通天文学学习经常混淆的术语。算法给出的是简单的,准确性比Meeus提供的,但适合于大多数实际工作。
mlmc2os52#
如果你像我一样,你会努力成为一个细心的程序员,所以当你看到散布在互联网上的随机代码声称要解决一个复杂的天文学问题,却不能解释为什么答案是正确的时,你会感到紧张。
你相信一定有权威的资料来源,如 * 书籍 *,其中包含仔细、完整的解决方案。例如:
《天文学算法》,里士满:威尔曼-贝尔出版社,1991年,国际标准书号0 - 943396 - 35 - 2。
Duffett-Smith,Peter,《使用计算器的实用天文学》,第3版,剑桥:剑桥大学出版社,1981年。ISBN 0 - 521 - 28411 - 2。
您可以信任广泛使用、经过良好测试的开源库,它们可以纠正错误(不像静态网页),下面是基于PyEphem库的Python解决方案,使用月相接口。
这将返回
zzlelutf3#
我认为你在错误的谷歌搜索:
8i9zcol24#
还有pyephem — scientific-grade astronomy routines [PyPI],这是一个Python包,但是有computational guts in C,它 * 确实 * 表示
从-1369到+2950的精度〈0.05英寸。
使用表查找技术限制对三角函数的调用。
o2gm4chl5#
Pyphem默认使用坐标通用(UTC)时间。我想要一个程序,将生成一个满月列表,将是准确的太平洋时区。下面的代码将计算满月为给定的一年,然后调整使用ephem.localtime()方法来校准到所需的时区。它似乎也正确地说明了夏令时以及。感谢理查德,这个代码和他写的很相似。
上面的代码将返回:
qnzebej06#
PyEphem现在被弃用-他们建议在新项目中使用**Skyfield astronomy library**而不是PyEphem。它的现代设计鼓励更好的Python代码,并使用NumPy来加速计算。
月相的定义是月球和太阳在黄道上的夹角,这个夹角的计算方法是月球和太阳的黄道经度之差。
结果是新月的Angular 为0°,上弦月为90°,满月为180°,下弦月为270°。
代码取自此处
产出
8hhllhi27#
我知道你在找Python,但是如果你能理解C#,有一个开源项目叫做Chronos XP,它做得很好。
zzoitvuj8#
如果不需要高精度,您可以随时(ab)使用阴历(或日月)日历类(例如,Microsoft .NET中的
HijriCalendar
或ChineseLunisolarCalendar
)来计算任何日期的(近似)月相,作为日历的“星期几”属性,是阴历(或日月)日历日,* 始终对应于月相 *(例如,第1天是新月,第15天是满月,等等)