以下的内容,经过删改,已经发布在果壳网上,转载请注明出处。 商业使用请联系果壳网。
看到Steed的一篇文章《 2012真的会有连续3天地球是黑夜吗?》 辟谣了“ 科学家终于确定了:2012.12. 21地球会有连续3天是黑夜,是地球的换纪时刻。 玛雅人說的并不是世界末日,而是" 2012年12月21日的黑夜来临, 12月22日的黎明不會到來"但3天后,差不多是圣诞, 白天就会到來! ”的说法。但是作为一名死理性派, 我们能够容忍仅仅粉碎一枚谣言吗?我们要算!
出题
- 要求1:
找到2012年12月21太阳落山以后连续出现3天黑暗的地点。 - 要求2:如果无法找到满足要求1的城市,
则找出2012年某地太阳落山以后连续出现3天黑暗的地点。
工具
下面我将一步一步演示如何解决一个问题的思路和方法。 不失一般性,这里只展示了北半球的计算过程, 南半球的情况请自己推演。
方法
首先查找2012年的冬至日,冬至这个词不知道怎么说,查字典, 得到winter solstice,在wolframalpha上查winter solstice in 2012 得到December 21, 2012。考虑到对称性,地球上是不可能有地方满足“要求1: 2012年12月21太阳落山以后连续出现3天黑暗的地点”, 只能看看2012年有三天极夜的地方是哪里了。
3是个好数字,可以对称的,冬至日算1天,之前之后各自1天, 所以就是要找到2012年12月21日,20日, 22日三天是极夜, 而在2012年12月19日和23日有日出的地方。 要获得纬度与日出时间之间的关系, 可以通过立体解析几何的方法推导公式, 不过还需要考虑到地球绕太阳自转的轨道,想想觉得太复杂了。 还是先站在巨人的肩膀上,偷看巨人的答卷好了。
仍然使用wolframalpha, 这里需要引入函数式的思维方式,就是说,不一定了解计算过程, 只要知道输入和输出即可。
再试试不同地点的输入,比如查查莫斯科sunrise in Moscow in dec 21,2012,他们8:59点才天亮啊。由于需要经纬度, 所以要测试下带有经纬度的输入,先查查Moscow latitude and longitude得到55° 45'N, 37° 37' 12"E,那么sunrise at 55° 45'N, 37° 37' 12"E in dec 21,2012呢?成功输出。
这样一个解决问题的函数基本确定了。它的输入格式是" sunrise at 纬度,经度 in dec 21,2012",输出是日出时间或者(never rises)。于是找到3天黑暗的问题重述为:
- sunrise at 纬度,经度 in dec 19,2012,有日出,
- sunrise at 纬度,经度 in dec 20,2012,无日出,
- sunrise at 纬度,经度 in dec 22,2012,无日出,
- sunrise at 纬度,经度 in dec 23,2012,有日出。
考虑到北极圈,从67.5N开始找起,发现4个日期点都是极夜。 而北纬67.4度满足要求:
- 2012年12月19日,北纬67.4度,东经0度,日出11:
51 - 2012年12月20日,北纬67.4度,东经0度,无日出
- 2012年12月22日,北纬67.4度,东经0度,无日出
- 2012年12月23日,北纬67.4度,东经0度,日出11:
53
再往下0.1个纬度找找呢?北纬67. 3度在2012年12月23日的日出时间是11:36am, 看来就是在67.4度附近了。纬度不低于北纬67.3度, 不高于67.5度。
在wolframalpha上查到地球的平均半径Earth average radius是6367.5 km,那么0.1个纬度平均是6367.5km (0.1Pi/ 180)=11.113km。 看来我们的范围可以限定在一个宽度为22km左右的带内。 已经足够高了。
刚才一直使用的是东经0度,下面再测试不同经度。 注意小心国际日期变更线。选择180°W,90°W,0°E, 90°E和180°E分别计算四个日期点。结果都是一样的,赞! 这可是一个长度为6367.5kmcos(67.4/180pi )=2447km,宽度仅为22km的区域啊。
结果
在北纬67.3度到67. 5度之间这个宽度为22km长度为2447km的区域内, 有一些地区将会经历且只经历3天极夜。
讨论
拆开黑箱
太阳入射光与地球赤道平面之间的角度,叫做太阳的赤纬(the declination of the Sun),记做δ☉。太阳赤纬一年中随着季节而变化,夏至时是+ 23°27',冬至时为-23°27'。春分和秋分时为0°。
由于地球绕太阳运转的轨道并不规则,要计算太阳的位置很麻烦, 于是人们推出一个模型,叫做平太阳。 地球绕平太阳以圆形的轨道匀速运动,转一圈是365天。 在1969年Copper提出一个公式用来计算太阳赤纬角:
δ= 23.45 * sin(2pi(284+n)/365)
式中的n是日数,1月1日为n=1, 对于闰年n的计算还要再复杂些。
但这个模型太过于简洁,地球毕竟是绕着真太阳在运转。 于是真实情况和平太阳的模型是有差别的,历史数据可以通过测量获 得。二者之间的误差可以通过实测数据与模型预测数据的差值求出, 然后通过傅立叶变换进行外推拟合。 通过wolframalpha也可以随时查询当前的太阳赤纬。
1971年Spencer,1976年Stine, 1985年Bourges也提出过公式进行拟合,图中显示的是杜 春旭等用2009年的数据对各种太阳赤纬的算法进行了误差比较。 比较准确的是Bourges的方法:
δ= 0.3723+ 23.2567sin(wt) + 0.1149sin(2wt)-0.1712sin(3wt) - 0.7580cos(wt)+ 0.3656cos(2wt) + 0.0201cos(3wt)
其中
- w=360/365.2422
- t=n-1-n0
- n0=78.801+ [0.2422( year-1969)]- INT[0.25(year-1969)]
如果一个地方纬度是L,那么当地正午时分的太阳高度角e=L+ δ,如果e<=0,那么就是太阳一直在地平线之下, 也就是极夜了。 于是找出2012年某地太阳落山以后连续出现3天不出太阳的问题 ,转换成了解方程组
- δ(n)+L<=0
- δ(n+3)+L<=0
注意由于只计算3天的极夜, 相对于一年365天来说是个非常小的量, 于是很小的误差就可能影响我们最终的结果, 此时用Copper的简化公式就不合适了, 直接查询Wolframalpha反而更准确一些。
继续讨论
即使用Bourges的公式也有问题, 因为太阳赤纬只是考虑了太阳向地球照射的角度, 但是从地球上的人观察太阳的位置,特别是日出日落时分, 还有一个重要影响,就是大气折射。当太阳已经落到地平线之下, 由于大气层的折射,仍然可能可以看到太阳的边缘。 所以实际的纬度应该要比计算得出的纬度略微高一点。 想得更复杂一些的话,其实海拔高度也是会影响日出时间的。
结论
在北纬67.3度到67. 5度之间这个宽度约为22km长度约为2447km的区域内, 存在一些地区会在2012年12月19日太阳下山以后, 经历3天的黑暗,直到12月23日才能看到日出。
那么都会有哪些城市呢?其实在北极圈附近, 是有非常多的人类居住的。这个区域覆盖了挪威,瑞典,芬兰, 俄罗斯,美国阿拉斯加,加拿大,格陵兰的广大区域。 这些地方确实有一些城市,在2012年可以享受到三天黑暗。
以上的内容,经过删改,发布在果壳网上,转载请注明出处。 商业使用请联系果壳网。
以下的部分属于继续吐槽,与果壳网的文章没有关系。
阳性科普
好吧,我承认计算极夜长短这个题目很无聊。我是想借此推广一下“ 阳性科普”,这只是个概念,这个概念也没有清晰的定义。 我个人认为的“阳性科普”,是指多讲一些“世界是什么样子的”, 相对而言,阴性科普,就是讲“世界不是什么样子的”。 每一个科学传播网站都面临一个诱惑或者我认为的陷阱, 就是与不科学的观点辩论和斗争。诚然,这是科普的重要组成部分, 但是,在一个有相当多的人类仍然相信一个人可以把海水分开, 可以死后复活的星球上,阴性科普是永远不可能“胜利”的, 而且时间长久以后,会让我觉得有一点点的厌烦。
因此,我也在自己的twitter和微博里:“求各种科普贴, 建议各位推友多做一些各自领域的阳性科普,医推们复习内外妇儿, 程序员们讲解些精妙的算法,五毛们讲解马克思主义经典著作, 公知们从自由主义解释起,文科生用平直中文说说, 理科生不带公式说说……”
医学其实是下游技术,只有上游技术有些进展以后, 才可能有所突破,还有就是上游的技术要“流”到下游, 被医学界所认知以后,才能用到医学上。 我还真是很需要各种领域的科普的。当一个概念科普给我, 我还是能够迅速查找相关的文献进行学习。比如上文中,“赤纬” 是Steed告诉我的,之前我真的不知道这个概念, 不过一旦听说了找到相应的学习资料并非难事。 非我技术专业之内的学问,查查维基百科,中文综述, 中文文献和博士论文之类,也可以了解大概。确有必要的话, 按图索骥找到相应的经典英文文献,也能省不少事情。
函数式的思维方式
上文中的计算方式,是直接调用的wolframalpha。 函数式的思维方式,就是我前面所说的“站在巨人的肩膀上, 偷看巨人的答案”。把大象放进冰箱需要三步,1)打开冰箱门, 2)把大象放进去,3)关上冰箱门。对于解决问题而言, 如果每一步都有现成的解决方案,其实并无必要深入到细节中去, 即使需要深入到细节,也是逐层次的进入。对于一个过程, 了解它的输入、输出,就可以开始应用了。如果原理再了解一些, 则可以更准确和灵活的使用。
医学又是如此, 绝大多数医生不知道为什么测血压时脉搏的声音会出现变化, 但是大家只是知道,if 脉搏声音出现 then 所指压力是收缩压,if 脉搏声音消失 then 所指压力是舒张压。这就是个函数,F(脉搏声音)=血压。 没有医生会在意这个函数与雷诺数之间的关系。
在数学软件出现以后,更可以进行这种函数式的解决问题了。 我高二时参加数学建模竞赛的培训,老师列出了一黑板矩阵以后, 说取个偏导,然后台下就都偏倒了,一片哀号,这可怎么解啊。 那个老师很淡定的说,交给计算机啊, 从那以后我才开始接触mathematica, 好像当时还是运行在386上的4.0版本,由于缺个协处理器, 貌似还有一些东西计算不了。再后来大学学点MatLab, 更坚定了我这种思维方式,边缘检测?调函数;傅立叶变换? 调函数……
站在巨人肩膀上,我以为就是这样子做。
没有评论:
发表评论