基于PVLIB的光伏发电量计算模型:PVWatts–SAPM模型链的原理与全流程解析
1. 引言
光伏发电系统的输出功率受太阳位置、大气透射率、组件温度及逆变器性能等多种因素影响。传统建模方法往往局限于经验公式或单阶段模型,难以系统描述从太阳辐照到电能输出的完整物理链路。
PVLIB-Python 是一个国际主流的开源光伏建模工具库,提供了从太阳位置计算、辐照度分解与倾斜变换、组件温度建模到逆变器 AC 输出的全流程建模框架。
在 PVLIB 的模型链中,SAPM(Sandia Array Performance Model) 用于温度与组件性能修正,PVWatts 模型用于直流–交流功率计算,两者结合构成了光伏性能模拟的核心链路。
本文的主要贡献包括:
- 对 PVLIB 中 PVWatts–SAPM 模型链的物理原理与计算流程进行系统解析;
- 总结模型中关键参数的物理意义与工程取值;
- 给出可复现的伪代码实现流程,为科研建模与工程应用提供参考。
2. 模型总体框架
光伏发电量计算是一个多步骤物理建模过程,从太阳位置和气象数据出发,逐步推导出斜面辐照度、组件温度、直流功率、交流功率和最终发电量。这些步骤通过pvlib等工具实现自动化计算。光伏发电量计算是一个从气象数据出发的多阶段物理建模过程。整体流程如图 1 所示:
该流程广泛应用于光伏电站设计、性能监控和能源管理,帮助优化系统配置、提高发电效率和支持可再生能源决策。下面将逐一深入探讨各环节的公式推导、参数选取。
3. 太阳位置与辐照度计算
3.1. 太阳位置
通过solarposition.get_solarposition计算太阳高度角、方位角等参数,基于精确的天体力学模型,考虑地球轨道偏心率、黄赤交角等天文因素。
3.2. 大气质量(AM)
使用atmosphere.get_relative_airmass和atmosphere.get_absolute_airmass计算相对和绝对大气质量,默认采用Kasten-Young 1989模型。
A M = 1 cos ( θ z ) + 0.50572 × ( 96.07995 − θ z ) − 1.6364 AM = \frac{1}{\cos(\theta_z) + 0.50572 \times (96.07995 - \theta_z)^{-1.6364}} AM=cos(θz)+0.50572×(96.07995−θz)−1.63641
其中:
- θ z \theta_z θz = 太阳天顶角(度)
- 当 θ z > 9 0 ∘ \theta_z > 90^\circ θz>90∘ 时,返回NaN
3.3. 晴空辐照度
若未提供辐照度数据(irradiance=None),则通过clearsky.ineichen模型计算晴空条件下的直接辐照度(DNI)、水平总辐照度(GHI)和散射辐照度(DHI)。
4. 光伏阵列倾斜面辐照度计算
光伏阵列倾斜面总辐照度:是将水平面辐照度转换为倾斜面辐照度(POA),由直接、散射和反射分量三部分组成,公式为:
P O A total = P O A direct + P O A diffuse + P O A ground POA_{\text{total}} = POA_{\text{direct}} + POA_{\text{diffuse}} + POA_{\text{ground}} POAtotal=POAdirect+POAdiffuse+POAground
在 pvlib 中由 irradiance.get_total_irradiance 计算,默认使用 Hay–Davies 模型。
4.1. POA全局辐照度的完整公式
P O A g l o b a l = D N I × cos ( A O I ) + D H I × [ ( 1 − F ) 1 + cos β 2 + F × R b ] + G H I × ρ × 1 − cos ( β ) 2 POA_{global} = DNI \times \cos(AOI) +DHI \times \left[(1-F)\frac{1+\cos\beta}{2} + F \times R_b\right]+ GHI \times \rho \times \frac{1 - \cos(\beta)}{2} POAglobal=DNI×cos(AOI)+DHI×[(1−F)21+cosβ+F×Rb]+GHI×ρ×21−cos(β)
其中:
-
F = D N I E 0 F = \frac{DNI} {E_0} F=E0DNI,晴朗指数,采用Spencer 1971方法(默认):
- E 0 = 1366.1 × [ 1.000110 + 0.034221 cos ( b ) + 0.001280 sin ( b ) + 0.000719 cos ( 2 b ) + 0.000077 sin ( 2 b ) ] E_0 = 1366.1 \times \left[1.000110 + 0.034221\cos(b) + 0.001280\sin(b) + 0.000719\cos(2b) + 0.000077\sin(2b)\right] E0=1366.1×[1.000110+0.034221cos(b)+0.001280sin(b)+0.000719cos(2b)+0.000077sin(2b)]
- 其中:
- b = 2 π ( d o y − 1 ) 365 b = \frac{2\pi(doy - 1)}{365} b=3652π(doy−1) (日角,弧度)
- d o y doy doy = 一年中的第几天(1-365)
-
R b = c o s ( A O I ) c o s ( θ z ) R_b = \frac{cos(AOI)} {cos(θ_z)} Rb=cos(θz)cos(AOI),倾斜面与水平面直射投影比
-
A O I AOI AOI为入射角
A O I = a r c c o s [ cos ( β ) cos ( θ z ) + sin ( β ) sin ( θ z ) cos ( ϕ s − ϕ ) ] AOI = arccos[\cos(\beta)\cos(\theta_{z}) + \sin(\beta) \sin(\theta_{z} )\cos(\phi_{s} - \phi)] AOI=arccos[cos(β)cos(θz)+sin(β)sin(θz)cos(ϕs−ϕ)]- θ z \theta_{z} θz :太阳天顶角,solar_zenith。
- β \beta β :光伏阵列倾角(度),surface_tilt。
- ϕ s \phi_{s} ϕs :太阳方位角,solar_azimuth。
- ϕ \phi ϕ :阵列方位角(北极为0°,南极为180°,东为90°)。
关键参数说明
| 参数 | 单位 | 默认值 | 说明 |
|---|---|---|---|
| DNI | W/m² | - | 法向直射辐照度,需通过太阳位置算法计算 |
| DHI | W/m² | - | 水平散射辐照度 |
| GHI | W/m² | - | 水平全局辐照度 |
| β \beta β | 度 | 用户输入 | 光伏阵列与水平面的夹角 |
| ϕ \phi ϕ | 度 | 用户输入 | 阵列方位角(北为0°,东为90°,南为180°) |
| ρ \rho ρ | - | 0.25 | 地面反射率(草地0.2,雪地0.8,水面0.06) |
注:pvlib使用通过
pvlib.irradiance.get_total_irradiance计算。
5. 组件温度计算
温度模型:默认使用SAPM(Sandia Array Performance Model)温度模型,SAPM温度模型是一种基于经验的物理模型,用于预测光伏组件在不同环境温度和辐照度条件下的直流输出功率,其核心是通过温度修正系数量化温度对组件性能的影响,并结合辐照度、组件参数等输入变量进行功率计算,在PVLIB中通过temperature.sapm_cell计算电池温度。
5.1 模型公式
SAPM 温度模型为经验–物理混合模型,用于计算组件电池温度:
T c e l l = T a i r + E P O A × e a + b × W S + ( E P O A 1000 ) × Δ T T_{cell} = T_{air} + E_{POA} \times e^{a + b \times WS} + \left(\frac{E_{POA}}{1000}\right) \times \Delta T Tcell=Tair+EPOA×ea+b×WS+(1000EPOA)×ΔT
其中:
- T a i r T_{air} Tair 为环境温度 (°C)
- E P O A E_{POA} EPOA 为斜面总辐照度 (W/m²)
- W S WS WS 为风速 (m/s)
- a , b , Δ T a, b, \Delta T a,b,ΔT 为SAPM温度模型参数,取决于安装方式和模块类型
- E P O A × e a + b × W S E_{POA} \times e^{a + b \times WS} EPOA×ea+b×WS:辐照度引起的温升,受风速影响
- E P O A 1000 × Δ T \frac{E_{POA}}{1000} \times \Delta T 1000EPOA×ΔT:辐照度相关的温度修正项
5.2. SAPM 温度模型的 4 种参数组合
| 模型名称 | 安装方式 | 封装材料 | a (℃/(W/m²)) | b (℃/(m/s)) | deltaT (℃) |
|---|---|---|---|---|---|
open_rack_glass_glass |
开放式支架 | 双层玻璃 | -3.47 | -0.0594 | 3 |
close_mount_glass_glass |
密闭安装 | 双层玻璃 | -2.98 | -0.0471 | 1 |
open_rack_glass_polymer |
开放式支架 | 玻璃+聚合物背板 | -3.56 | -0.0750 | 3 |
insulated_back_glass_polymer |
背板保温型 | 玻璃+聚合物背板 | -2.81 | -0.0455 | 0 |
表格说明
- 安装方式:
open_rack:开放式支架(如地面电站),通风良好。close_mount:密闭安装(如屋顶),通风受限。insulated_back:背板带保温层(如寒冷地区),减少热损失。
- 封装材料:
glass_glass:双层玻璃封装,透光率高但散热一般。glass_polymer:玻璃前板+聚合物背板(如PVDF),背板散热更优。
- 参数物理意义:
- a:辐照度每增加1 W/m²,组件温度变化(℃)。绝对值越大,温度对辐照度越敏感。
- b:风速每增加1 m/s,组件温度变化(℃)。绝对值越大,散热对风速响应越强。
- deltaT:基准温度偏移量,补偿模型误差或环境因素(如地面反射热)。
6. 直流发电功率
直流发电功率使用PVWatts模型。
P d c = P d c 0 × P O A g l o b a l 1000 × [ 1 + γ p d c × ( T c e l l − T r e f ) ] P_{dc} = P_{dc0} × \frac {POA_{global}} {1000} × [1 + γ_{pdc} × (T_{cell} - T_{ref})] Pdc=Pdc0×1000POAglobal×[1+γpdc×(Tcell−Tref)]
其中:
- P d c P_{dc} Pdc ,直流功率 (W)
- P d c 0 P_{dc0} Pdc0 ,标准测试条件下的直流额定功率 (W) , 来自厂家
- P O A g l o b a l POA_{global} POAglobal ,平面总辐照度 (W/m²)
- γ p d c γ_{pdc} γpdc , 功率温度系数 (%/°C),典型值 -0.003~-0.005 /°C(单晶硅约-0.004,薄膜约-0.002)
- T c e l l T_{cell} Tcell , 电池温度 (°C)
- T r e f T_{ref} Tref ,参考温度 (°C) ,通常为25°C(STC参考温度)
7. 交流发电功率计算
7.1 PVWatts 逆变器模型
交流发电功率使用PVWatts逆变器模型,与直流模型承接一致。
P A C = P d c × η i n v P_{\text AC} = P_{\text dc} × η_{inv} PAC=Pdc×ηinv
其中
η i n v η_{inv} ηinv,逆变器效率(可采用典型效率曲线或常数值)。
7.2 发电量时间积分
-
时间积分:若输入为时间序列(如
times为DatetimeIndex),则AC功率对时间积分得到发电量(单位:Wh或kWh)。[15]公式为:
E AC = ∑ t P AC ( t ) ⋅ Δ t E_{\text{AC}} = \sum_{t} P_{\text{AC}}(t) \cdot \Delta t EAC=t∑PAC(t)⋅Δt
其中:- Δ t \Delta t Δt为时间步长(如1小时)。[16]
-
最终交流电电量通过以下公式计算:
E AC = ∫ P AC ( t ) d t E_{\text{AC}} = \int P_{\text{AC}}(t) \, dt EAC=∫PAC(t)dt -
实际离散计算:
E A C = ∑ i = 1 n P A C , i E_{AC} = \sum_{i=1}^{n} P_{AC,i} EAC=i=1∑nPAC,i
8. 模型物理意义与讨论
- 地外辐照度 (Extraterrestrial Irradiance):太阳常数为 1366.1 W/m²,考虑日地距离修正约 ±3.3%。
- 大气质量 (Air Mass):表示太阳光在大气中穿透路径长度的相对比,Kasten–Young 模型在天顶角小于 90° 时精度较高。
- SAPM 与 PVWatts 结合优点:SAPM 提供高精度温度修正,PVWatts 提供简洁的功率估算,两者结合实现精度与计算效率的平衡。
- 模型适用性:适用于光伏系统设计、能效诊断及微电网能量管理仿真。
9. 结论
本文基于 PVLIB 框架,系统解析了光伏发电量的完整计算链路。通过结合 SAPM 温度模型 与 PVWatts 功率模型,实现了从气象数据到交流发电量的可复现计算方法。
该模型结构清晰、参数可解释性强,适用于大规模光伏电站性能预测及分布式综合能源系统的能量优化研究。
未来可在此基础上引入 贝叶斯推断 或 卡尔曼滤波 对 PVWatts 参数进行在线更新,从而提升短期发电预测的精度与鲁棒性。
附录:PVLIB 模型链伪代码示例
import pvlib
from pvlib import location, pvsystem, modelchain
# 虚拟一些天气数据
weather = pd.DataFrame([[1050, 1000, 100, 30, 5]],
columns=['ghi', 'dni', 'dhi', 'temp_air', 'wind_speed'],
index=[pd.Timestamp('20250401 1200', tz='US/Arizona')])
# 1. 站点定义
site = location.Location(latitude=31.2, longitude=121.5, tz='Asia/Shanghai')
# 2. 系统参数定义
module_parameters = {'pdc0': 4000, 'gamma_pdc': -0.004}
inverter_parameters = {'pdc0': 4000, 'eta_inv_nom': 0.96}
system = pvsystem.PVSystem(
surface_tilt=30, surface_azimuth=180,
module_parameters=module_parameters,
inverter_parameters=inverter_parameters
)
# 3. 模型链计算
mc = modelchain.ModelChain(system, site,
aoi_model='physical',
spectral_model='no_loss',
temperature_model='sapm',
ac_model='pvwatts')
mc.run_model(weather) # weather 包含 GHI、DHI、DNI、温度、风速等
# 4. 输出结果
print(mc.ac, mc.dc, mc.total_irrad)
参考文献
[1] Holmgren, W. F., Hansen, C. W., & Mikofski, M. A. (2018). pvlib python: a python package for modeling solar energy systems. Journal of Open Source Software, 3(29), 884.
[2] King, D. L., Boyson, W. E., & Kratochvil, J. A. (2004). Photovoltaic Array Performance Model. Sandia National Laboratories.
[3] Dobos, A. P. (2014). PVWatts Version 5 Manual. National Renewable Energy Laboratory (NREL).
[4] Kasten, F., & Young, A. T. (1989). Revised optical air mass tables and approximation formula. Applied Optics, 28(22), 4735–4738.
[5] Spencer, J. W. (1971). Fourier series representation of the position of the sun. Search, 2(5), 172.
[6] Ineichen, P. (2008). A broadband simplified version of the Solis clear sky model. Solar Energy, 82(8), 758–762.
[7] PVLIB 官方文档:https://github.com/pvlib/pvlib-python
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)