为什么pvlib返回的最佳地表方位角在北半球正南方向>14°?

2024-05-15 01:36:55 发布

您现在位置:Python中文网/ 问答频道 /正文

谢谢你的持续支持。这对我来说是无价的,因为我第一次接触到了pvlib

无论如何,几周前,我在这里和pvlib谷歌小组中发布了一篇帖子,问我为什么我的最佳地表方位角离180°(实际上接近0°)如此之远。凯文·安德森(Kevin Anderson)通过修正时区帮助我解决了这个问题——现在我的最佳地面方位角至少大体上是朝南的但是,我的代码仍然返回一个最佳的地面方位角,即南偏东约15°(倾斜=25°)

我曾尝试使用美国多个城市(加利福尼亚州伯克利、纽约州罗切斯特、密苏里州堪萨斯城、德克萨斯州奥斯汀),它们都返回一个最佳的地表方位角,至少在正南偏东14°

此外,如果我增加表面倾斜角度(比如说垂直,90°),最佳表面方位角甚至会从180°进一步偏离。在伯克利,最佳表面方位角为138°;奥斯汀是最糟糕的。它一直延伸到108°

谢谢你的阅读。我真的很感激你能提供的任何帮助

我在下面复制了我的代码,并附加了一些可视化工具来帮助进行故障排除


import os

import pandas as pd

import numpy as np

import os

import os.path

import matplotlib.pyplot as plt

import pvlib

from geopy.exc import GeocoderTimedOut 

from geopy.geocoders import Nominatim 

from IPython.display import Image

from timezonefinder import TimezoneFinder



## GET THE LATITUDE & LONGITUDE OF A GIVEN CITY

geolocator = Nominatim(user_agent="____'s app") 

geo = geolocator.geocode("Austin") 

## CHECK THAT CITY IS CORRECT (by Country, State, etc.)

print(geo.address)

# CHECK THE LAT, LON order

print(geo.latitude, geo.longitude)



## CREATE OUR TIMEZONE

tf = TimezoneFinder()

#latitude, longitude = 52.5061, 13.358

tzone = tf.timezone_at(lng=geo.longitude, lat=geo.latitude)

print(tzone)



## SELECT THE YEAR & TIMES YOU'D LIKE TO MODEL OFF

YEAR = 2019

STARTDATE = '%d-01-01T00:00:00' % YEAR

ENDDATE = '%d-12-31T23:59:59' % YEAR

TIMES = pd.date_range(start=STARTDATE, end=ENDDATE, freq='H', tz = tzone)



## ACCESS THE NREL API TO EXTRACT WEATHER DATA

NREL_API_KEY = os.getenv('NREL_API_KEY', 'DEMO_KEY')

## fill in the blank with your email address

EMAIL = os.getenv('EMAIL', 'cmc...@berkeley.edu')

##NEED TO COMMENT OUT THIS LINE BELOW -- if you call it too many times within an hour, it will break your code

header, data = pvlib.iotools.get_psm3(geo.latitude, geo.longitude, NREL_API_KEY, EMAIL)


## SELECT THE PVLIB PANEL & INTERVTER YOU'D LIKE TO USE

## CAN ALSO CHOOSE FROM SANDIA LABS' DATASET OF PANELS & INVERTERS (check out the function)

## WE CHOSE THE CECMods because they highlighted the ones that were BIPV

INVERTERS = pvlib.pvsystem.retrieve_sam('CECInverter')

INVERTER_10K = INVERTERS['SMA_America__SB10000TL_US__240V_']

CECMODS = pvlib.pvsystem.retrieve_sam('CECMod')

## select the panel you'd like to use (note: this is a BIPV panel)

CECMOD_MONO = CECMODS['Pevafersa_America_IP_235_GG']


## CREATING AN ARRAY TO ITERATE THROUGH IN ORDER TO TEST DIFFERENT SURFACE_AZIMUTHS

heading_array = np.arange(0, 361, 2)

heading_DF = pd.DataFrame(heading_array).rename(columns = {0: "Heading"})

heading_DF.head()


# geo IS AN OBJECT (the given city) CREATED ABOVE

LATITUDE, LONGITUDE = geo.latitude, geo.longitude

# data IS AN OBJECT (the weather patterns) CREATED ABOVE

# TIMES IS ALSO CREATED ABOVE, AND REPRESENTS TIME

data.index = TIMES

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


# GET SOLAR POSITION

sp = pvlib.solarposition.get_solarposition(TIMES, LATITUDE, LONGITUDE)

solar_zenith = sp.apparent_zenith.values

solar_azimuth = sp.azimuth.values



# CREATING THE ARRY TO STORE THE DAILY ENERGY OUTPUT BY SOLAR AZIMUTH

e_by_az = []


# IDEAL ANGLE IN NORTHERN HEMISPHERE IS ~25; vertical is ~90

surface_tilt = 25

for heading in heading_DF["Heading"]:
    surface_azimuth = heading

    poa_sky_diffuse = pvlib.irradiance.get_sky_diffuse(
        surface_tilt, surface_azimuth, solar_zenith, solar_azimuth,
        dni, ghi, dhi, dni_extra=dni_extra, model='haydavies')

    # calculate the angle of incidence using the surface_azimuth and (hardcoded) surface_tilt

    aoi = pvlib.irradiance.aoi(
        surface_tilt, surface_azimuth, solar_zenith, solar_azimuth)

    # https://pvlib-python.readthedocs.io/en/stable/generated/pvlib.irradiance.aoi.html
    # https://pvlib-python.readthedocs.io/en/stable/generated/pvlib.pvsystem.PVSystem.html

    poa_ground_diffuse = pvlib.irradiance.get_ground_diffuse(
        surface_tilt, ghi, albedo=surface_albedo)

    poa = pvlib.irradiance.poa_components(
        aoi, dni, poa_sky_diffuse, poa_ground_diffuse)

    poa_direct = poa['poa_direct']

    poa_diffuse = poa['poa_diffuse']

    poa_global = poa['poa_global']

    iam = pvlib.iam.ashrae(aoi)

    effective_irradiance = poa_direct*iam + poa_diffuse

    temp_cell = pvlib.temperature.pvsyst_cell(poa_global, temp_air)

    # THIS IS THE MAGIC
    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 is the list of energy output by hour for the whole year using a single panel

    mpp = pvlib.pvsystem.max_power_point(*cecparams, method='newton')

    mpp = pd.DataFrame(mpp, index=TIMES)

    first48 = mpp[:48]

    Edaily = mpp.p_mp.resample('D').sum()

    # Edaily is the list of energy output by day for the whole year using a single panel

    Eyearly = sum(Edaily)
    
    e_by_az.append(Eyearly)
    

## LINKING THE Heading (ie. surface_azimuth) AND THE Eyearly (ie. yearly energy output) IN A DF

heading_DF["Eyearly"] = e_by_az

heading_DF.head()


## VISUALIZE ENERGY OUTPUT BY SURFACE_AZIMUTH

## PLEASE SEE THE ATTACHED VISUALIZATIONS

plt.plot(heading_DF["Heading"], heading_DF["Eyearly"])

plt.xlabel("Surface_Azimuth Angle")

plt.ylabel("Yearly Energy Output with tilt @ " + str(surface_tilt))

plt.title("Yearly Energy Output by Solar_Azimuth Angle using surface_tilt = " + str(surface_tilt) + " in Austin, TX");

请参阅随附的可视化视图,以了解我的输出/问题

我真的很感谢你的帮助, 凯西

Berkeley with tilt == 25°Austin with tilt == 25°Berkeley with tilt == 90°Austin with tilt == 90°


Tags: theimportdfdatasurfacegeomonopoa

热门问题