背景
传统上,我使用NREL SAM工具估算太阳能输出。由于开放性和灵活性,我一直在尝试使用PVLIB,但我似乎无法调和PVLIB和NREL SAM之间的太阳能产量估算值。
我做了什么
我正在为Gympie QLD附近的一个假设的太阳能农场建模。我已进入climate.onebuiling网站,并下载了“ AUS_QLD_Gympie.AP.945660_TMYx.2003-2017”的zip文件夹/ epw文件。然后,我已使用PVwatts在NREL的SAM工具中使用了该天气文件,其规格如下:
200,000千瓦直流
模块类型=标准
1.2直流交流比
逆变器效率96%
1轴回溯
倾斜= 26度
方位角= 0度
GCR = 0.4
损失,阴影和缩减=默认
在NREL SAM中,我的年发电量(AC GWh)为每年415.96 GWh。
然后,我获取了相同的epw文件,并将其转换为csv,仅保留了ghi,dni,dhi,temp_air和wind_speed(Google Drive link to CSV file)的列。我已将此文件用作PVLIB的导入。我为PVLIB系统指定了与上述相同的规格,并增加了反照率= 0.2和最大角度= 90度(以下代码)。
我在PVLIB中得到的结果是395.61 GWh。
问题
我得到的结果完全不同。 PVLIB =每年约395 GWh对比SAM =〜415 GWH p.a.我预计会有1-2%的差异,但不会有5%的差异。
当我与使用clearsky.ineichen(经linke_turbidity调整)的PVLIB系统进行比较时,数据甚至更糟,该系统的年发电量约为475 GWh。
已请求帮助
有人知道为什么我的结果如此不同吗?我有什么办法可以缩小差距?
PVLIB代码
# **********************************************************
# IMPORT LIBRARIES
# **********************************************************
import pandas as pd
from pvlib.pvsystem import PVSystem
from pvlib import clearsky, atmosphere, solarposition, irradiance
from pvlib.location import Location
from pvlib.tracking import SingleAxisTracker
from pvlib.modelchain import ModelChain
from pvlib.temperature import TEMPERATURE_MODEL_PARAMETERS
# **********************************************************
# LOCATION & SOLAR SIZE INPUTS
# **********************************************************
# Lat and Long desired
lat = -26.18
lon = 152.63
# Set Location
tz, altitude, name = 'Australia/Queensland', 10, 'Gympie/QLD'
# Set location details for model
latitude, longitude, = lat, lon
location = Location(latitude, longitude, tz, altitude, name)
# load some module and inverter specifications
module_parameters = {'pdc0': 200000000, 'gamma_pdc': -0.004}
inverter_parameters = {'pdc': 166666666, 'pdc0': 166666666, 'eta_inv_nom': 0.96}
temperature_model_parameters = TEMPERATURE_MODEL_PARAMETERS['sapm']['open_rack_glass_glass']
# **********************************************************
# ONEBUILDING DATA
# **********************************************************
df = pd.read_csv('weather import.csv')
df['time'] = df['time'].astype('datetime64[ns]')
df.set_index(['time'], inplace=True)
df.index = df.index.tz_localize(tz=tz)
df = df.asfreq(freq='1h')
onebuilding = df
# **********************************************************
# INEICHEN CLEAR SKIES ADJUSTED FOR TURBIDITY
# **********************************************************
# Create PVLib inputs
times = df.index
solpos = solarposition.get_solarposition(times, latitude, longitude)
apparent_zenith = solpos['zenith']
rel_airmass = atmosphere.get_relative_airmass(apparent_zenith)
pressure = atmosphere.alt2pres(altitude)
abs_airmass = atmosphere.get_absolute_airmass(rel_airmass, pressure)
linke_turbidity = clearsky.lookup_linke_turbidity(times, latitude, longitude)
dni_extra = irradiance.get_extra_radiation(times)
ineichen = clearsky.ineichen(apparent_zenith, abs_airmass, linke_turbidity, altitude, dni_extra)
ineichen.to_csv('ineichen.csv')
# **********************************************************
# SELECT WHICH WEATHER DATA TO USE (ineichen v onebuilding)
# **********************************************************
# Select which version we wish to use (onebuilding, ineichen)
selected_irrad = onebuilding
print(selected_irrad)
# Create Weather File
weather = pd.DataFrame(data={'ghi': selected_irrad.ghi, 'dni': selected_irrad.dni,
'dhi': selected_irrad.dhi, 'temp_air': df['temp_air'],
'wind_speed': df['wind_speed']})
# **********************************************************
# CREATE PV SYSTEM AND PV MODEL CHAIN
# **********************************************************
# Define the specs for the PV System (fixed system)
f_system = PVSystem(
surface_tilt=abs(lat),
surface_azimuth=0,
albedo=0.2,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
racking_model='open_rack_glass_glass',
name='fixed',
temperature_model_parameters=temperature_model_parameters
)
# Define the specs for the PV System (1 axis tracking system)
t_system = SingleAxisTracker(
axis_tilt=0,
axis_azimuth=0,
max_angle=90,
backtrack=True,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
name='tracking',
gcr=.40,
)
# build model chain
mc = ModelChain(
system=t_system,
location=location,
name='pvwatts',
dc_model='pvwatts',
ac_model='pvwatts',
losses_model='pvwatts',
aoi_model='physical',
spectral_model='no_loss',
temperature_model='sapm')
# run model chain
mc.run_model(weather=weather)
print(mc.ac.sum())
最佳答案
如果不对中间结果进行详细比较,很难说出为什么年能源不同。换位模型(GHI,DHI和DNI到阵列平面)似乎是一个促成因素:pvlib ModelChain默认为Hay / Davies模型,我相信SAM默认为Perez 1990模型。两种模型的年度阵列面照度将相差几个百分点,这取决于漫射和直接照度的相对水平。参见Lave et al. Figure 6。
通过将transposition_model = 'perez',
添加到mc
实例,可以在pvlib中选择Perez 1990模型。我希望这会缩小pvlib和SAM结果之间的差异,并对您发现的内容感兴趣。
使用TMY气象文件进行的计算与使用晴朗天空模型中的辐照度进行的计算不会得出相同的结果,因为TMY是根据历史天气记录组合而成的,因此包括阴天。