资讯动态

太阳天顶角、方位角、赤纬角、均时差与日地距离:从公式到Python实现

发布时间:2026/10/9 22:15:40 来源:尧图企业网站定制
做光伏选址、建筑节能、农业气象这些行当的人多少都和太阳天顶角、太阳方位角、日地距离、时差、太阳赤纬角这五个参数打过交道。它们本质是一套“翻译工具”把日历上的日期和钟表上的时间翻译成太阳在天空中的真实位置以及到达地面的辐射强度。这篇文章把这五个参数放在同一条计算链里讲透给出可以直接落地的公式、Python代码和自查方法。不管你是正在复核光伏电站的发电量还是做建筑遮阳模拟或者纯粹想搞明白“为什么夏天中午太阳在头顶、冬天又低又偏”这篇都能派上用场。1. 这五个参数到底在描述什么1.1 每个参数解决哪个工程痛点先说太阳赤纬角。它描述的是太阳直射点在地球上的纬度。春分秋分直射赤道赤纬角是0度夏至直射北回归线约23.45度冬至直射南回归线约-23.45度。这个参数决定了太阳一年到头在天空中能爬多高直接关系到光伏板的年发电量、南北向建筑的开窗朝向、温室大棚的透光率。时差更准确叫“均时差”。它解决的是钟表时间和太阳真实时间之间的偏差。我们手表上走的24小时是“平太阳时”而太阳在天空中的位置是按“真太阳时”走的。两者一年到头最多能差到16分钟左右。如果不修正这个偏差计算出来的太阳方位角在日出日落时段会明显偏掉。日地距离修正系数解决的是辐射强度的季节波动。地球绕太阳的轨道是椭圆的1月初离太阳最近7月初最远。距离波动约±1.7%但辐射强度按距离的平方反比变化所以实际辐照度波动约±3.3%。这个修正看似不大但在做年发电量模拟、辐照度校验时它是必须扣掉的误差来源。太阳天顶角和方位角是最终输出。天顶角是太阳光线与天顶方向的夹角可以理解成“太阳偏了多少度”方位角是太阳在地平圈上的投影方向解决“太阳到底在哪边”。光伏支架的倾角朝向、追踪器的旋转角度、建筑遮阳板出挑长度全部靠这两个角度来计算。1.2 它们是怎么咬合在一起的这五个参数不是五个独立的问题而是一条链路上的几个环节。参数物理含义由什么决定主要影响太阳赤纬角直射点纬度日期公转位置太阳高度范围、昼夜长短均时差真太阳时与平太阳时偏差地轴倾角轨道椭圆太阳位置计算的时钟修正日地距离修正辐照度年度波动日期近/远日点单位面积太阳辐射强度太阳天顶角太阳偏离天顶的角度纬度、赤纬、时角大气路径、辐射密度太阳方位角太阳在地平圈投影方向纬度、赤纬、时角朝向、遮阳、追踪从工程实现的角度看输入只有三个日期、时间和经纬度。赤纬角和均时差都是从日期换算出来的中间量时角是把“当地真太阳时”换算成角度的结果有了纬度、赤纬角和时角天顶角和方位角就能通过球面三角公式解出来。日地距离修正则独立叠加到最后一步只影响辐射强度的大小不影响太阳在天空中的坐标。1.3 从输入到输出的完整链路整个过程可以用四步来记日期编号N把“几月几日”换算成一年中的第几天作为所有公式的输入。中间参数计算由N得到赤纬角δ、均时差E、日地距离修正系数R。时间修正把标准时钟表时间修正为当地真太阳时再换算成时角H。最终坐标由纬度φ、赤纬δ、时角H联立求解天顶角θz和方位角γ。理解这条链路之后切到哪个环节都不会迷路。后面我按这个顺序把每个环节的公式和Python实现写清楚。2. 核心公式与代码实现2.1 太阳赤纬角太阳直射点的南北漂移赤纬角的精确值来自天文历书但工程上最常见的是Cooper近似公式δ 23.45 × sin(360 × (284 N) / 365)其中N是日期序数1月1日N1。这个公式已经足够应对光伏倾角设计、建筑遮阳分析这类工程场景误差通常在0.5度以内。如果你需要更精准的结果可以选用如下更高阶的展开式误差可以压到0.01度以内δ 0.006918 − 0.399912×cos(B) 0.070257×sin(B) − 0.006758×cos(2B) 0.000907×sin(2B) − 0.002697×cos(3B) 0.00148×sin(3B)其中B 2π(N−1) / 365单位是弧度算出来的δ单位也是弧度。先说清楚N的算法。平年闰年都要按实际天数累2月29日得算进去。我一般直接用Python的datetime模块或者写一个简单函数def day_of_year(year, month, day): if (year % 4 0 and year % 100 ! 0) or (year % 400 0): feb 29 else: feb 28 days_in_month [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] return sum(days_in_month[:month - 1]) dayN少算一天或者从0开始编号赤纬角差不了多少但时差公式对N很敏感。建议统一用1月1日1的规则这样和各种手册公式都能对上。2.2 均时差钟表和太阳谁更准均时差是太阳位置计算里最容易被忽略、也最容易出错的量。它不是我们平时说的“时差”概念而是由两个天文因素共同造成的一是地球自转轴与公转轨道面有23.45度的倾斜导致太阳赤纬角一年内不是匀速变化二是地球公转轨道是椭圆公转速度在近日点附近快、远日点附近慢。两个因素叠加使太阳在天空中的视运动速度在一年里忽快忽慢。钟表时间是匀速的而真太阳时是变速的二者之差就是均时差。工程上最常用的简化公式是E 9.87 × sin(2B) − 7.53 × cos(B) − 1.5 × sin(B)其中B 360 × (N − 81) / 364E的单位是分钟。这个公式算出来是分钟数正值表示真太阳时比钟表时间快。这里有个常见的坑B的计算里分母是364而不是365减的常数是81而不是从1月1日算起的序号。这套公式来自经验拟合参数不能乱改。我见过有人随手把分母改成365结果时差的相位全部错位计算出来的正午时刻偏出去好几十分钟。如果要做年累计辐照度模拟建议用更高精度的均时差展开式也可以直接调用天文算法库。但光伏初步设计、遮阳模拟这类场景上面的简化公式完全够用。2.3 日地距离修正辐射强度的季节性波动地球在1月初经过近日点日地距离最小7月初经过远日点距离最大。这个距离波动反映到地面辐照度上大约有±3.3%的幅度。别小看这3%多一个年发电量模拟跑下来累计误差可能就是好几百度的发电量差距。工程上常把辐照度修正系数写成这样R 1.00011 0.034221×cos(θ) 0.001280×sin(θ) 0.000719×cos(2θ) 0.000077×sin(2θ)其中θ 2π(N − 1) / 365。注意这个R已经包含了“距离平方反比”的效果直接用它乘以太阳常数就得到该时刻的太阳法向辐照度。太阳常数取1361 W/m²。1月初R约1.0347月初约0.967对应的法向辐照度大约是1407 W/m²和1316 W/m²。这套公式计算量极小在光伏发电量模拟、光热系统集热效率分析里我都推荐直接用。只有做需要极高精度的聚光跟踪系统标定时才需要引入更完整的轨道计算。2.4 太阳天顶角与方位角算出最终坐标有了纬度φ、赤纬角δ和时角H先求太阳高度角αsin α sin φ × sin δ cos φ × cos δ × cos H天顶角θz与高度角互余θz 90° − α。时角H由当地真太阳时换算而来。真太阳时12:00对应H0每小时对应15度下午为正、上午为负。所以H (当地真太阳时 − 12) × 15当地真太阳时 标准时 (标准子午线经度 − 当地经度) × 4 分钟 均时差E注意修正方向当地经度在东边太阳先到所以如果当地经度比标准子午线更靠东需要加上时间。我这里公式写成“标准子午线经度 − 当地经度”比如标准子午线120°E、当地118°E差值是2度乘以4分钟等于8分钟说明当地太阳比标准时晚到8分钟所以真太阳时要减去8分钟。代入公式就是120−1182×48太阳时 标准时 8? 不对。让我再仔细推导一下。标准时间是面向整个时区的人为时间以标准子午线为准。某地经度如果比标准子午线靠西经度更小太阳到达该地的时间比标准子午线晚所以当地真太阳时 标准时 − (标准子午线经度 − 当地经度) × 4分钟。以120°E标准、118°E当地为例120−1182×48分钟当地真太阳时 标准时 − 8分钟。这和我之前算的一致北京时间14:00当地平太阳时13:52。所以正确的表达式是当地平太阳时 标准时 − (标准子午线经度 − 当地经度) × 4分钟或者等效地写当地平太阳时 标准时 (当地经度 − 标准子午线经度) × 4分钟然后再加均时差E得到真太阳时当地真太阳时 当地平太阳时 E / 60 (小时)方位角的计算是容易翻车的地方。我推荐用下面这套基于atan2的公式它能自动处理象限不需要手工判断正负x sin H × cos δ y cos H × sin φ × cos δ − sin δ × cos φ γ atan2(x, y)其中γ是从正南方向起算的角度正值表示向西负值表示向东。如果你习惯方位角从正北起算、顺时针增长那就Az 180° γ这个公式在正午时自动给出γ0早晨给出负值太阳在东侧傍晚给出正值在西侧非常直观。2.5 一个可直接复用的计算函数把所有环节串起来我平时会封装成这样一个函数import math def day_of_year(year, month, day): is_leap (year % 4 0 and year % 100 ! 0) or (year % 400 0) feb 29 if is_leap else 28 days [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] return sum(days[:month - 1]) day def sun_position(lat_deg, lon_deg, year, month, day, hour, minute, std_meridian120): N day_of_year(year, month, day) # 赤纬角度Cooper近似 decl 23.45 * math.sin(math.radians(360 * (284 N) / 365)) # 均时差分钟 B 360 * (N - 81) / 364 eq_time 9.87 * math.sin(math.radians(2 * B)) - 7.53 * math.cos(math.radians(B)) - 1.5 * math.sin(math.radians(B)) # 当地真太阳时小时 std_hour hour minute / 60.0 local_solar_hour std_hour - (std_meridian - lon_deg) / 15.0 eq_time / 60.0 # 时角度正午为0下午为正 H (local_solar_hour - 12) * 15 # 高度角度 lat math.radians(lat_deg) dec math.radians(decl) h_angle math.radians(H) sin_alt math.sin(lat) * math.sin(dec) math.cos(lat) * math.cos(dec) * math.cos(h_angle) altitude math.degrees(math.asin(sin_alt)) zenith 90 - altitude # 方位角从正南起算西正东负 x math.sin(h_angle) * math.cos(dec) y math.cos(h_angle) * math.sin(lat) * math.cos(dec) - math.sin(dec) * math.cos(lat) gamma math.degrees(math.atan2(x, y)) # 换算成从正北起算、顺时针 azimuth gamma 180 if azimuth 0: azimuth 360 if azimuth 360: azimuth - 360 # 日地距离修正系数辐照度修正 theta 2 * math.pi * (N - 1) / 365 r_factor 1.00011 0.034221 * math.cos(theta) 0.00128 * math.sin(theta) 0.000719 * math.cos(2 * theta) 0.000077 * math.sin(2 * theta) return { day_of_year: N, declination_deg: decl, equation_of_time_min: eq_time, solar_hour: local_solar_hour, hour_angle_deg: H, altitude_deg: altitude, zenith_deg: zenith, azimuth_deg_from_north: azimuth, distance_factor: r_factor }这段代码可以直接跑。注意std_meridian默认参数是标准子午线经度。在中国大陆多数项目这个值就用120但在其他地区要换成当地时区的标准子午线经度这是最容易踩的坑之一。3. 按真实场景手算一遍3.1 输入条件与日期编号纸上谈兵没用我们直接拿一个具体场景手算一遍。假设某观测点位于东经118度、北纬30度时间是某闰年6月21日下午14:00。当地采用东经120度作为标准时子午线。先算日期编号N。闰年6月21日1月31天、2月29天、3月31天、4月30天、5月31天到5月底累计152天再加21天N173。这个值在后面的公式里要反复用到。3.2 赤纬、时差、距离修正的计算代入赤纬公式δ 23.45 × sin(360 × (284 173) / 365)先算括号里(284 173) / 365 457 / 365 ≈ 1.252再乘360约450.7度。sin(450.7度)约等于0.9999所以δ约等于23.45度。这个结果符合预期——夏至日太阳直射北回归线附近。再算均时差。B 360 × (173 − 81) / 364 ≈ 90.99度。代入E 9.87 × sin(181.98°) − 7.53 × cos(90.99°) − 1.5 × sin(90.99°)sin(181.98°)约−0.0349cos(90.99°)约−0.0173sin(90.99°)约0.9998。所以E约等于9.87 × (−0.0349) − 7.53 × (−0.0173) − 1.5 × 0.9998 ≈ −0.344 0.130 − 1.500 −1.714分钟正值是真太阳时比钟表快负值就是慢。6月下旬均时差约慢1.7分钟这个数值和天文资料吻合。日地距离修正系数θ 2π × (173 − 1) / 365 ≈ 2.96弧度。cosθ约−0.984sinθ约0.176。代入展开式R ≈ 1.00011 0.034221 × (−0.984) 0.00128 × 0.176 0.000719 × cos(5.92) 0.000077 × sin(5.92)cos(5.92)约0.930sin(5.92)约−0.368。继续算1.00011 − 0.03367 0.000225 0.000669 − 0.000028 ≈ 0.9673这意味着7月初前后太阳法向辐照度只有平均值的96.7%左右。6月21日已经接近远日点太阳常数1361 W/m²乘以0.9673约1317 W/m²。别小看这几十瓦每平米的差距在大型光伏电站年发电量模拟里这会实实在在反映在收益测算报表上。3.3 天顶角、方位角的联立求解先把标准时修正成真太阳时。当地经度118度标准子午线120度差2度。每差1度对应4分钟所以当地平太阳时比标准时晚8分钟14:00 − 8分钟 13:52再叠加均时差−1.714分钟真太阳时约13:50:17。换算成小时约13.838小时。于是时角H (13.838 − 12) × 15 ≈ 27.57度下午为正太阳在西边合理。代入高度角公式sin α sin30° × sin23.45° cos30° × cos23.45° × cos27.57°逐项算sin30°0.5sin23.45°约0.398第一项约0.199cos30°约0.866cos23.45°约0.917cos27.57°约0.886三项相乘约0.704。总和约0.903。α arcsin(0.903) ≈ 64.6度天顶角θz 90 − 64.6 25.4度。太阳几乎在天顶附近这也符合夏季午后低纬度地区的直觉。再算方位角。x sin27.57° × cos23.45° ≈ 0.463 × 0.917 ≈ 0.425。y cos27.57° × sin30° × cos23.45° − sin23.45° × cos30° ≈ 0.886 × 0.5 × 0.917 − 0.398 × 0.866 ≈ 0.407 − 0.345 ≈ 0.062。γ atan2(0.425, 0.062) ≈ 81.7度这是从正南起算向西偏81.7度。换算成从正北起算顺时针方位角Az 180 81.7 261.7度。也就是太阳在西南偏西接近正西方向。下午快两点、夏季高纬度直射点在本例地北边太阳的确会在接近西偏北的位置。3.4 结果解读与工程意义把这一组结果放到场景里看天顶角25.4度说明太阳高度很高大气路径短直射辐照度接近天文辐射峰值。方位角261.7度说明下午时段太阳主要照射西偏南立面对西向窗户的晒热、西向光伏组件的发电贡献都有直接影响。日地距离因子0.9673说明当前处于“辐射淡季”同样的太阳高度角下单位面积接收到的辐照度比12月底低约3.3%。均时差−1.714分钟虽然小但如果不修正计算出的太阳正午会偏移将近2分钟。追踪式光伏支架的日跟踪策略如果基于错误的正午时刻全天累积的角度误差会让发电量损失肉眼可见。这些数字不是孤立的它们会在设计工具里组合出“全年逐时辐照度曲线”“冬至日阴影遮挡时段”等关键输出。算例走通一遍后面切换到任意经纬度和日期都只是换参数的事。4. 高频翻车现场与自查技巧4.1 六个最常见的错误这五个参数虽然公式简单但我在实际项目里见过大量翻车现场。把高频问题列成一张速查表你对号入座排查就行。常见错误现象原因修正方法角度弧度混用天顶角算出负数或超90度公式里的角度直接当成弧度、弧度直接当成角度统一用math.radians转换手算时全部按度处理N从0开始编号赤纬和时差相位偏移日期序数定义不统一统一为1月1日1标准子午线经度用错真太阳时偏差十几分钟把当地经度当成标准子午线以时区标准子午线为准不是本地经度时角符号定义相反方位角变成南北镜像不同教材约定不同用正午为0、下午为正和代码保持一致均时差B公式分母改成365正午时刻偏差较大经验公式参数被随意改动按原式使用364分母、81偏移量方位角用arcsin不判断象限晨昏时段方位角出错单一三角函数无法区分象限改用atan2(x, y)双参数形式“标准子午线经度用错”这条是最隐蔽的。很多人以为北京时间就是以北京经度116度为基准其实标准时子午线是120度。一算下来差了4度也就是16分钟。16分钟在太阳位置计算里意味着时角偏了4度对聚焦式和追踪式系统的角度误差是致命的。4.2 三分钟自查法写完代码后先用四个典型时刻验证春分秋分正午真太阳时12:00天顶角应该约等于当地纬度绝对值。在北半球太阳在正南方位角约180度。夏至正午天顶角约等于 |纬度 − 23.45度|。冬至正午天顶角约等于 |纬度 23.45度|。日出和日落时刻高度角应接近0度北半球夏季日出方位在东北方向冬季在东南方向。如果这四个检查全过计算链大概率是通的。如果其中一项偏了按上表排查通常几分钟就能定位到问题。我再给一个自查小技巧把你算出来的正午时刻和当地“太阳上中天”的常识对比一下。很多地点正午太阳并不在12:00整而是在12:05到12:15之间这完全正常因为经度和均时差都在起作用。如果你的代码永远输出12:00整那说明时间修正环节还没接上。4.3 精度取舍什么时候用简单公式就够了这五个参数存在多套精密度的公式。工程上没必要一味追求最高精度。光伏年发电量模拟、建筑能耗模拟用Cooper赤纬公式和简化均时差即可误差通常在分钟量级对最终结果影响不到1%。光伏组件的输出功率本来就有衰减和温升误差纠结这零点几度没有意义。光伏跟踪支架的倾角策略建议用稍高阶的赤纬展开式并把均时差算准。跟踪器对角度误差敏感误差超过1度就会造成明显的发电损失。聚光光热、定日镜追日系统这就不能用简化公式了需要引入完整的天文历表算法包含章动、光行差、岁差修正。即便如此最终也要靠闭环的光斑反馈来校准。我的原则是先跑通简单版本确认逻辑正确再评估是否有必要上高精度。很多项目卡在计算链路的bug上而不是公式精度上。精度不够好补救方向错误才是大问题。5. 这五个参数在真实项目里怎么用5.1 光伏电站的倾角与阵列间距光伏电站里太阳位置参数最核心的应用是两个固定倾角设计和前后排间距设计。固定倾角粗略可以按“纬度取整”起步然后通过逐时辐照度模拟扫描倾角0到45度选出全年辐射量最大的那个角度。这个过程里赤纬角和日地距离修正系数直接决定了逐时天文辐射量。阵列间距要用冬至日的数据来算因为冬至太阳最低影子最长。以纬度30度、组件阵列前排高度差3米为例。冬至赤纬角约−23.45度正午高度角α 90 − 30 − 23.45 36.55度如果只按正午算间距 S 3 / tan(36.55°) ≈ 4.05米。但工程标准要求上午9点到下午3点不遮挡9点的太阳高度角更低需要按此时的高度角来算间距。取9点真太阳时时角H −45度高度角sin α sin30° × sin(−23.45°) cos30° × cos(−23.45°) × cos(−45°) ≈ −0.199 0.561 0.362α ≈ 21.2度间距 S 3 / tan(21.2°) ≈ 7.73米。比正午的4米多出了一大截。这就是为什么很多电站实际占地比初步估算大很多——只按正午阴影算9点钟就会遮挡。5.2 建筑遮阳与自然采光建筑遮阳设计也离不开方位角和天顶角。水平遮阳板的出挑长度取决于需要遮挡的时段里太阳高度角最低的临界值。纬度偏高地区的夏季午后太阳高度角不那么高水平遮阳板往往出挑不够导致西晒严重。这时可以结合方位角判断阳光是否从正西方向斜射进窗口再决定用垂直遮阳还是水平遮阳。北回归线以北地区朝南窗户适合做水平遮阳因为夏季太阳高度高水平板能有效挡光冬季太阳高度低阳光可以从板下照进室内实现被动采暖。朝西窗户适合做垂直遮阳或可调外遮阳因为下午方位角偏向正西单纯水平板效果有限。这些判断都来自同一套太阳位置计算。5.3 农业气象与生态应用农业里有个常见的需求是判断温室大棚的透光时刻。北回归线以北的温室冬季最需要采光而冬季太阳方位角偏南、高度角低。如果大棚方位选择不当东西向山墙遮挡会直接减少下午的光照时长。用天顶角、方位角计算太阳轨迹后就可以模拟出任意日期从早到晚的光照变化给大棚走向提供量化依据。林果业的行向设计也在用这些参数。合理的行向能让果树在生长季获得更均匀的受光提高果实品质。方法同样是先算出生长季逐时的太阳方位角再评估不同行向下的光照分布。最后分享一点我的使用习惯这套计算我前前后后用了很多年个人体会是别在一开始就盯着公式的“高精度”版本先用最简单的一组公式把整条链路跑通然后用春分、夏至、秋分、冬至四个正午时刻做交叉验证。验证通过后再把高精度公式逐步替换进去。每次替换只改一个环节避免多个误差源叠在一起查都不知道怎么查。另一个被很多人忽略的点是时间系统要统一。日期用公历、标准时用本地时钟、经度用十进制度、赤纬和时角全部转成弧度参与三角函数计算最后再把结果显示成度。代码里的单位混乱往往是所有问题的根源。再补一句均时差虽然只有十几分钟的量级但它在逐时模拟里会改变每一个小时的时角。光伏电站一年8760个小时的模拟如果每小时都偏一点最后的年发电量可能就是几个百分点的误差。这种误差不会让项目“不能用”但会在和实测数据对不上时让人抓狂。先把它算对再谈其他的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑