☰
太阳天顶角、方位角、赤纬角、均时差与日地距离:从公式到Python实现
2026/10/9 22:15:30 网站建设 项目流程

做光伏选址、建筑节能、农业气象这些行当的人,多少都和太阳天顶角、太阳方位角、日地距离、时差、太阳赤纬角这五个参数打过交道。它们本质是一套“翻译工具”,把日历上的日期和钟表上的时间,翻译成太阳在天空中的真实位置,以及到达地面的辐射强度。这篇文章把这五个参数放在同一条计算链里讲透,给出可以直接落地的公式、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日N=1。这个公式已经足够应对光伏倾角设计、建筑遮阳分析这类工程场景,误差通常在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]) + day

N少算一天或者从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) / 364,E的单位是分钟。这个公式算出来是分钟数,正值表示真太阳时比钟表时间快。

这里有个常见的坑: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.034,7月初约0.967,对应的法向辐照度大约是1407 W/m²和1316 W/m²。

这套公式计算量极小,在光伏发电量模拟、光热系统集热效率分析里我都推荐直接用。只有做需要极高精度的聚光跟踪系统标定时,才需要引入更完整的轨道计算。

2.4 太阳天顶角与方位角:算出最终坐标

有了纬度φ、赤纬角δ和时角H,先求太阳高度角α:

sin α = sin φ × sin δ + cos φ × cos δ × cos H

天顶角θz与高度角互余:θz = 90° − α。

时角H由当地真太阳时换算而来。真太阳时12:00对应H=0,每小时对应15度,下午为正、上午为负。所以:

H = (当地真太阳时 − 12) × 15

当地真太阳时 = 标准时 + (标准子午线经度 − 当地经度) × 4 分钟 + 均时差E

注意修正方向:当地经度在东边,太阳先到,所以如果当地经度比标准子午线更靠东,需要加上时间。我这里公式写成“标准子午线经度 − 当地经度”,比如标准子午线120°E、当地118°E,差值是2度,乘以4分钟等于8分钟,说明当地太阳比标准时晚到8分钟,所以真太阳时要减去8分钟。代入公式就是120−118=2,×4=8,太阳时 = 标准时 + 8? 不对。

让我再仔细推导一下。标准时间是面向整个时区的人为时间,以标准子午线为准。某地经度如果比标准子午线靠西(经度更小),太阳到达该地的时间比标准子午线晚,所以当地真太阳时 = 标准时 − (标准子午线经度 − 当地经度) × 4分钟。以120°E标准、118°E当地为例:120−118=2,×4=8分钟,当地真太阳时 = 标准时 − 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_meridian=120): 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天,N=173。这个值在后面的公式里要反复用到。

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.0349,cos(90.99°)约−0.0173,sin(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.984,sinθ约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.930,sin(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.5,sin23.45°约0.398,第一项约0.199;cos30°约0.866,cos23.45°约0.917,cos27.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个小时的模拟,如果每小时都偏一点,最后的年发电量可能就是几个百分点的误差。这种误差不会让项目“不能用”,但会在和实测数据对不上时让人抓狂。先把它算对,再谈其他的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询