Не удается согласовать вывод PVLIB с NREL SAM - PullRequest
1 голос
/ 14 февраля 2020

Фон

Традиционно я использовал инструмент SAM NREL для оценки солнечного излучения. Я экспериментировал с PVLIB, который великолепен благодаря открытой природе и гибкости, однако я не могу согласовать оценки солнечного производства между PVLIB и NREL SAM.

Что я сделал

Я моделирую гипотетическую солнечную ферму около Гимпа ie QLD. Я зашел на веб-сайт Climate.onebuiling и загрузил zip-папку / epw для " AUS_QLD_Gymp ie .AP.945660_TMYx.2003-2017 ". Затем я использовал этот файл погоды в инструменте SAM NREL с использованием PVwatts со следующими характеристиками:

  • 200 000 КВт c
  • Тип модуля = Стандартный
  • От 1,2 D C до A C Отношение
  • 96% КПД инвертора
  • Отклонение по 1 оси
  • Наклон = 26 градусов
  • Азимут = 0 градусов
  • GCR = 0,4
  • потери, затенение и сокращение = по умолчанию

В NREL SAM я получаю годовой выход энергии (A C ГВтч) в 415,96 ГВтч pa

Затем я взял этот же файл epw и преобразовал его в csv, сохранив только столбцы для ghi, dni, dhi, temp_air & wind_speed ( Ссылка Google Диска на файл CSV ). Я использовал этот файл для импорта в PVLIB. Я использую c систему PVLIB, описанную выше, с добавлением альбедо = 0,2 и максимального угла = 90 градусов (код ниже).

Результат, который я получаю в PVLIB, составляет 395,61 ГВтч.

Задача

Полученные результаты довольно разные. PVLIB = ~ 395 ГВтч в год против SAM = ~ 415 ГВтч в год. Я ожидал, что разница составит около 1-2%, но не 5%.

Цифры еще хуже, когда я сравниваю систему PVLIB с использованием clearsky.ineichen ( корректируется с помощью linke_turbidity), что дает ~ 475 ГВтч в год

Требуется помощь

Кто-нибудь знает, почему мои результаты так отличаются? Что я могу сделать, чтобы сократить разрыв?

Код 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())

1 Ответ

3 голосов
/ 15 февраля 2020

Трудно точно сказать, почему годовая энергия отличается без подробного сравнения промежуточных результатов. Одним из факторов, способствующих этому, является модель транспонирования (GHI, DHI и DNI в плоскость массива): pvlib ModelChain по умолчанию соответствует модели Хэя / Дэвиса, и я считаю, что SAM значения по умолчанию к модели Perez 1990 года. Две модели будут отличаться на несколько процентов в годовом освещении в плоскости матрицы, которое зависит от относительного уровня рассеянного и прямого излучения; см. Lave et al. Рисунок 6 .

Вы можете выбрать модель Perez 1990 в pvlib, добавив transposition_model = 'perez', к экземпляру mc. Я ожидаю, что это сузит разницу между результатами pvlib и SAM, и мне интересно, что вы найдете.

Расчеты с использованием файла погоды TMY не дадут того же результата, что и расчеты с использованием освещенности из модели ясного неба. Так как TMY собран из исторических данных о погоде и включает облачные периоды.

...