光伏电池作为太阳能发电的核心部件,实现了太阳能到电能的转换,但是由于光伏电池器件本身的复杂性以及现如今光电材料的限制,光伏电池的转换效率总体来说还是比较低,而且其输出还是非线性的,并且光照强度和外界温度对其输出的影响也很大,这使得其本就不高的转化率进一步降低了。所以现如今对光伏电池输出特性的研究已经成为了光伏发电产业一大重要课题,为了充分利用光伏电池的输出量,最大程度的发挥光伏电池的作用,最好的策略是使光伏电池工作在最大功率点(MPP)上。为了实现这一目的,最大功率点追踪(MPPT)算法应运而生。理想的MPPT的作用就是使光伏电池一直工作在最大功率点上,当外界温度、光照等因素发生变化时,最大功率点会发生移动,它会自动追踪并稳定在最大功率点工作。

图 光伏电池MPPT结构框图
最大功率点追踪的分类
通常按照算法复杂度和智能度的进化,可以将MPPT算法大致分为三类:
(1)基于数学模型,通过计算和拟合的算法
主要是固定电压法(CVT)和固定电流法(CIT)。这两个的工作原理有很大的相似之处,都是通过预测试得到光伏电池在光照强度、温度等外界条件不同时最大功率点(MPP)的电压或电流,这样我们就会得到一系列的离散的电压点或者电流点。而在实际光伏电池工作时,我们只需要检测当时的外界条件,就可以通过查表和简单的插值计算求出MPP处的近似电压或者近似电流,然后进行恒压控制。虽然CVT或者CIT看起来运算简单,而且追踪MPP的速度也十分可观。但是它的缺点也十分明显,毕竟它们跟踪到的值并不是实际的MPP,只是一个近似值。还有一个缺点就是经过长时间运行,光伏电池本身的特性也会发生变化,而这些变化也会引入误差,对MPP的判断造成干扰。
(2)自寻优控制算法
这种方法主要通过结合控制理论的同时根据光伏电池的等效模型和外部特性实现自寻优的MPPT。现如今主要有基于阻抗匹配和基于P—U曲线单峰值这两类自寻优控制算法。但是由于基于阻抗匹配MPPT算法在计算等效内阻抗的时候运用的微分和差分运算会引入干扰,这会使得系统的信噪比降低,上述问题严重阻碍了这一方法的实际应用。
基于P—U曲线单峰值MPPT算法主要有:扰动观察法、电导增量法以及这两种算法的改进算法。
通常扰动观察法的具体步骤大致可以分为两步,第一步我们需要先设置一个扰动,即在间隔一个采样周期后,以一个固定的步长增大或着减小光伏电池的输出电压值;第二步需要观察光伏电池的输出功率是增大还是减少,如果输出功率增加的话,之后就进行同向的扰动,反之,就进行反向的扰动。在经过了多次扰动后,光伏电池的输出功率就会达到MPP,或者是在MPP左右来回小幅度的震荡。
电导增量法是通过设定一些很小的步长,来判断当前是工作在MPP的哪侧,使光伏电池稳定在MPP附近的邻域里。当曲线斜率时,工作在MPP右侧,通过增大光伏电池输出电流的参考值来减小直流母线侧的电压,使得达到MPP;当曲线斜率时,工作在MPP左侧,通过减小光伏电池输出电流的参考值来增大直流母线侧的电压,使得达到MPP。电导增量法可以根据输出电流的变化来对蓄电池稳态变化做出正确的判断。
扰动观察法和电导增量法采用的是一种功率反馈的方式,虽然它们在硬件实现上比较简单,但是它们也有个明显的缺点:由于电压调整步长是固定的,即使达到稳定状态,它的实际工作点也会在最大功率点处来回晃动,这会造成一定程度上光伏输出功率的损失。虽然选择较小的步长会在一定程度上减缓在MPP的晃动现象,提高它的追踪精度,但是这也会使得其追踪速度大幅度地降低。
(3)智能化控制算法
随着现如今智能控制的飞速发展,一些学者也开始尝试将智能控制的方法用于光伏发电系统的MPPT中。智能化控制算法虽然相对于自寻优控制算法有较高的优越性,但是它也具有很多缺点。例如:模糊控制方法过度依赖于模糊规则的选取,而这常常需要操作者在这方面有很丰富的经验;人工神经网络、蚁群优化、粒子群算法这类智能算法的实现往往是建立在大量数据的基础上的。为了获得很好的结果,智能算法就需要比较长的运算周期和性能十分良好的硬件平台,这在一定程度上阻碍了其在现代工业控制中的应用。
本文采用了粒子群算法实现光伏电池的MPPT,下面将对其进行详细介绍。
粒子群算法研究
工作原理
粒子群算法最开始是由Kennedy和Eberhart在1995共同提出的,其基本思想是每个的潜在解都是搜索空间的粒子,所有的粒子都有一个被优化的函数决定的,每个粒子还有一个速度向量决定它们飞翔的方向和距离,然后粒子们就追随当前的最优粒子在解空间中进行搜索。
粒子群中的初始位置是在搜索区域内随机产生的,每个粒子群的初始速度也是随机。在搜索过程中,粒子群和每个粒子所经历的最好的位置及相应的适应度函数值都分别被记忆下来。粒子群优化算法的基本概念在于加速每个粒子朝它自己所经历的和种群所经历的最好位置移动。
根据粒子群算法的工作原理可以得到它的算法实现流程图如下:

图 粒子群算法实现流程图
仿真验证
在进行MPPT算法仿真测试时,设置光伏电池当光照强度为1000w/㎡,温度为25℃时的最大功率点(MPP)处的I=3.96A、V=33.68v。仿真得到光伏电池的U-I特性曲线如下图:

图 光伏电池U-I特性曲线
根据光伏电池的输出特性,可以得知对于外界条件恒定的输出功率为单峰值光伏电池模型,它的U-I特性曲线的拐点处为最大功率点。或许这样还不易判断仿真曲线是否与我们设置的最大功率点吻合,但经过数学计算的最大功率点的功率应该为P=33.68*3.96≈133w。

图 光伏电池P-I特性曲线
下一步将对应用粒子群算法实现MPPT的模型进行仿真,MPPT的Simulink仿真模型如下图所示。

图 粒子群算法MPPT的Simulink仿真模型
MPPT粒子群算法
global D;
global v; %初始化粒子群参数-速度
global P; %计算每次迭代的功率
global P_wending_best;%一次搜索结束后最大功率值
for k=1:3
v_old=v(k);
w=W_max-N/15*(W_max-W_min);
c1=C_1_max-N/15*(C_1_max-C_1_min);
c2=C_2_min+N/15*(C_2_max-C_2_min);
v(k)=w*v_old+c1*rand(1)*(dd(k)-D(k))+c2*rand(1)*(DD-D(k));
D_old=D(k);
D(k)=D_old+v(k);
if D(k)<0.1
D(k)=0.1;
end
if D(k)>0.9
D(k)=0.9;
end
end
%disp('更新的速度与占空比位置');disp(v);disp(D);
M=1;
N=N+1;
disp('最优占空比和最大功率值');disp(N-1);disp(DD);disp(Pbest);
%disp('粒子各自的最好值');disp(dd);disp(pbest);
disp('排序前');disp(D);disp(pbest);
if rem(N,2)==1 %粒子群粒子进行排序 按占空比从小到大 再从大到小
在该模型中,主要运用S-Function模块将编写好的扰动观察法封装成一个子系统,该系统将光伏电池输出电压和输出电流作为输入,输出控制Mosfet开关的占空比,通过占空比调节外部阻抗使其与内阻相等,这使光伏电池工作在最大功率点上。从图中可以看出光伏电池在4s左右通过MPPT追踪到MPP,并在之后的时间里在最大功率点工作。

图 粒子群算法光伏电池输出功率曲线
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
我有一堆要清理的URL。它们都包含UTM参数,在这种情况下不是必需的,或者是有害的。示例:http://houseofbuttons.tumblr.com/post/22326009438?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+HouseOfButtons+%28House+of+Buttons%29所有可能的参数都以utm_开头。如何使用ruby脚本/结构轻松删除它们而不破坏其他潜在的“好”URL参数? 最佳答案 您可以将正则表达式应用于url以清
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s
下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen
刚刚将应用程序从rails3.0.9升级到3.2.1,当我运行bundleexecrakeassets:precompile时出现错误,这很好,但是回溯没有告诉我在哪里语法问题来self的css或scss文件。我尝试对“0ee5c0e69c92af0”进行greping,但该字符串没有出现在我的项目中。bundleexecrakeassets:precompile:allRAILS_ENV=productionRAILS_GROUPS=assets--trace**Invokeassets:precompile:all(first_time)**Executeassets:precom
为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti
我正在开发一个类似微论坛的项目,其中一个特殊用户发布一条快速(接近推文大小)的主题消息,订阅者可以用他们自己的类似大小的消息来响应。直截了当,没有任何形式的“挖掘”或投票,只是每个主题消息的响应按时间顺序排列。但预计会有很高的流量。我们想根据它们引起的响应嗡嗡声来标记主题消息,使用0到10的等级。在谷歌上搜索了一段时间的趋势算法和开源社区应用示例,到目前为止已经收集到两个有趣的引用资料,但我还没有完全理解它们:Understandingalgorithmsformeasuringtrends,关于使用基线趋势算法比较维基百科页面浏览量的讨论,在SO上。TheBritneySpearsP
我正在使用gmailgem发送电子邮件,我需要跟踪这些电子邮件。我该怎么做?我正在尝试搜索带有message_id的电子邮件,但它会从我的收件箱中提取所有电子邮件,而我只想要特定电子邮件的回复。这是我的实际代码:*使用message_id保存电子邮件*mail=gmail.deliver(email)Email.create(:message_id=>mail.message_id,:from=>user.email,:to=>annotation.to,:body=>annotation.content,:title=>annotation.title,:annotation=>an
我正在使用paper_trail进行审计跟踪。除了创建、更新和删除事件外,我还想跟踪一些自定义事件,例如查看(记录)、发送(电子邮件)等。我们如何在审核模型时引入此类自定义事件? 最佳答案 我发现了一个调整,可以在paper_trail管理的Version中添加自定义事件:Version.create(item_type:"Campaign",item_id:campaign.id,event:"Sent")也许这不是正确的解决方案,但它帮助我实现了目标。我想更多地探索paper_trail以找到更好的解决方案。