模型链示例PVLIB-不信任1轴跟踪交流输出

时间:2018-10-31 20:22:55

标签: pvlib

我正在尝试使用PVLIB估算安装在我国西部地区的PV系统的输出功率。

作为一个例子,通过MERRA2重新分析,我得到了2天的每小时GHI,2m的温度和10m的风速。

我想使用上述数据集和PVLIB的ModelChain函数来估算固定PV系统或1轴跟踪系统将产生多少功率。我首先使用DISC模型从GHI数据估计DNI和DHI,以获得DNI,然后DHI是GHI和DNI * cos(Z)之差

a)第一个行为我不确定是否可以。这是GHI,DNI,DHI,T2m和风速的图。似乎DNI的最大值发生在GHI最大值之前1小时。

Weather Figure

准备辐照度数据后,我使用模型链计算了AC,并指定了固定PV系统和1轴单跟踪系统。 事实是,我不相信单轴系统的交流输出。我预计交流输出将达到平稳状态,并且发现一种奇怪的行为。

这是我期望看到的发电量的最大输出值:

Expectation

这是PVLIB的估计输出

Reality

我希望有人能帮助我在我的程序中找到错误。

这是代码:

# =============================================================================
# Example of using MERRA2 data and PVLIB
# =============================================================================
import numpy as np
import pandas as pd
import pandas as pd
import matplotlib.pyplot as plt
import pvlib
from pvlib.pvsystem import PVSystem
from pvlib.location import Location
from pvlib.modelchain import ModelChain

# =============================================================================
# 1) Create small data set extracted from MERRA
# =============================================================================
GHI             = np.array([0,0,0,0,0,0,0,0,0,10.8,148.8,361,583,791.5,998.5,1105.5,1146.5,1118.5,1023.5,
                            860.2,650.2,377.1,165.1,16,0,0,0,0,0,0,0,0,0,11.3,166.2,395.8,624.5,827,986,
                            1065.5,1079,1025.5,941.5,777,581.5,378.9,156.2,20.6,0,0,0,0])
temp_air        = np.array([21.5,20.5,19.7,19.6,18.8,17.9,17.1,16.5,16.2,16.2,17,21.3,24.7,26.9,28.8,30.5,
                            31.6,32.4,33,33.3,32.9,32,30.6,28.7,25.4,23.9,22.6,21.2,20.3,19.9,19.5,19.1,18.4,
                            17.7,18.3,23,25.1,27.3,29.5,31.2,32.1,32.6,32.6,32.5,31.8,30.7,29.6,28.1,24.6,22.9,
                            22.3,23.2])
wind_speed      = np.array([3.1,2.7,2.5,2.6,2.8,3,3,3,2.8,2.5,2.1,1,2.2,3.7,4.8,5.6,6.1,6.4,6.5,6.6,6.3,5.8,5.3,
                            3.7,3.9,4,3.6,3.4,3.4,3,2.6,2.3,2.1,2,2.2,2.7,3.2,4.3,5.1,5.6,5.7,5.8,5.8,5.7,5.4,4.8,
                            4.4,3.1,2.7,2.3,1.1,0.6])
local_timestamp = pd.DatetimeIndex(start='1979-12-31 21:00', end='1980-01-03 00:00', freq='1h',tz='America/Argentina/Buenos_Aires')
d               = {'ghi':GHI,'temp_air':temp_air,'wind_speed':wind_speed}
data            = pd.DataFrame(data=d)
data.index      = local_timestamp

lat             = -31.983   
lon             = -68.530
location        = Location(latitude  = lat, 
                           longitude = lon,
                           tz        = 'America/Argentina/Buenos_Aires',
                            altitude = 601)

# =============================================================================
# 2) SOLAR POSITION AND ATMOSPHERIC MODELING
# =============================================================================
solpos          = pvlib.solarposition.get_solarposition(time      = local_timestamp, 
                                                        latitude  = lat,
                                                        longitude = lon,
                                                        altitude  = 601)

# DNI and DHI calculation from GHI data
DNI             = pvlib.irradiance.disc(ghi             = data.ghi, 
                                        solar_zenith    = solpos.zenith, 
                                        datetime_or_doy = local_timestamp)
DHI             = data.ghi - DNI.dni*np.cos(np.radians(solpos.zenith.values))

d               = {'ghi': data.ghi,'dni': DNI.dni,'dhi': DHI,'temp_air':data.temp_air,'wind_speed':data.wind_speed }
weather         = pd.DataFrame(data=d)
plt.plot(weather)

# =============================================================================
# 3) SYSTEM SPECIFICATIONS
# =============================================================================
# load some module and inverter specifications
sandia_modules    = pvlib.pvsystem.retrieve_sam('SandiaMod')
cec_inverters     = pvlib.pvsystem.retrieve_sam('cecinverter')
sandia_module     = sandia_modules['Canadian_Solar_CS5P_220M___2009_']
cec_inverter      = cec_inverters['Power_Electronics__FS2400CU15__645V__645V__CEC_2018_']

# Fixed system with tilt=abs(lat)-10
f_system          = PVSystem(      surface_tilt                                = abs(lat)-10, 
                                   surface_azimuth                             = 0,
                                   module                                      = sandia_module,
                                   inverter                                    = cec_inverter,
                                   module_parameters                           = sandia_module,
                                   inverter_parameters                         = cec_inverter,
                                   albedo                                      = 0.20,
                                   modules_per_string                          = 100,
                                   strings_per_inverter                        = 100)
# 1 axis tracking system
t_system          = pvlib.tracking.SingleAxisTracker(axis_tilt                 = 0, #abs(-33.5)-10
                                                     axis_azimuth              = 0,
                                                     max_angle                 = 52,
                                                     backtrack                 = True,
                                                     module                    = sandia_module,
                                                     inverter                  = cec_inverter,                                                       
                                                     module_parameters         = sandia_module,
                                                     inverter_parameters       = cec_inverter,
                                                     name                      = 'tracking',
                                                     gcr                       = .3,
                                                     modules_per_string        = 100,
                                                     strings_per_inverter      = 100)

# =============================================================================
# 4) MODEL CHAIN USING ALL THE SPECIFICATIONS for a fixed and 1 axis tracking systems
# =============================================================================
mc_f       = ModelChain(f_system, location)
mc_t       = ModelChain(t_system, location)


# Next, we run a model with some simple weather data.
mc_f.run_model(times=weather.index, weather=weather)
mc_t.run_model(times=weather.index, weather=weather)

# =============================================================================
# 5) Get only AC output form a fixed and 1 axis tracking systems and assign 
# 0 values to each NaN
# =============================================================================
d              = {'fixed':mc_f.ac,'tracking':mc_t.ac}
AC             = pd.DataFrame(data=d)
i              = np.isnan(AC.tracking)
AC.tracking[i] = 0
i              = np.isnan(AC.fixed)
AC.fixed[i]    = 0

plt.plot(AC)

我希望任何人都可以帮助我解释结果并调试代码。

非常感谢!

1 个答案:

答案 0 :(得分:2)

我怀疑您的问题是由于处理每小时数据的方式引起的。确保您与时间间隔标签(开始/结束)以及瞬时数据与平均数据的处理保持一致。一种可能的原因是使用每小时平均GHI数据得出DNI数据。 pvlib.solarposition.get_solarposition返回传递给它的时间瞬间的太阳位置。因此,当您使用pvlib.irradiance.disc计算DNI以及计算DHI时,您会将每小时平均GHI值与瞬时太阳位置值混合在一起。将时间索引偏移30分钟会减少但不会消除错误。另一种方法是将输入数据重新采样为1-5分钟的分辨率。