☰
MATLAB/Simulink光伏遮阳仿真:从串联失配到多峰P-V曲线建模
2026/10/2 9:31:21 网站建设 项目流程

去年夏天在西北一个电站做现场踏勘,业主反复强调的既不是组件衰减、也不是逆变器故障,而是厂区东侧那排杨树的影子——下午三点以后,影子扫过三排组件,系统发电量肉眼可见地往下掉。从那时起我就养成一个习惯:任何光伏仿真,不管初始题目多理想化,最后都要把遮阳场景加进去。用 MATLAB/Simulink 做光伏组件遮阳仿真这件事,我前后折腾过好几版模型,从纯理想条件一步步走到带旁路二极管、能复现多峰 P-V 曲线的状态,踩了不少坑,也沉淀出一套自己觉得比较顺手的建模路径。这篇文章就把这套思路完整拆开,重点讲清楚:遮阳仿真到底在仿什么物理过程、Simulink 里该走哪条建模路线、如何用方程法把“串联失配”和“旁路二极管”做进去,以及最后怎么批量扫描遮阳模式、把模型效率提上来。无论你是要做组件失配分析、MPPT 算法验证,还是电站布局优化,这套模型都能直接拿去改。

1. 为什么遮阳仿真比想象中更“吃”模型精度

很多初学者拿到 Simulink 里的 PV Array 模块,拖出来就能出 I-V 曲线,于是以为遮阳仿真就是把辐照度调低一点。但真到了“影子扫过半块组件”这种场景,你会发现简单的辐照度缩放根本解释不了功率为何出现双峰,也解释不了热斑是怎么来的。遮阳仿真的本质不是调参数,而是要模拟一串组件在电流强制一致、电压自由分配条件下的失配行为。

1.1 阴影下的组件不再是一块“电池”,而是一个“负载”

要理解遮阳仿真,先得想明白被挡住的那块电池在电路里扮演什么角色。正常光照下,组件内部几十片电池串联,每一片的光生电流都大于外部回路电流,大家轻松工作。可一旦某一片被阴影盖住,它的光生电流骤降,外部回路电流却仍然由其他未遮挡电池决定——这就迫使被遮电池工作在反向偏置状态,把其他电池发出来的功率当成“负载”消耗掉,转化为热量。这就是热斑效应的电学根源。

如果没有旁路二极管保护,温度可能一路冲到 150°C 以上,封装材料加速老化,严重时直接烧穿背板。而有了旁路二极管之后,当被遮电池所在子串的反向电压达到二极管导通阈值,二极管就会把该子串旁路掉,电流绕过故障点,损失的是电压而不是整串崩溃。所以遮阳仿真的核心任务,就是把这个“反向偏置—二极管导通—电压塌陷”的过程在模型里真实还原出来。这也是为什么我说它比普通组件模型更吃精度:普通模型只关心“挡住之后电流降多少”,遮阳模型关心的是“挡住之后电压怎么变、功率往哪个峰值转移”。

1.2 单二极管模型:工程上够用,细节上别太粗糙

做遮阳仿真,组件电学模型我几乎只用单二极管五参数模型,不用更复杂的双二极管。原因很简单:双二极管模型在低辐照下的拟合更精细,但五参数模型在工程方案筛选、失配分析、MPPT 算法验证这些场景下精度完全够用,计算量还小得多。五参数模型的方程是:

I = Iph - I0 * (exp((V + IRs) / (nVt)) - 1) - (V + I*Rs) / Rp

其中 Vt = k*T/q。五个参数分别是光生电流 Iph、二极管反向饱和电流 I0、二极管理想因子 n、串联电阻 Rs、并联电阻 Rp。Iph 决定短路电流,I0 和 n 共同决定开路电压附近的曲线形状,Rs 大则填充因子变差、最大功率点电压明显下降,Rp 小则低电压段曲线变“软”。遮阳仿真的关键就在于:被遮挡组件不仅有 Iph 下降,还会因为反向偏置进入一个普通 PV 模型描述不了的区域,这时就一定要把旁路二极管机制接入,否则模型在反向区会给出荒谬的结果。我见过不少仿真报告,组件反向电压算出来 -20V,明显已经不物理了,就是因为没做好这层处理。

2. Simulink 里两条建模路线,我最终选了方程法

到 Simulink 里实际动手时,你会发现建模路线主要两条:用 Simscape Electrical 搭物理拓扑,或者用 Matlab Function / S-Function 写方程。两条路我都完整走过,结论是:如果是做“系统级”仿真,比如组件 + 逆变器 + 电网的并网验证,Simscape 占优势;如果核心目标是“遮阳失配分析”本身,方程法在灵活性和计算效率上完胜。

2.1 Simscape Electrical:搭电路快,但遮阳场景管理很别扭

Simscape Electrical 的 SimPowerSystems 库里有现成的 PV Array 模块,直接把辐照度、温度信号接进去就能跑。这套路的优点是直观:元器件拖出来连上,像是搭积木,而且自带电气求解器,旁路二极管也能从库里面找。但用上几次你就会发现几个很实际的问题:

一是参数批量管理困难。做遮阳场景往往要扫描几十上百种遮挡模式,Simscape 的每个 PV 模块参数都是通过 mask 界面设置的,虽然可以用set_param脚本改,但每改一次都要重新编译一次模型结构,仿真速度被拖累。二是 PV Array 模块对“部分遮挡”的支持比较间接。因为一个模块代表一块组件,你没法直接告诉它“这块组件的上三分之一被树叶遮了”,你得把组件拆成三个子串模块,分别设置不同的辐照度,再手工接旁路二极管。拆一次还好,拆十块、二十块组件,模型图就变成了蜘蛛网。三是 Simscape 求解器在处理反向偏置和二极管导通边界时,容易因为数值刚度问题收敛失败,尤其是二极管从截止到导通的跳变瞬间,步长会压得非常小。不是说这条路不能用,而是它的适用场景是“我要搭完整的光伏并网系统,顺便看一下遮挡影响”,而不是“我要系统研究遮挡模式对功率输出的影响”。

2.2 Matlab Function + 方程法:每个遮阳因子都看得见摸得着

方程法的逻辑完全不同:不画电路拓扑,把组件当作一个可求解 I-V 关系的数学函数,遮阳因子、温度、辐照度都作为输入参数传入。Simulink 里用 Matlab Function 块写这段方程,或者干脆直接写 .m 函数文件,用脚本驱动。优势非常明显:

首先,遮阳场景可以参数化。我可以定义一个组件数组,每个元素带自己的辐照度、温度、遮阳比例,然后用 for 循环或 parfor 并行扫描所有模式,根本不用动模型结构。其次,计算过程完全可控。旁路二极管的导通逻辑、反向区的特殊处理,全部写在自己的代码里,出问题直接断点调试,不用摸黑猜。第三,计算效率高。Simulink 的 Matlab Function 块在运行时会编译成高效代码,配合脚本批量调用,几秒钟就能算完几十种遮挡模式,而 Simscape 往往要先等模型编译,再跑动态仿真。所以我后来的遮阳仿真基本全走方程法,Simscape 只在最后做完整系统验证的时候才搬出来。这篇博文的后半部分,也都是围绕方程法展开。

3. 遮阳核心逻辑:串联失配、旁路二极管与电流匹配

现在进入最关键的建模细节。遮阳仿真和普通光伏仿真的最大区别,在于多个组件串联时电流必须相等,而每块组件的电压却是自由分配的。理解这句话,才算是摸到了遮阳仿真的门槛。

3.1 被遮挡组件电压如何“塌陷”:从 I-V 曲线讲起

先看单块组件。一块组件被遮一部分后,短路电流 Isc 明显下降,但开路电压 Voc 几乎不变——因为光生电流和辐照度近似成正比,而开路电压只随辐照度对数变化。这个特性决定了串联失配的核心矛盾是“电流瓶颈”而不是“电压瓶颈”。

把两块组件串起来看,如果一块被遮,整串电流被被遮组件的电流卡死,未遮挡组件为了维持电流一致,只能在更低的电压点工作,输出功率被白白浪费。更麻烦的是,如果遮挡严重到让被遮组件的电流低于系统工作电流,组件内部就必须靠旁路二极管来“消化”这部分矛盾。旁路二极管导通后,被遮组件端电压被钳位在一个很小的负值(一般是 -0.5V 左右),整串的电流得以恢复,但电压损失了一个子串的量。这个“电流恢复、电压塌陷”的过程就是 I-V 曲线上出现阶梯的根本原因。

3.2 旁路二极管的 threshold 和压降怎么处理

旁路二极管的建模,工程上最常见的是用一个带阈值的分段函数。在组件电压大于某个反向阈值 Vbd(典型值 -0.5V)时,二极管视为截止;当组件电压要被拉低到 Vbd 以下时,二极管导通,把组件端电压钳位到 Vbd。写成 Matlab 伪代码就是:

function Vc = apply_bypass_diode(V_raw, Vbd) % Vbd 为旁路二极管导通阈值(负值,例如 -0.5V) if V_raw < Vbd Vc = Vbd; else Vc = V_raw; end end

这个近似对大多数工程分析都足够了,因为真实二极管的导通曲线在导通后非常陡,钳位特性的差距不到零点几伏,对功率计算影响很小。但要注意一个细节:旁路二极管是并联在“子串”上,不是并联在整块组件上。一个典型 60 片电池的组件内部有 3 个子串,每个子串并联一个二极管,所以组件被局部遮挡时往往只是某个子串被旁路,组件电压只塌陷 1/3 左右。这个细节不处理好,整串电压会算错不少。我建议的建模粒度就是“子串级”:把一块组件拆成 3 个虚拟子串模型,每个子串有自己的光生电流和旁路二极管,然后再把 3 个子串串联成一块组件。

3.3 整串组件的电压扫描法:把 N 块组件串起来

多块组件串联后,计算 I-V 曲线不能简单地各算各的再相加,而要用“电流扫描法”:固定一个整串电流 I,逐块求解这块组件在该电流下的端电压,再把所有电压累加。这个思路的物理依据是串联电流连续性——外界不可能给一串组件强行指定不同的电流,组件只会自动分配到同一电流值。具体程序框架如下:

I_scan = linspace(0, Isc_ref * 1.05, 200); V_string = zeros(size(I_scan)); for k = 1:numel(I_scan) I = I_scan(k); V_total = 0; for c = 1:N % 求解第 c 块组件在电流 I 下的电压(可能为负) Vc = solve_component_voltage(I, G_eff(c), T(c), params(c)); V_total = V_total + Vc; end V_string(k) = V_total; end P_string = I_scan .* V_string;

solve_component_voltage内部做单组件模型的逆运算,也就是给定电流求电压。因为单二极管模型的方程里,电压和电流耦合在一起,无法显式解出 V=f(I),需要用 fzero 或牛顿迭代求根。这段代码跑出来的 I-V 曲线天然会呈现台阶,P-V 曲线天然会出现多峰,不需要任何额外的人为构造。这里我说句实在话:网上很多分享里所谓“做出了多峰曲线”,很多是把几个组件并联输出再叠加,物理上是错的。串联组件必须用电流扫描法,这是最容易犯错也最重要的知识点。

4. 模型参数从哪来:厂商数据表反推五参数,别瞎猜

模型写好了,参数却经常被忽略。很多人拿一套默认参数跑完仿真就发报告,但不同组件的 Rs、Rp、I0、n 差异非常大,参数不对,最大功率点能偏出 5%-10%。对于遮阳仿真这种对曲线形状敏感的分析,参数质量直接决定结论可信度。

4.1 五参数标定:从 datasheet 到可用的模型输入

厂商数据表会给出标准测试条件(STC)下的 Isc、Voc、Vmp、Imp,还有短路电流温度系数和开路电压温度系数。要用这组数据反推五参数,一个稳妥的做法是最小二乘拟合整条 I-V 曲线,让模型在 Isc、Voc、MPP 三个关键点都尽量贴合。操作上我会用 lsqcurvefit 或 fminsearch,目标函数是误差平方和,初始值给一组工程上常见的猜测:n=1.0~1.4,Rs=0.001~0.01,Rp=200~1000,I0=1e-9~1e-11 量级。拟合时注意权重分配:MPP 附近的误差权重给大一点,因为最大功率点的准确度直接决定遮阳仿真结果是否可信。

下面是一份典型 270W 多晶组件五参数的拟合结果示例,不同批次会有差异,但量级可以参考:

参数拟合值说明
Iph8.98 A接近 Isc
I01.2e-9 A和温度强相关
n1.18与电池工艺有关
Rs0.38 Ω影响填充因子
Rp380 Ω影响低电压段斜率

拿到五参数后,温度和辐照修正同样要写进去。光生电流 Iph 随有效辐照度线性变化,随温度轻微变化;I0 随温度近似指数上升。如果不做温度修正,模型在非 STC 条件下会明显偏大,尤其是夏天组件温度到 60-70°C 时,开路电压会比 STC 低不少。

4.2 遮阳衰减系数 SF 的确定与两个反直觉现象

遮阳的物理输入通常用一个衰减系数 SF 表示:G_eff = SF * G_ref。SF=1 表示无遮挡,SF=0 表示完全遮挡,实际常见的是 0.2 到 0.8 之间的值——树叶缝隙、灰尘积累、云影边缘都属于这种情况。我在做厂区遮挡分析时,会用无人机航拍 + 日照分析软件先确定阴影轮廓,再算出每个时间点每块组件的等效 SF,而不是拍脑袋给个 0.5。

这里有两个反直觉现象值得单独说。第一,遮挡面积和功率损失不是线性关系。因为旁路二极管有“开关特性”,遮挡从 20% 加深到 40% 可能功率只缓慢下降,但一旦某个子串的光生电流低到旁路二极管导通临界点,整串功率会突然跳降。第二,同样面积的遮挡,位置不同结果天差地远:遮在同一个子串上的阴影比均匀散落在三个子串上的阴影对功率影响大得多,因为集中遮挡会触发子串旁路机制。所以做遮阳仿真时,遮挡模式不能用“面积百分比”笼统描述,必须细化到子串级别。我在实际项目中吃过这个亏:一开始只按面积比例折算辐照,结果仿真功率比实际发电量高出 8%,后来改成子串级遮挡模式才对上。

5. 仿真结果怎么读:阶梯、双峰与热斑功率的数字证据

模型搭好后,最激动人心的时刻就是看到 I-V 曲线上出现阶梯、P-V 曲线上出现双峰。但这只是开始,关键是要能从结果里读出工程判断:全局最大功率点到底在哪?热斑功率损耗有多大?不同遮挡模式下系统应该按什么策略运行?

5.1 一串 6 块组件的典型仿真现象

我拿一串 6 块 270W 组件做测试,无遮挡时整串功率约 1620W,I-V 曲线近乎方形,P-V 曲线单峰。然后给其中一块组件左侧 1/3 子串设 SF=0.3,相当于深度遮阳。仿真结果如下:

遮挡模式Pmax 近似值曲线形态
无遮挡1620W单峰
1 块组件的 1 个子串被遮(SF≈0.3)约 1530W双峰,全局峰在高电压侧
同一子串浅遮(SF≈0.5)约 1250W~1350W双峰明显,全局峰可能移至低电压侧
2 块组件各遮 1 个子串约 1100W~1200W多峰,峰位复杂

注意第二行到第三行的跳跃性:遮挡从“几乎全遮”变成“遮一半”,功率损失反而更大,这是因为 SF=0.5 时子串光生电流没有低到触发旁路二极管,于是整串电流被卡在浅遮子串的电流水平上,未遮挡组件被迫降功率工作。这个现象在真实电站里也很常见:一片不厚不薄的云影,往往比完全遮死更伤发电量。仿真模型能把这个效应量化出来,对运行策略优化很有价值。

5.2 多峰值 MPPT 陷阱,以及仿真模型如何变成算法试验台

曲线出现多峰,随之而来的就是 MPPT 算法的老大难问题。传统扰动观察法(P&O)在单峰曲线上表现良好,但遇到双峰曲线,一旦初始工作点落在局部峰附近,就会稳定在错误的功率点,损失可能高达百分之十几。我之前做过一组对照实验:同样的遮挡条件下,普通 P&O 收敛到局部峰,功率只到全局最大功率点的 78% 左右。

用这套遮阳仿真模型,就可以很方便地验证和改进 MPPT 策略。比如全局扫描 + 局部细化的两步法:第一步大步长扫描全电压范围,锁定几个峰的大致位置;第二步在每个峰附近用小步长扰动,找到全局峰。又比如用粒子群算法(PSO)做全局寻优,模型提供带多峰特性的功率函数,PSO 的每个粒子就是一个候选工作电压,迭代几次就能收敛到全局峰。模型的核心价值在于:它能快速、批量地生成各种遮挡模式下的功率曲面,让算法开发者在几小时之内跑完以往需要现场实测一周才能积累的测试用例。

6. 从单串到全阵列:批量遮阳场景扫描与效率优化

做完单串仿真,下一个自然的问题就是:一个 10×10 的组件阵列,下午三点的那片树影会让总功率掉多少?如果我要在十几种布局方案里比选,总不能一个个手改模型,这时候批量扫描能力和建模效率就是决定性因素。

6.1 把组件模型封装成可扫描的 MATLAB 函数

我的做法是先把子串模型写好,再封装成组件函数和串函数,所有参数用结构体传入。程序结构大体是三层:

第一层是物理函数,比如solve_substring_voltage(I, G_eff, T, params),负责单个子串在指定电流下的电压求解。第二层是组件函数,把三个子串串联起来,内部处理旁路二极管逻辑。第三层是串和阵列函数,接收一个遮挡模式矩阵(元素是各子串的 SF 值),循环组合成整串 I-V 曲线。这样每层职责单一,出 bug 很好定位。扫描不同遮挡模式时,只需要改模式矩阵,然后循环调用:

% 遮挡模式矩阵:每行代表一个子串的 SF SF_matrix = ones(3, 100); SF_matrix(1, 17) = 0.3; % 第 17 块组件第一子串被遮 SF_matrix(2, 34) = 0.5; % 第 34 块组件第二子串浅遮 % ... 其余为1 I_scan = linspace(0, 9.5, 300); for col = 1:100 V_string = compute_string_voltage(I_scan, SF_matrix(:, col)); P_string = I_scan .* V_string; Pmax(col) = max(P_string); end

这种设计可以让你很方便地做“逐时逐季”的遮挡扫描:把一年 8760 小时的影子轨迹都算成 SF 矩阵序列,然后一次性算出全年发电量,比在 Simulink 里搭 100 个 PV Array 模块再并联的方式高效太多。甚至可以用 parfor 把不同月份的扫描并行起来,核心计算时间能压到秒级。

6.2 组件数量与计算时间的平衡:向量化和初值优化

批量扫描最大的敌人是求解速度。单层函数里如果每个电流点都调用 fzero,几百个电流点 × 几十块组件 × 几十种模式,计算量会迅速膨胀。我实测过一种瓶颈场景:100 块组件 × 300 电流点 × 50 种遮挡模式,纯循环实现要跑十几分钟。优化三个地方之后,基本几十秒内完成:

一是用上一个解做下一个解的初值。因为 I-V 曲线是连续平滑的,上一次 fzero 解出的电压就是本次迭代一个很好的初始猜测,收敛次数大幅减少。二是尽量向量化内部运算,能用矩阵运算就别用单个元素循环。三是在反向区和旁路二极管导通区,直接套用简单的钳位逻辑,不进入迭代求解,跳过数值困难区。这三个优化做完,效率提升是数量级的。

6.3 别忘了和实测数据对一对

仿真做得再漂亮,最后一定要回到实测。我的校准流程是:拿一块组件在户外做不同遮挡比例的 I-V 测试,用 I-V 曲线测试仪记录数据,然后把实测时的辐照、温度代入模型,对比仿真曲线和实测曲线。这里有一个极易踩的坑:对比时务必用实测的 G 和 T 作为输入,而不是 STC 标称值。有一次我拿 STC 参数去匹配阴天下的实测数据,结果最大功率点偏差超过 10%,排查了很久才发现是辐照度没修正好,而不是模型本身的问题。另一个经验是组件老化会让五参数漂移,最好是每个季度重新标定一次,尤其是运行多年的老电站。如果你只是做理论分析,这套仿真模型已经足够;但如果你的结论要支撑投资决策、发电量预测,实测校准这一关绝对不能省。

我个人在实际工作中的体会是:遮阳仿真追求的不是“绝对精确”,而是在合理误差范围内把失配机理讲清楚,在不同方案之间拉开差距。模型的价值在于帮你快速筛掉明显不行的布局、验证 MPPT 策略的鲁棒性、估算热斑风险。等到真需要精算发电量时,再用实测数据逐步校准——这时候你会发现,当初在 MATLAB/Simulink 里把旁路二极管、子串级遮挡、电流扫描法这些东西扎扎实实做进去,比什么捷径都管用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询