星期日, 十二月 25, 2011

假如给我三天黑暗



以下的内容,经过删改,已经发布在果壳网上,转载请注明出处。商业使用请联系果壳网。

看到Steed的一篇文章2012真的会有连续3地球是黑夜吗?》 辟谣了“科学家终于确定了:2012.12.21地球会有连续3是黑夜,是地球的换纪时刻。玛雅人說的并不是世界末日,而是" 2012年12月21日的黑夜来临, 12月22日的黎明不會到來"但3后,差不多是圣诞,就会到來! ”的说法。但是作为一名死理性派,们能够容忍仅仅粉碎一枚谣言吗?们要算!

出题

  • 要求1:找到2012年12月21太阳落山以后连续出现3黑暗的地点。
  • 要求2:如果无法找到满足要求1的城市,则找出2012年某地太阳落山以后连续出现3黑暗的地点。

工具

地球上最强大的计算器之一:Wolframalpha这是iPhone 4S里人工智能Siri幕后的大脑。通过www.wolframalpha.com们可以计算很多东西,包括你的各种作业。
下面将一步一步演示如何解决一个问题的思路和方法。不失一般性,这里只展示了北半球的计算过程,南半球的情况请自己推演。

方法

首先查找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,这里需要引入函数式的思维方式,就是说,不一定了解计算过程,只要知道输入和输出即可。
首先测试一下输入是否符合规范,搜索日出sunriseWolframalpha出了今北京的日出时间,再查查sunrise in dec 21,2012,也有输出是7:34am。这样很好。
再试试不同地点的输入,比如查查莫斯科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呢?成功输出。
考虑到北极圈是北纬67.5度,说明冬至日高于此纬度的一定是极夜,看看没有日出的输出是怎样的?查查sunrise at 70N, 0E in dec 21,2012 得到(never rises)
这样一个解决问题的函数基本确定了。它的输入格式是"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,更坚定了这种思维方式,边缘检测?调函数;傅立叶变换?调函数……
站在巨人肩膀上,以为就是这样子做。

参考文献

  1. Table of the Declination of the Sun: Mean Value for the Four Years of a Leap-Year Cycle
  2. 一种高精度太阳位置算法

没有评论: