1

背景

传统上,我使用 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 链接到 CSV 文件)。我已将此文件用作 PVLIB 的导入。我指定了一个与上述相同规格的 PVLIB 系统,并添加了反照率 = 0.2 和最大角度 = 90 度(代码如下)。

我在 PVLIB 中得到的结果是 395.61 GWh。

问题

我得到的结果完全不同。PVLIB = ~395 GWh pa vs SAM = ~415 GWH pa 我预计会有 1-2% 的差异,但不是 5%。

当我与使用 clearsky.ineichen(使用 linke_turbidity 调整)的 PVLIB 系统进行比较时,数据甚至更差,产生约 475 GWh pa

请求帮助

有人知道为什么我的结果如此不同吗?我能做些什么来缩小差距吗?

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())
4

1 回答 1

3

如果没有中间结果的详细比较,很难确切地说出为什么年能量不同。一个促成因素似乎是转置模型(GHI、DHI 和 DNI 到阵列平面):pvlib ModelChain默认为 Hay/Davies 模型,我相信SAM默认为 Perez 1990 模型。这两个模型的年阵列平面辐照度会相差几个百分点,这会随着漫射和直接辐照度的相对水平而变化;见拉夫等人。图 6

transposition_model = 'perez',您可以通过添加到mc实例来选择 pvlib 中的 Perez 1990 模型。我希望这会缩小 pvlib 和 SAM 结果之间的差异,并且对您的发现感兴趣。

使用 TMY 天气文件的计算与使用晴空模型的辐照度计算得出的结果不同,因为 TMY 是根据历史天气记录组合而成的,因此包括多云时段。

于 2020-02-14T23:36:46.383 回答