光伏发电系统模拟及其发电预测开源python工具pvlib

1. 太阳辐照量模拟

pysolar是一个用于计算太阳位置和辐照量的Python库。它是基于python语言编写的,可以方便地在各种python项目中使用。pysolar主要用于计算太阳的位置、太阳高度角、太阳方位角、日出和日落时间等信息。这些信息可以用于太阳能电池板和太阳能集热器等应用的设计和优化。

Pysolar模拟始自2007年以来得太阳,根据Bretagnon’s VSOP 87理论计算太阳的位置。pysolar包含了许多太阳几何和辐射计算方法的实现,例如:太阳方位角(指的是罗盘方位,相对于物理的北而言)和海拔高度角的计算、地球磁场和大气层对太阳辐射的影响等。它还提供了一些实用的功能,例如:在给定经纬度和时间的情况下,可以计算出太阳高度角、方位角、日出和日落时间等信息。

在这里插入图片描述

Pysolar的参考框架如上图所示。地平线定义为海拔高度为零。当太阳在地平线上时,高度为正。方位角向北定义为零。正方位定义为北部以东的估计值;负估计或大于180的估计位于北部以西。在北半球,如果我们从(海拔、方位)的角度来看,太阳在(0,90)左右升起,在中午左右到达(70,180),在(0,270)左右落下。

pysolar非常容易使用,可以使用pip命令来安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pysolar
pip install pysolar

安装完成后,可以在Python脚本中使用pysolar.solar模块进行计算。以下是一个使用pysolar计算太阳高度角和方位角的示例代码:

from pysolar.solar import get_altitude, get_azimuth
import datetime
import pytz

# 设置经纬度和时区
lat = 39.9
lon = 116.4
tz = pytz.timezone('Asia/Shanghai')

# 获取当前时间和太阳高度角、方位角
dt = datetime.datetime.now(tz)
altitude = get_altitude(lat, lon, dt)
azimuth = get_azimuth(lat, lon, dt)

# 输出结果
print("当前时间: ", dt)
print("太阳高度角: ", altitude)
print("太阳方位角: ", azimuth)

2. 光伏发电系统模拟

典型的太阳能光伏发电系统由太阳能电池阵列(组件)、电缆、电力电子变换器(逆变器)、储能装置(蓄电池)、负载即用户等构成,如下所示。其中,太阳能电池阵列和储能装置为电源系统,控制器和电力电子变换器为控制保护系统,负载为系统终端。
在这里插入图片描述

pvlib-python是一个Python库,用于光伏系统性能建模和分析。它提供了光伏系统设计和性能评估所需的工具,包括太阳辐照度计算、光伏组件和系统性能模拟、光伏系统建模、阴影分析等等。pvlib是一个开源项目,由Solar Energy Technologies Office(SETO)资助开发。

pvlib的主要特点包括:

  • 多种太阳辐照度模型,可以计算全天的太阳辐照度、太阳位置、天空散射辐射等信息。
  • 多种光伏模型,包括标准模型、光谱模型和机器学习模型。
  • 多种组件模型,包括单晶硅、多晶硅、CdTe等各种类型的光伏组件模型。
  • 多种系统模型,包括集中式光伏电站、分布式光伏电站等。
  • 多种工具和功能,如阴影分析、功率曲线绘制等。

pvlib的使用非常广泛,在学术界和工业界都有很多应用。它提供了方便快捷的工具,可以帮助工程师和科学家更好地理解和优化光伏系统的性能。

安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pvlib

2.1. 光伏发电系统模拟实现过程

在这里插入图片描述

2.2. 主要模块介绍

2.2.1. PVSystem

PVSystem是一个表示光伏系统的模块(类),它可以用来计算光伏系统的电量输出。PVSystem包括一些属性,例如组件、逆变器、阵列等,这些属性可以用来描述光伏系统的各个组成部分。

在PVSystem类中,有一些方法可以用来计算光伏系统的电量输出。例如,可以使用PVSystem.get_irradiance()方法计算光伏系统的辐照度,使用PVSystem.sapm()方法计算光伏系统的电池板电压和电流,使用PVSystem.snlinverter()方法计算光伏系统的逆变器输出功率等。

PVSystem类还可以与其他pvlib模块结合使用,例如Location、ModelChain等模块。使用PVSystem可以方便地模拟光伏系统的性能表现,为光伏系统的设计和优化提供有力的支持。

2.2.2. ModelChain

ModelChain是pvlib中的一个类,用于将多个组件(比如光伏组件、逆变器、阵列)组合起来,并计算其整个系统的性能。

ModelChain的构建是基于PVSystem的实例,即需要先定义一个PVSystem对象,然后将其传递给ModelChain类的构造函数,用于指定模拟的光伏系统。

ModelChain提供了一个run_model()方法,该方法接受一个时间序列作为输入,并计算在该时间段内系统的性能。具体而言,ModelChain会将该时间段拆分成多个时间步骤,并对每个时间步骤执行以下步骤:

使用Location对象和时间计算大气辐射(如GHI、DNI、DHI),使用PVSystem对象计算总辐照度(POA)

  • 使用PVSystem对象计算太阳能电池板的输出功率
  • 使用PVSystem对象计算逆变器的输入功率和输出功率
  • 使用PVSystem对象计算电池组的输入功率和输出功率

返回结果,包括各个组件的性能参数,如辐射度、电池板输出功率、逆变器输入功率和输出功率等。
通过ModelChain,可以方便地对光伏系统进行建模和仿真,并分析各个组件的性能,以及整个系统的性能表现。

PVLib库中的ModelChain可以集成天气预测数据。在ModelChain中,可以使用一系列模块来计算光伏电池组的电量输出,其中包括天气预测模块。具体来说,可以使用GFS和NAM模块将天气数据引入ModelChain中,然后使用其他模块计算电量输出。

GFS是全球预报系统,它可以提供全球的天气预测数据。而NAM是北美预报模型,它提供了更细致的天气预测数据,针对北美地区。这些模块可以将气象数据导入ModelChain中,以进行更准确的光伏电量预测。

需要注意的是,使用天气预测数据进行光伏电量预测需要对天气数据的准确性有一定的了解和评估。此外,不同的天气预测模块和数据源可能会导致不同的预测结果。因此,需要根据具体情况进行选择和评估。

2.2.3. Bifacial modeling

在pvlib中,Bifacial modeling(双面组件建模)指的是在模拟光伏发电时考虑双面组件在正面和背面同时受到太阳辐射的情况。

pvlib中的Bifacial模型主要包括两个模块:BifacialGroundDiffuse和BifacialAOI。BifacialGroundDiffuse模块用于计算反射地面散射辐射的分布,可以为双面组件建模计算分布在组件背面的反射辐射量。BifacialAOI模块则用于计算太阳角度对双面组件背面散射光的影响,包括反射、折射和透射的效果。

通过使用Bifacial modeling,可以更准确地模拟双面组件的发电能力,并帮助预测背面反射的光线,以提高系统的发电量。

2.2.4. Forecasting

pvlib中的Forecasting模块提供了天气预报数据的获取和处理功能。它包括以下功能:

获取天气预报数据:可以通过指定时间范围和地理位置,获取各种天气变量的预报数据,如温度、风速、云量等。

处理天气预报数据:可以将获取到的天气预报数据处理成pvlib中常用的数据结构,如时间序列数据和DataFrame数据。

预测光伏发电量:可以基于获取到的天气预报数据,预测未来光伏发电量的变化趋势。

在使用Forecasting模块之前,需要先安装好相关的天气预报数据源,如NOAA等。同时,需要注意的是,天气预报数据存在一定的不确定性,因此预测结果可能会存在一定的误差。

2.3. 示例

2.3.1. 生成晴朗天空GHI和POA辐照度的示例

以哈尔滨地区为例,输入维度、经度,太阳板阵列仰角25,方位角180,则夏至、冬至辐照度计算过程如下。
在这里插入图片描述

from pvlib import location
from pvlib import irradiance
import pandas as pd
from matplotlib import pyplot as plt

tz='Asia/Shanghai'
# 哈尔滨地区纬度、经度
lat, lon = 45.739, 120.683

# 创建本地对象,存储维度、经度、时区
site = location.Location(lat, lon, tz=tz)

# 计算晴天的GHI并将其转换到阵列的平面
# 定义函数,获取某个地方的辐照度(理论标准辐照度)
def get_irradiance(site_location, date, tilt, surface_azimuth):
    # 创建一天间隔10分钟的时间序列
    times = pd.date_range(date, freq='10min', periods=6*24,tz=site_location.tz)
    #使用默认的内部模型生成晴天数据
    #get_ clearsky方法返回具有GHI、DNI和DHI值的数据表
    clearsky = site_location.get_clearsky(times)
    # 获取太阳方位角和天空顶点以传递到函数
    solar_position = site_location.get_solarposition(times=times)
    # 使用get_total_iradiance函数将GHI转换为POA
    POA_irradiance = irradiance.get_total_irradiance(
        surface_tilt=tilt,
        surface_azimuth=surface_azimuth,
        dni=clearsky['dni'],
        ghi=clearsky['ghi'],
        dhi=clearsky['dhi'],
        solar_zenith=solar_position['apparent_zenith'],
        solar_azimuth=solar_position['azimuth'])

    return pd.DataFrame({'GHI': clearsky['ghi'],'POA': POA_irradiance['poa_global']})

#获取夏至和冬至的辐照度数据,假设倾斜25度,和朝南的阵列
summer_irradiance = get_irradiance(site, '06-21-2022', 25, 180)
winter_irradiance = get_irradiance(site, '12-22-2022', 25, 180)

# 转换时间序列为小时:分钟,方便绘图
summer_irradiance.index = summer_irradiance.index.strftime("%H:%M")
winter_irradiance.index = winter_irradiance.index.strftime("%H:%M")

plt.rcParams['figure.figsize']= 12,4 
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False  
plt.rcParams.update({"font.size":11})
# 画夏季和冬季的 GHI  POA 
fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
summer_irradiance['GHI'].plot(ax=ax1, label='GHI')
summer_irradiance['POA'].plot(ax=ax1, label='POA')
winter_irradiance['GHI'].plot(ax=ax2, label='GHI')
winter_irradiance['POA'].plot(ax=ax2, label='POA')
ax1.set_xlabel('日时间序列 (夏季)')
ax2.set_xlabel('日时间序列 (冬季)')
ax1.set_ylabel('辐照度 ($W/m^2$)')
ax1.legend()
ax2.legend()
plt.show()

在这里插入图片描述

2.3.2. 一个简单的ModelChain示例

官方文档中的一个完整的示例,拿到了一组光伏模块和逆变器数据,并虚拟了温度数据,通过模型计算,得到了在该位置上的运算结果。

ModelChain有三个组成部分:

  • PVSystem对象,表示模块和逆变器的集合
  • Location对象,表示地球上的位置
  • 指定PV建模过程中每个步骤要使用的模型的属性值。
import pandas as pd
import numpy as np
import pvlib

from pvlib.pvsystem import PVSystem, FixedMount
from pvlib.location import Location
from pvlib.modelchain import ModelChain
from pvlib.temperature import TEMPERATURE_MODEL_PARAMETERS

# sapm,Sandia Array Performance Model,一种用于预测温度的模型,对应有不同的参数可以选择
temperature_model_parameters = TEMPERATURE_MODEL_PARAMETERS['sapm']['open_rack_glass_glass']
# 从SAM网站上获取SandiaMod光伏模块的配置
sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod')
# 从SAM网站上获取cec逆变器的配置
cec_inverters = pvlib.pvsystem.retrieve_sam('cecinverter')
# 选择一个光伏模块及一个逆变器的数据
sandia_module = sandia_modules['Canadian_Solar_CS5P_220M___2009_']
cec_inverter = cec_inverters['ABB__MICRO_0_25_I_OUTD_US_208__208V_']

# 设置位置信息
location = Location(latitude=32.2, longitude=-110.9)
# 实例化一个PVSystem对象
system = PVSystem(surface_tilt=20, surface_azimuth=200,
                  module_parameters=sandia_module,
                  inverter_parameters=cec_inverter,
                  temperature_model_parameters=temperature_model_parameters)
# 实例化一个ModelChain对象
mc = ModelChain(system, location)
# 虚拟一些天气数据
weather = pd.DataFrame([[1050, 1000, 100, 30, 5]],
                       columns=['ghi', 'dni', 'dhi', 'temp_air', 'wind_speed'],
                       index=[pd.Timestamp('20170401 1200', tz='US/Arizona')])
# 运行模型
mc.run_model(weather)
# 获取相关结果
print(mc.results.aoi)  # 入射角
print(mc.results.cell_temperature)  # 电池温度
print(mc.results.dc)  # 直流电功率
print(mc.results.ac)  # 交流电功率

2.4. 关键术语

2.4.1. 辐射基本专业术语

DNI: Direct Normal Irradiance 阳光从太阳盘面直接照射到与光路正交的表面,称作直接辐射简写为 DNI。

DHI: Diffuse Horizontal Irradiance 在大气中散射的直接到达地面的阳光称为散射辐射。散射辐射的标准测量在水平面上进行,这个测量叫做散射水平辐射,或者简化为“散射”简写为 DHI。

GHI:Global Horizontal Irradiance 太阳的 DHI和 DNI到达水平表面称为总水平辐射,通常简称为总辐射,简写为 GHI。

Solar Zenith Angle: 太阳天顶角 (与太阳高度角之和为90度,互余关系)解释为一束光线从太阳到达地面一点形成的光线与此点垂直于地面的直线夹角;所以在日出和日落时天顶角为 90度(太阳高度角为0),没有直射辐射到达水平面。

三个辐射参数之间的关系:

  GHI = DHI + (cosθ x DNI)
  • θ = Solar Zenith Angle(太阳天顶角)
  • 0°is vertical
  • 90°is horizontal

气团:气团是指气象要素(主要指温度和湿度)水平分布比较均匀并具有一定垂直稳定度的较大空气团。在同一气团中,各地气象要素的重点分布几乎相同,天气现象也大致一样。气团的水平范围可达几千公里,垂直高度可达几公里到十几公里,常常从地面伸展到对流层顶。
气团的分类方法主要有三种,一种是按气团的热力性质不同,划分为冷气团和暖气团;第二种是按气团的湿度特征的差异,划分为干气团和湿气团,第三种是按气团的发源地,常分为北冰洋气团、极地气团,热带气团、赤道气团。

2.4.2. GHI 和 POA

GHI 和 POA 都是太阳辐射的度量单位,但它们有不同的含义:

  • GHI(Global Horizontal Irradiance):全水平辐照度,是指垂直于地球表面的平面上所接收到的来自太阳的辐射总量,包括直射辐射和散射辐射,单位通常是 W/m²。
  • POA(Plane of Array Irradiance):组件平面辐照度,是指垂直于光伏组件表面的平面上所接收到的来自太阳的辐射总量,也包括直射辐射和散射辐射,单位通常是 W/m²。

通俗地说,GHI 是地面上接收到的总辐射量,而 POA 是太阳能电池板上接收到的总辐射量。因此,POA 是在考虑组件倾角、方向和阴影遮挡等因素的基础上计算的,而 GHI 不考虑这些因素。

3. 光伏发电预测方案

对于光伏发电预测,可以利用pvlib进行建模和预测。下面给出一个基本的预测方案:

  • 获取天气预报数据
    可以从气象局获取当地未来几天的天气预报数据,包括气温、风速、湿度、降水等信息。

  • 计算理论太阳辐照度
    根据地理位置、日期、时间、太阳高度角等信息,利用pvlib中的函数计算出理论太阳辐照度。

  • 计算实际POA
    根据天气预报中的气温、风速、湿度等信息,结合理论太阳辐照度,利用pvlib中的函数计算出实际的POA。

  • 建立光伏发电量预测模型
    利用历史数据和当前实际POA值,建立光伏发电量预测模型,可以选择不同的模型,如物理模型或者基于机器学习的模型。在pvlib中,可以使用ModelChain进行建模和预测。

  • 进行光伏发电量预测
    利用模型对未来几天的光伏发电量进行预测,得到预测结果。

参考:

芳樽里的歌. 从pvlib入门光伏发电系统. CSDN博客. 2022.04
https://github.com/pvlib/pvlib-python
https://pvlib-python.readthedocs.io/en/stable/user_guide/pvsystem.html
https://github.com/pingswept/pysolar
https://pysolar.readthedocs.io/en/latest/#source-code-repository

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】创建型-抽象工厂模式

文章目录一、抽象工厂模式1.1、产品族、产品等级1.2、抽象工厂模式中的角色1.3、实例一、抽象工厂模式 在工厂方法模式中,每一个具体的工厂子类只能生成一种具体的产品,如果想要生产另外一种产品,就需要重新定义一个抽象工厂类,这…

泡泡玛特“失速”,盲盒经济迎来拐点?

配图来自Canva可画​ 前些年泡泡玛特的飞速增长,曾经在行业内外引起了广泛的反响,其主打的盲盒经济也曾风靡一时、被众多行业效仿。不过,这种情况在疫情肆虐的2022年似乎受到了一些影响,这在其财报中就有所体现。 3月29日&#…

Python 小型项目大全 61~65

六十一、ROT13 密码 原文:http://inventwithpython.com/bigbookpython/project61.html ROT13 密码是最简单的加密算法之一,代表“旋转 13 个空格”密码将字母A到Z表示为数字 0 到 25,加密后的字母距离明文字母 13 个空格: A变成N&…

【Android】之【自定义View实践】

这里以一个进度条的加载为例子&#xff0c;先看效果&#xff08;运行效果是动态变化的&#xff09; 一、自定义属性 首先在res->values目录下新建attrs资源文件&#xff0c;如下图&#xff1a; 内容如下&#xff1a; <?xml version"1.0" encoding"utf…

SpringBoot基础学习之(九)添加员工的信息

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在本篇代码DAO层将通过Java文件去实现&#xff0c;在这里就不连接数据&#xff0c;然后通过jdbc将数据库内容的内容显示出来 案例&#xff1a;员工管理系统 上一篇博文的主要的内容是展示员工的信息&#xff0c;本篇…

Oracle JDK 和 OpenJDK 有什么区别?

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle JDK 和 OpenJDK 之间是否存在重大差异&#xff1f;下面我通过收集到的一些资料&#xff0c;为你解答这个被很多人忽视的问题。 首先&#xff0c;2006 年 SUN 公司将 Java 开源&#xff0c;也就有…

JAVA——网络编程基本概念

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

腾讯云轻量服务器和云服务器区别对比(超详细)

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器费用更低&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

orcad library builder 建库及报错问题

目录 一.安装orcad library builder 二.orcad library builder 使用 1.建立一个orcad 原理图库测试下 尝试理解tcl那段的意思 xml文件导入建orcad库 折腾了2个多小时&#xff0c;居然没有直接方案搞定&#xff0c;简单记录下&#xff0c;后面遇到该问题的兄弟可参考借鉴&am…

Java集合框架之collection

1. 什么是集合 1.1 概念 对象的容器&#xff0c;实现类对对象常用的操作。 1.2 和数组的区别 数组长度固定&#xff0c;集合长度不固定。数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型。 1.3 位置 java.util.*; 2. Collection体系 2.1 Collection父接…

网络编程 1

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 网络编程 什么是网络编程&#xff1f;…

ASP网上视频点播系统的设计与实现

在线视频服务系统的功能模块划分如下图&#xff08;2-2&#xff09;所示&#xff1a; 电影分类浏览 用户可以通过电影的类别进行浏览。显示近期热门电影&#xff0c;近期点机排行。用户能很方便的找到自己感兴趣的电影进行观看。 电影搜索 如果用户有很明确的目的&#xff0c;…

JUC结构

JUC是java.util.concurrent包的简称在Java5.0添加&#xff0c;目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题&#xff01;进程与线程的区别&#xff1a;进程 : 一个运行中的程序的集合; 一个进程往往可以包含多个线程,至少包含一个线程…

JVM的内存区域划分

目录 1、程序计数器&#xff08;内存中最小的一块&#xff0c;里面保存了当前线程下一条执行的指令的地址&#xff09; 2、栈&#xff08;保存局部变量和方法调用的信息&#xff09; 3、堆 &#xff08;成员变量和new出来的对象都在堆上&#xff09; 4、方法区&#xff08…

闲人闲谈PS之四十——项目售前费用归集

惯例闲话&#xff1a;广东这段时间老是下雨&#xff0c;堪比江浙一带梅雨季节&#xff0c;人的心情也像这天气一样&#xff0c;阴雨绵绵。2023年伊始&#xff0c;确实感觉很多事情在发生剧变&#xff0c;这种变化也稍微影响了闲人那本来稳如老狗的心。面对未知和变化&#xff0…

FreeRTOS学习(一)

裸机与RTOS对比 裸机&#xff1a;又称为前后台系统&#xff0c;前台系统指的是中断服务函数&#xff0c;后台系统指的大循环&#xff0c;即应用程序。 实时性差&#xff1a;&#xff08;应用程序轮流执行&#xff09;delay&#xff1a;空等待&#xff0c;CPU不执行其它代码结…

智能汽车赛道「年度大奖」揭晓,哪些供应商在细分市场独占鳌头

智能汽车产业链年度细分市场领军供应商&#xff0c;是高工智能汽车研究院在每个年度基于前装量产数据库及定点车型库数据进行综合评价颁发的年度重量级行业奖项。 2022年&#xff0c;是中国乘用车市场从电动化转型升级到全面普及智能化的关键节点。从计算平台、域控制器、传感…

python天狗吃月 青少年编程电子学会python编程等级考试一级真题解析2022年9月

目录 python天狗吃月 一、题目要求 编程实现 二、解题思路 1、图形分析

thinkphp5.0无限极分类及格式化输出详解案例一则

首先我们来看数据表 从上图中可以发现&#xff0c;中国下有贵州&#xff0c;北京两个子节点&#xff0c;而北京有天安门一个子节点&#xff0c;纽约的子节点是“纽约的子类”。 从pid为0看出&#xff0c;中国和纽约是顶级节点。 因为贵州的pid是1&#xff0c;而中国的id为1…

概率论基础2

文章目录多个random variable条件下的multi random variable 分布和independencemulti random variable continuous**2D normal distribution**two random variable independencemuilti random variable conditional expectional value(discrete)multi random variable conditi…