如何用pvlib计算固定安装的CECMod光伏组件的能量输出
解决固定安装CECMod组件的能量输出计算问题
没问题!要计算固定安装的CECMod组件能量输出,只需要把原代码中单轴跟踪器的部分替换成你实际的固定安装倾角和方位角参数就行。CEC模型本身和组件的安装方式无关——它只依赖入射到组件表面的有效辐照度和电池温度,所以核心逻辑不需要大改,只需要调整**表面倾角、方位角和入射角(AOI)**的计算方式。
下面是修改后的完整代码,我标注了关键改动的地方:
import pvlib import pandas as pd import os # 补充原代码遗漏的导入 YEAR = 1990 STARTDATE = '%d-01-01T00:00:00' % YEAR ENDDATE = '%d-12-31T23:59:59' % YEAR TIMES = pd.date_range(start=STARTDATE, end=ENDDATE, freq='H') INVERTERS = pvlib.pvsystem.retrieve_sam('CECInverter') INVERTER_10K = INVERTERS['SMA_America__SB10000TL_US__240V_'] CECMODS = pvlib.pvsystem.retrieve_sam('CECMod') CECMOD_POLY = CECMODS['Canadian_Solar_Inc__CS6X_300P'] CECMOD_MONO = CECMODS['Canadian_Solar_Inc__CS6X_300M'] LATITUDE, LONGITUDE = 40.5137, -108.5449 NREL_API_KEY = os.getenv('NREL_API_KEY', 'DEMO_KEY') EMAIL = os.getenv('EMAIL', 'bwana...@yahoo.com') header, data = pvlib.iotools.get_psm3(LATITUDE, LONGITUDE, NREL_API_KEY, EMAIL) data.index = TIMES # 获取太阳位置 sp = pvlib.solarposition.get_solarposition( TIMES, LATITUDE, LONGITUDE) solar_zenith = sp.apparent_zenith.values solar_azimuth = sp.azimuth.values dni = data.DNI.values ghi = data.GHI.values dhi = data.DHI.values surface_albedo = data['Surface Albedo'].values temp_air = data.Temperature.values dni_extra = pvlib.irradiance.get_extra_radiation(TIMES).values # -------------------------- 关键改动:替换单轴跟踪器为固定安装参数 -------------------------- # 替换成你的实际安装参数:北半球常用倾角=纬度,方位角正南(180°) SURFACE_TILT = LATITUDE # 示例:等于纬度的倾角,可根据实际调整 SURFACE_AZIMUTH = 180 # 正南(北半球);南半球请设为0(正北) # 计算固定安装组件的入射角(AOI) aoi = pvlib.irradiance.aoi( surface_tilt=SURFACE_TILT, surface_azimuth=SURFACE_AZIMUTH, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth ) # ---------------------------------------------------------------------------------------- # 计算POA天空漫射辐照度 poa_sky_diffuse = pvlib.irradiance.get_sky_diffuse( surface_tilt=SURFACE_TILT, # 使用固定倾角 surface_azimuth=SURFACE_AZIMUTH, # 使用固定方位角 solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, dni=dni, ghi=ghi, dhi=dhi, dni_extra=dni_extra, model='haydavies' ) # 计算POA地面反射漫射辐照度 poa_ground_diffuse = pvlib.irradiance.get_ground_diffuse( surface_tilt=SURFACE_TILT, # 使用固定倾角 ghi=ghi, albedo=surface_albedo ) # 计算总POA辐照度 poa = pvlib.irradiance.poa_components( aoi=aoi, dni=dni, poa_sky_diffuse=poa_sky_diffuse, poa_ground_diffuse=poa_ground_diffuse ) poa_direct = poa['poa_direct'] poa_diffuse = poa['poa_diffuse'] poa_global = poa['poa_global'] # 计算入射角修正系数(IAM) iam = pvlib.iam.ashrae(aoi) # 计算有效辐照度 effective_irradiance = poa_direct*iam + poa_diffuse # 计算电池温度 temp_cell = pvlib.temperature.pvsyst_cell(poa_global, temp_air) # CEC模型计算参数及最大功率点 cecparams = pvlib.pvsystem.calcparams_cec( effective_irradiance, temp_cell, CECMOD_MONO.alpha_sc, CECMOD_MONO.a_ref, CECMOD_MONO.I_L_ref, CECMOD_MONO.I_o_ref, CECMOD_MONO.R_sh_ref, CECMOD_MONO.R_s, CECMOD_MONO.Adjust) mpp = pvlib.pvsystem.max_power_point(*cecparams, method='newton') mpp = pd.DataFrame(mpp, index=TIMES) # 计算每日能量输出 Edaily = mpp.p_mp.resample('D').sum()
关键改动说明:
- 移除单轴跟踪器逻辑:删掉了
pvlib.tracking.singleaxis()相关代码,换成固定安装的参数配置。 - 设置固定倾角和方位角:
SURFACE_TILT:可根据实际安装情况调整,北半球常用“纬度±10°”的倾角来最大化年发电量;SURFACE_AZIMUTH:北半球设为180°(正南),南半球设为0°(正北),若为偏东/西安装,对应调整数值即可。
- 计算固定安装的AOI:使用
pvlib.irradiance.aoi()函数,传入固定表面参数和太阳位置,得到精准的入射角。
额外提示:
- 如果需要更精准的辐照度计算,可以替换
get_sky_diffuse()的模型(比如'isotropic'、'klucher'等); - 务必确保
SURFACE_TILT和SURFACE_AZIMUTH与实际安装完全匹配,这会直接影响计算结果的准确性。
内容的提问来源于stack exchange,提问作者Casey McGonigle
相关产品推荐
相关产品推荐

