sin75度等于多少
恒纪元很快开始了,太阳升起落下开始变得有规律,一个昼夜渐渐固定在十八小时左右,日夜有规律的交替使天气变得暖和了一些。 “恒纪元能持续多长时间?”汪淼问。 “一天或一个世纪,每次多长谁都说不准。”周文王坐在沙漏上,仰头看着正午的太阳,“据记载,西周曾有过长达两个世纪的恒纪元,唉,生在那个时代的人有福啊。”
“那乱纪元会持续多长时间呢?” “不是说过嘛,除了恒纪元都是乱纪元,两者互为对方的间隙。” “那就是说,这是一个全无规律的混乱世界?!”
“是的。文明只能在较长的气候温暖的恒纪元里发展。大部分时间里,人类集体脱水存贮起来,当较长的恒纪元到来时,再集体浸泡复活,生产和建设。”
刘慈欣《三体》
引子:恒纪元
生活在三体世界的人们,处于恒纪元和乱纪元的无序交替中,乱纪元的昼夜和四季是完全无规律的,或者炎热,或者酷寒,只能把人集体脱水变成纸片一样,折叠存放,等待恒纪元的到来再复活。生活在地球的人们,多么幸运啊,从我们人类有记忆以来,一直处于恒纪元之中。恒纪元,就是有一个规律,季节更替,昼夜更替,有规律可循。而中国古代的祖先们,早在几千年前,就观察和总结出规律,用阴阳五行理论进行抽象表达。
日影与阴阳
大家都知道中午最热,晨昏变凉,夏天最热,冬季最凉,昼夜和四季之间温度变化的背后,是太阳光照射地表角度的不同。要问一句为什么太阳斜射时不如直射时更温暖,冷不丁能把人给问懵了。下面是通俗的解释,地球外面被大气层包裹,就像盖了一层棉被。太阳光要穿过大气层到达地球表面,旅途中产生漫反射等等原因,被大气层截留了一部分热量。穿过大气层的行程距离越远,被截留的越多。
太阳直射时,行程最短(大气层厚度),太阳光到达地球表面的热量最多。而斜射时,行程距离为大气层厚度/夹角余弦值。当夹角接近90度时,余弦值为0,行程距离无限大,太阳光照不到地表,天黑了。夹角再变大,成为钝角之后,地球表面会被另一半所遮挡,完全进入黑夜模式。
太阳光照射角度,对应到地球表面易于观察的日影来说,影长=夹角的正切值*杆高。在0到90度范围内,夹角越大,影长越大。夹角大于等于90度的时候,天要黑了,你可以说没有影子,也可以说影子无限长,为了统一公式,我更愿意把它看成影子无限长。
如果我们要把一年的四季更替,用阴阳来抽象表达,那么,取日影长度(进一步限定为正午日影长度)是可选途径之一。
日影长度的归一化
在极坐标内,将一年365天的每日正午影长均匀绘制在一个圆周内,日影用涂黑表示(阴),阳光用留白表示(阳),用于直观观察一年内的日影长度变化和阴阳转化。这样形成了日影太极图。
不同纬度地区的日影太极图,阴阳转换的时间节点和缓急程度是不同的。
为了直观表达太极图内的阴阳转化和消长,每个纬度地方的太极图,大圆的半径表示阴+阳的总和,用单位长度1来表示。那么最好让阴阳的值变化范围都能在0到1之间,[0,1]。这就需要把日影长度进行归一化,最长日影,对应1,最短日影,对应0,一般日影的归一化值=(日影长度-最短日影)/(最长日影-最短日影)。
更特殊的情况,北极圈和南极圈之内,处于极夜模式下,正午日光夹角大于等于90度的,日影长度无穷大。那么最大日影长度无穷大,所以任何有限大的日影长度,归一化之后都是0,极夜模式下无限长的日影,归一值为1。
南极点和北极点的太极图
对于北极点,春分日,日光与圭标的夹角90度,日影长度,无限大;过了春分日这个点,太阳升起,进入极昼模式,半年后才落下。
春分日—夏至日—秋分日(不包含二分日)的日影长度为杆高*tan(22.5至90之间),为有限大的长度。秋分日太阳落下,进入极夜模式,秋分日—冬至日—春分日(包含二分日)日影长度为无限大。
以日影长度最大值为半径画圆做阴阳图,任何不是无限大的数,跟无限大比等同于零。阴阳图如下:。
通用纬度的太极图
根据上文给出的方法,可以绘制任意纬度的日影太极图。这里给出了赤道、南北极、南北回归线、南北纬10度(回归线内)、南北纬40度、南北纬60度、南北纬75度(极圈内)13个点的太极图。
Python实现代码
import numpy as npimport mathimport matplotlib.pyplot as plt
poll_height = 1000spoke_degree = np.linspace(start=0, stop=2 * np.pi, num=365)# Cx,Cy定义太极图外圆的图形Cx = poll_height * np.sin(spoke_degree)Cy = poll_height * np.cos(spoke_degree)#二十四节气标注点solar_terms = [‘夏至’,’小暑’,’大暑’,’立秋’,’处暑’,’白露’,’秋分’,’寒露’,’霜降’,’立冬’,’小雪’,’大雪’,’冬至’,’小寒’,’大寒’,’立春’,’雨水’,’惊蛰’,’春分’,’清明’,’谷雨’,’立夏’,’小满’,’芒种’]subsolar_point = [abs(i-182.6)*45.0/182.6 – 22.5 for i in range(365)]#太阳直射点的维度变化
def get_included_angle(local_latitude): “输入当地维度,给出每日太阳光线与垂直圭的夹角,夹角为正表示日影在北,夹角为负表示日影在南,夹角绝对值大于等于90度为极夜” included_angle= [local_latitude – x for x in subsolar_point] return included_angle
def get_max_min_included_angle(local_latitude): “输入当地维度,给出太阳光线与垂直圭夹角的最大值和最小值” included_angle = get_included_angle(local_latitude) abs_included_angle = included_angle for i in range(0,len(included_angle)): abs_included_angle[i]= math.fabs(included_angle[i]) return [max(abs_included_angle),min(abs_included_angle)]
def get_shadow_normalization(local_latitude): “输入当地维度,给出一年365天日影长度的归一化序列,大于0表示影子在北,小于0表示影子在南,1表示最大,0表示最小” shadow_list = [0]*365 included_angle = get_included_angle(local_latitude) max_min_included_angle = get_max_min_included_angle(local_latitude) if max_min_included_angle[0] < 90:#南北极圈之外的区域,不会出现极夜极昼,用日影长度来代表阴阳,从0到1之间的一个数字 max_shadow = math.tan(max_min_included_angle[0] * np.pi / 180) # 最长日影 min_shadow = math.tan(max_min_included_angle[1] * np.pi / 180) # 最短日影 diff_max_min = max_shadow – min_shadow for i in range(365): today_shadow = math.tan(included_angle[i] * np.pi/180) shadow_list[i] = 0 if today_shadow == 0 else (math.fabs(today_shadow) – min_shadow) / diff_max_min else:#南北极圈之内的区域,极夜为纯阴0,极昼为纯阳1 for i in range(365): if math.fabs(included_angle[i]) >= 90:#极夜 shadow_list[i]=1 else:#有白日 shadow_list[i]=0 return shadow_list
def get_local_extremum(normal_shadow_list): ‘找到局部极值,拐点;给出类型(最大值,最小值,局部最大值,局部最小值)以及位置序列号index’
def draw_taichi_diagram(local_latitude): ‘绘出给定纬度日影观测形成的阴阳太极图’ plt.plot(Cx, Cy, ‘k’) # 画外圆,黑色线条 shadow_position = True #用于表示阴影绘制在圆心侧True,还是圆周侧False。发生拐点时,进行切换 shadow_percent_list = get_shadow_normalization(local_latitude) if abs(local_latitude) >= 67.5: #南极圈北极圈之内,阴阳分离状态 for x in range(len(shadow_percent_list)): if shadow_percent_list[x] != 0: plt.plot([0,Cx[x]], [0, Cy[x]], color=’k’) else:#不在南北极圈之内,阴阳转化 peak_index = 0 for i in range(365): if (shadow_percent_list[i] – shadow_percent_list[i-1])*(shadow_percent_list[(i+1) % 365]-shadow_percent_list[i]) <= 0 and shadow_percent_list[i] <= 0.03:#寻找绘图起始点,避免图有断点 peak_index=i break print(‘%2.1f拐点在%d’ %(local_latitude,peak_index)) for i in range(peak_index,peak_index+365): if (shadow_percent_list[i % 365]-shadow_percent_list[(i-1) % 365])*(shadow_percent_list[(i+1) % 365]-shadow_percent_list[i % 365]) <= 0 and abs(shadow_percent_list[i % 365]-0.5) >= 0.47: shadow_position = not shadow_position Xp1 = 0 if shadow_position else Cx[i % 365] Yp1 = 0 if shadow_position else Cy[i % 365] Xp2 = shadow_percent_list[i % 365]*Cx[i % 365]if shadow_position else (1-shadow_percent_list[i % 365])*Cx[i % 365] Yp2 = shadow_percent_list[i % 365] * Cy[i % 365] if shadow_position else (1 – shadow_percent_list[i % 365]) * Cy[i % 365] plt.plot([Xp1, Xp2], [Yp1, Yp2], color=’k’) print(‘纬度:%2.1f’% (local_latitude)) plt.axis(‘equal’) plt.axis(‘off’) position_title = ‘北纬’ if local_latitude >0 else ‘南纬’ if local_latitude > 0: position_title = ‘北纬’ else: position_title = ‘南纬’ if local_latitude < 0 else ‘赤道’ plt.title(position_title+”%2.1f度日影生成阴阳图” % (abs(local_latitude)), fontproperties=”SimSun”, fontsize=18, loc=’center’) for j in range(0, len(solar_terms)): plt.annotate(solar_terms[j], [poll_height * np.sin(j * np.pi / 12), poll_height * np.cos(j * np.pi / 12)], [poll_height * np.sin(j * np.pi / 12) * 1.2 – poll_height * 0.05, poll_height * np.cos(j * np.pi / 12) * 1.1 – poll_height * 0.05], arrowprops=dict(facecolor=’black’, width=1, headwidth=3, shrink=0.05), fontsize=10, fontproperties=”SimSun”)
latitude_to_draw_list=[-90,-75,-60,-40,-22.5,-10,0,10,22.5,40,60,75,90]
def draw_taichi_diagrams(latitude_to_draw_list): “输入需要做图的维度列表,给出图形”
length_draw_list= len(latitude_to_draw_list) if length_draw_list<4: plt.figure(figsize=(10,10*length_draw_list)) for i in range(length_draw_list): plt.subplot(length_draw_list,1,i,) draw_taichi_diagram(latitude_to_draw_list[i]) else: plt.figure(figsize=(10*3,10*math.ceil(length_draw_list/3))) for i in range(length_draw_list): plt.subplot(math.ceil(length_draw_list/3),3,i+1) draw_taichi_diagram(latitude_to_draw_list[i])
draw_taichi_diagrams(latitude_to_draw_list)plt.savefig(‘太极图.png’,format=’png’)
plt.show()
北极
我站在北極點上
一年隻有一天
春分
太陽從東邊升起
夏至
正午的陽光照耀着大地
秋分
夕陽西下,黃昏來了
冬至
是無盡的寒夜