多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

光伏特性曲线建模:从Matlab脚本到Simulink分布式仿真

光伏特性曲线建模:从Matlab脚本到Simulink分布式仿真 做光伏系统设计这几年我越来越觉得特性曲线才是光伏组件最诚实的自我介绍。拿到一块组件的 datasheet 时上面其实只有短路电流、开路电压、最大功率点这几个离散的点可真要搭 MPPT 控制、核算组串失配、评估阴影遮挡损耗的时候光有这几个点根本不够用——你需要一整条连续的 I-V 曲线和 P-V 曲线。这篇文章想把我用 Matlab 脚本和 Simulink 建模光伏特性曲线模型、再从单组件扩展到分布式阵列模型的完整思路梳理一遍。不打算罗列教科书原理而是从工程复现的角度出发把每一步为什么这么干、参数从哪来、模型怎么验证都讲清楚。适合正在做光伏课题的本科生和研究生也适合刚转光伏系统设计的电气工程师参考。1. 光伏特性曲线到底在描述什么1.1 为什么 datasheet 给的几个点根本不够用光伏组件的 datasheet 通常只会给标准测试条件STC即电池温度 25℃、辐照度 1000 W/m²、AM1.5 光谱下的几个关键点短路电流 Isc、开路电压 Voc、最大功率点电压 Vmp 和电流 Imp。这四个点能帮你快速估算组件的标称功率但真实工程里几乎没有组件会一直工作在 STC 条件下。屋顶的辐照度早上可能只有 300 W/m²中午冲到 1000 W/m²电池背面温度到了夏天能摸到 60℃以上。在这种变化环境下最大功率点的位置会不断漂移想要让逆变器里的 MPPT 算法准确追踪必须知道整个电压范围内的电流和功率分布也就是完整的 I-V 曲线和 P-V 曲线。曲线的价值还体现在系统级问题上。比如两个不同朝向的组件串联成一组组串组串总电流会被电流较小的那一块拖累再比如光伏阵列局部被树叶或栏杆遮挡P-V 曲线会从单峰变成多峰普通的 MPPT 算法一旦陷入局部最优发电量损失肉眼可见。这些问题靠几个离散点根本分析不了只能回到连续曲线模型上去算。所以我带学生做课题时第一步永远是让他们把组件的整条曲线画出来画出来很多问题自然就暴露了。1.2 从等效电路理解 I-V 曲线为什么是先平后掉要理解曲线的形状最直观的方式是看光伏电池的等效电路。一块电池本质上是一个光生电流源 Iph 并联一个二极管再串上一个代表电极和半导体体电阻的 Rs并联一个代表漏电流路径的 Rsh。光生电流和辐照度近似成正比辐照 1000 W/m² 时大约等于短路电流 Isc这是整个电路的主能量来源。当外加电压接近 0 时二极管两端压差很小几乎不导通大部分光生电流都流向外电路所以电流接近 Isc曲线这一段看起来很平。随着电压升高二极管开始正向导通把一部分电流分流掉外电路电流开始缓慢下降。等电压接近 Voc 时二极管完全导通光生电流全部被二极管吃掉外电路电流归零。中间那个电流开始明显下滑的膝盖区域就是最大功率点附近。P-V 曲线则是把电压和电流相乘得到的所以先升后降形成一个单峰。峰值点就是最大功率点也是 MPPT 算法拼了命要找到的位置。我习惯用一个生活类比来记忆光生电流像水龙头流出的水二极管像一个底部开了口的水池外加电压决定了水池水位。水位低时水流都从池边漫出去水位高到接近池沿时水开始大量从底部漏走漫出去的水流自然就变小了。电路的串联电阻 Rs 和并联电阻 Rsh 则相当于管道阻力和池壁的渗漏都会让这个膝盖的位置和陡峭程度发生变化。1.3 一张表记住八个常用参数表格里这八个参数你只要做三个月组件分析就会倒背如流。这里顺便提一句很多仿真软件里填参数时不需要你手头有 datasheet 原件组件型号对应的标准参数通常可以从制造商官网的 PDF 数据表里直接查到但要注意区分 STC 和 NOCT额定工作温度条件两套值NOCT 是 800 W/m² 辐照、20℃ 环境温度下的结果常用于估算实际工作温度不能直接拿来当模型输入。参数含义典型值72片单晶组件工程意义Isc短路电流11.2 A组串和逆变器选型上限Voc开路电压45.5 V组串电压叠加后不能超逆变器直流端上限Vmp最大功率点电压37.8 VMPPT 工作范围Imp最大功率点电流10.6 A额定输出电流Pmax最大功率约 400 W组件标称功率FF填充因子 Pmax / (Voc × Isc)约 0.78表征曲线饱满程度和电池质量Ki电流温度系数0.05%/℃高温时电流微增Kv电压温度系数-0.29%/℃高温时电压显著下降填充因子 FF 是很容易被忽略但对模型质量很敏感的参数。工程上如果发现实测曲线的最大功率点和 datasheet 对不上多半就是 Rs 和 Rsh 的初值没给好导致 FF 偏小。把 FF 纳入验证指标比单纯盯着最大功率点一个值更靠谱。2. 模型选型与参数初值单二极管模型怎么落到工程上2.1 五参数方程里每一个物理量都对应电路里的一个角色光伏电池工程建模用得最多的就是单二极管五参数模型等效电路前面已经描述过数学上对应一个隐式方程I Iph - I0 × (exp((V I × Rs) / (n × Ns × Vt)) - 1) - (V I × Rs) / Rsh其中 Vt kT/q是热电压常温下大约 25.7 mV。方程里的五个待定参数分别是光生电流 Iph、二极管反向饱和电流 I0、二极管理想因子 n、串联电阻 Rs 和并联电阻 Rsh。Ns 是组件内串联的电池片数量72 片半片组件常按 72 或 144 半片处理填参数时别搞混。为什么这个方程是隐式的因为电流 I 同时出现在等式左边和右边的指数项里。物理上这很好理解输出电流越大在 Rs 上产生的压降越大二极管两端的实际电压 V I×Rs 就越高二极管的漏电流又反过来影响输出电流。这种互相耦合的关系没法直接移项解出 I f(V) 的显式表达式只能靠数值求解。这也是很多刚接触的人第一次在 Matlab 里画曲线时卡住的地方。五个参数的物理角色要分清。Iph 决定曲线整体高度主要受辐照度影响I0 和 n 决定膝盖的位置和陡峭程度Rs 主要影响最大功率点附近的曲线斜率Rs 越大最大功率点电压越低曲线越塌Rsh 影响短路点附近的斜率Rsh 越小靠近 Isc 处电流下降越快曲线的平的部分变短。调参时记住这些对应关系能少走很多弯路。2.2 从铭牌参数手推五参数初值多数人没有实测的 I-V 曲线数据只能从 datasheet 的四个点Isc、Voc、Imp、Vmp出发估算初值然后让优化算法去精修。工程上常用的初值策略很直接Iph 初值直接取 Isc。因为在短路点附近二极管尚未明显导通并联电阻分流也可忽略光生电流和短路电流数值上非常接近。I0 初值用开路点的方程反推。令 I 0忽略 Rsh 的分流项之后可以得到 I0 ≈ Isc / (exp(Voc / (Ns × n × Vt)) - 1)。Rs 初值可以先从 0 或一个较小的正数开始比如 0.1 到 0.3 欧姆。Rsh 初值给一个较大的数比如 300 到 1000 欧姆因为漏电流路径正常情况下阻抗很高。n 的取值在 1 到 1.5 之间单晶硅电池常见值约 1.0 到 1.2多晶硅略高。先取 1.2 作为起点不会错得太离谱。拿到这组初值之后用最小二乘法拟合整条 I-V 曲线目标函数是实测电流与模型电流的残差平方和。这一步在 Matlab 里可以直接用 lsqcurvefit 做也可以自己写一个简单的梯度下降或信赖域循环。我个人的经验是初值给的越接近真实值拟合越快而且不容易陷入局部最优。如果你发现拟合出的最大功率点偏差超过 2%先回头检查 Rs 初值这是最常见的元凶。2.3 双二极管模型只有在低温低辐照下才值得较真单二极管模型在大多数工程场景下已经够用但也有较真的场景比如高精度组件测试、低温低辐照下的暗电流分析。在这些工况下单二极管模型对曲线膝盖附近的拟合偏差会明显变大这时可以考虑双二极管模型它把二极管漏电机制拆成两部分一个理想因子接近 1 的扩散电流分量一个理想因子接近 2 的复合电流分量。代价是参数从五个变成七个多了第二个二极管的饱和电流 I02 和理想因子 n2。参数变多意味着拟合自由度变大但也更容易过拟合对初值更敏感。我自己的判断标准是如果只是做 MPPT 算法仿真和系统容量计算单二极管模型完全够如果是在实验室做高精度组件标定或者研究低温环境下的组件特性才值得用双二极管模型。不要为了炫技把模型搞复杂仿真时间变长不说参数多了反而更难调。3. 辐照、温度与遮挡如何改变曲线形态3.1 辐照和温度对方程系数的影响有多直接辐照度 G 对光生电流的影响几乎是线性的Iph (G / 1000) × (Iph_STC Ki × (T - 25))。辐照从 1000 W/m² 降到 200 W/m²Iph 也跟着降到原来的五分之一整条 I-V 曲线的高度明显下降。但 Voc 随辐照的变化是对数关系辐照减半Voc 只下降几十毫伏远没有电流那么剧烈。温度的影响则集中在电压上。硅电池的 Voc 温度系数大概是每度负 0.29% 到 0.3%一块 45.5V 的组件温度从 25℃ 升到 65℃开路电压会掉 5V 以上。而 Isc 的温度系数是正的大约每度 0.05%影响小一个量级。这导致一个很有意思的结果高温下组件电压明显下降功率也跟着降低温下电压高反而是冬季早晨容易出现组串电压超过逆变器直流输入上限的情况。设计组串电压时一定要按冬季最低温校核 Voc。在 Simulink 的 PV Array 模块里辐照度和电池温度都是外部输入信号可以直接接斜坡信号或者读气象文件的 lookup table。很多初学者会把电池温度直接当成环境温度这是个常见的坑。电池温度应该按照 NOCT 公式估算Tcell Tamb (NOCT - 20) / 800 × G一个晴朗夏天正午环境温度 35℃ 时电池温度可以轻松到 60℃ 以上曲线和 25℃ 标准条件下的差异非常明显。3.2 为什么局部遮挡后的 P-V 曲线会长出驼峰这是分布式建模里最头疼的问题。一个组件内部通常有 3 个旁路二极管把 72 片电池分成三段。当某一段被遮挡时这一段电池组从发电状态变成耗电状态旁路二极管导通把这段短路掉组件电压下降三分之一但电流通路保住。问题是不同的遮挡模式对应不同的旁路状态组合P-V 曲线会因此出现两个甚至三个局部峰值。举个例子组件三分之一被遮挡时如果旁路二极管导通电流可以绕开被遮挡的那段但组件电压只剩大约三分之二。此时 MPPT 如果追踪到的是低电压高电流的峰值可能就停在那里而不是更优的高电压低电流峰值。这就是多峰 P-V 曲线让普通扰动观察法失效的原因也是为什么现在逆变器厂商都强调全局扫描或者智能多峰 MPPT能力。在模型层面要复现这种多峰曲线单二极管模型就不够了必须把组件内部按旁路二极管分段建模每一段是一个独立的单二极管子模型再把三个子模型串联每段并联一个理想二极管表示旁路。Simulink 里可以分别搭三段子系统再封装也可以直接用代码写一个分段函数。这个分段思路也是后面分布式阵列模型的基础。3.3 STC 和实际工况差异带来的设计陷阱STC 的价值在于提供一个统一比较基准但它和真实工况差距很大。实际运行的组件很少能遇到刚刚好 1000 W/m²、25℃ 电池温度的条件特别是在中国南方夏季中午辐照确实能到 1000但电池温度往往 60℃ 以上实际功率比标称低 10% 以上。如果只按 STC 数据做方阵容量设计会带来两个问题。一是夏季高温时段逆变器可能一直工作在接近限功率状态这时候你以为是逆变器选小了其实是因为组件实际温度太高功率上不去。二是冬季低温时组件电压升高按 STC 算出来的组串串联数可能在极端低温时超过逆变器直流输入电压上限。所以做工程核算时一定要把模型放到 -10℃ 到 70℃ 的电池温度范围和 200 到 1200 W/m² 的辐照度范围里跑一遍看所有极端点的 I-V 曲线是否都落在逆变器允许窗口内。4. Matlab 脚本建模实操用 50 行代码复现整条曲线4.1 隐式方程为什么不能直接 plot很多人拿到方程第一反应是直接画给定 V 从 0 扫到 Voc套公式算出 I然后 plot。跑通之后发现曲线在最大功率点附近对不上 datasheet或者干脆算出负电流。这是因为方程里 I 在指数项里你没办法简单地把 I 移到一边然后代入 V 求值。必须对每一个 V在给定初值的情况下数值求解这个非线性方程Matlab 里最常用的就是 fsolve。fsolve 是一个基于信赖域或狗腿法Dogleg的非线性方程组求解器你只需要给它一个匿名函数和初始猜测值它会在搜索空间里迭代找零点。初值的重要性前面说过这里再强调一次在扫描整条曲线时最稳妥的方式是用前一个电压点对应的电流作为当前点的初值这样电流变化连续fsolve 每次都能很快收敛而且不会在膝盖附近跳来跳去。4.2 带初值递推的 fsolve 扫描脚本下面这段代码是我在实际项目中常用的简化版本可以直接复制到 Matlab 里跑。它从 datasheet 的四个铭牌参数出发手推五参数初值然后扫描电压得到整条 I-V 和 P-V 曲线。注意我把 fsolve 的初值设置成了递推式第一次从 Isc 出发后面每次都沿用前一个点的计算结果这种连续性处理让求解稳定很多。%% 单二极管五参数模型datasheet 点到全曲线 % 基本物理常数 q 1.602176634e-19; % 电子电荷C k 1.380649e-23; % 玻尔兹曼常数J/K T 25 273.15; % 电池温度KSTC n 1.2; % 理想因子初值 Ns 72; % 串联电池片数 % 从 datasheet 读取的 STC 参数以某72片单晶组件为例 Voc 45.5; % 开路电压V Isc 11.2; % 短路电流A Vmp 37.8; % 最大功率点电压V Imp 10.6; % 最大功率点电流A % 手推五参数初值 Iph Isc; % 光生电流初值 Vt Ns * n * k * T / q; % 热电压考虑串联片数 I0 Isc / (exp(Voc / Vt) - 1); % 反向饱和电流初值 Rs 0.25; % 串联电阻初值后续可调 Rsh 300; % 并联电阻初值后续可调 % 隐式方程fun(I, V) 0 fun (I, V) Iph - I0 * (exp((V I * Rs) / Vt) - 1) ... - (V I * Rs) / Rsh - I; % 电压从 0 扫到 Voc用前一个点的电流作为后一个点初值 Vscan linspace(0, Voc, 200); Iscan zeros(size(Vscan)); Iguess Isc; options optimoptions(fsolve, Display, off, MaxIterations, 200); for i 1:length(Vscan) Iscan(i) fsolve((I) fun(I, Vscan(i)), Iguess, options); Iguess Iscan(i); % 递推初值大幅提升收敛稳定性 end % 计算 P-V 曲线并定位模型的最大功率点 P Vscan .* Iscan; [Pmax_model, idx] max(P); Vmp_model Vscan(idx); Imp_model Iscan(idx); fprintf(模型最大功率: %.2f W Vmp%.2f V, Imp%.2f A\n, ... Pmax_model, Vmp_model, Imp_model); % 绘图 figure; subplot(2,1,1); plot(Vscan, Iscan, b-, LineWidth, 1.5); grid on; xlabel(电压 V (V)); ylabel(电流 I (A)); title(I-V 特性曲线单二极管模型); subplot(2,1,2); plot(Vscan, P, r-, LineWidth, 1.5); grid on; xlabel(电压 V (V)); ylabel(功率 P (W)); title(P-V 特性曲线单二极管模型);跑完这段代码命令行会打印出模型计算出的最大功率点。我这里用的铭牌参数算出来应该在 400W 附近也就是 Vmp 乘以 Imp 差不多等于 37.8 × 10.6 400.7W。如果 fsolve 报迭代不收敛或者模型最大功率点明显偏离比如差 5% 以上优先检查初值特别是 I0 和 Vt 的计算有没有被 Ns 绕晕。半片组件如果按 144 半片计算Vt 直接翻倍初值就全错了。4.3 模型校验仿真曲线要和铭牌点尽量重合模型建完必须验证不能画完曲线就算完事。我的校验标准有四个点短路点0, Isc、开路点Voc, 0、最大功率点Vmp, Imp再加上曲线在最大功率点附近的填充因子 FF。后一个是我从实际项目中总结出来的经验因为只盯最大功率点的话可能会遇到 Vmp 和 Imp 碰巧算对了但曲线整体形状和实测不符的情况也就是说模型在别的电压区间失真。加上 FF 一起校验曲线形态才有保障。校验的另一个手段是调节 Rs 和 Rsh 对比曲线的变化趋势。Rs 增大最大功率点电压左移曲线膝盖变钝Rsh 减小短路点附近电流下降曲线不再是水平的。如果你做的是实际项目而不是仿真练习建议用组串测试仪现场实测几条不同辐照下的 I-V 曲线再用 lsqcurvefit 做参数辨识。实测数据的拟合对数比单纯对着 datasheet 调参可靠得多因为 datasheet 上给的 Voc 和 Isc 是标准条件平均值真实组件个体之间是有离散性的。5. Simulink 仿真实现从单个组件到可复用子系统5.1 两条路线怎么选Simscape PV Array 还是自建 Matlab FunctionSimulink 里做光伏模型有两条主流路线。第一条是用 Simscape Electrical 里的 PV Array 模块它在 Specialized Power Systems 库的 Renewable Energy 分类下面好处是模型内部已经做好了电气接口可以直接和 Booster 电路、逆变器等功率器件连起来仿真速度快适合做系统级电力电子仿真。第二条是自建模型用 Matlab Function 块把你自己的 I-V 方程封装进去再接到一个可控电流源或电压源上好处是方程完全透明想改哪里改哪里适合写论文或者做算法研究时用。两条路线的取舍很简单如果重点是研究 MPPT 算法和 DC-DC 拓扑直接用 PV Array 模块省时间如果重点是研究组件级特性、失配影响、新型电池建模自建模型更合适因为 Simscape 内置模块的五参数不可直接访问很多中间变量你拿不到。5.2 Simscape PV Array 模块的配置要点用 PV Array 模块时先拖一个到模型里双击打开参数界面。在Advanced下拉框里选择User-defined这样可以直接填 datasheet 参数而不是从预置数据库选型号。需要填的字段包括每块组件的串联电池片数、每个组串的组件数量、并联组串数量以及短路电流、开路电压、最大功率点电压、最大功率点电流等铭牌值。填完参数后模块有两个输入端口Ir 和 Tcell分别接辐照度W/m²和电池温度℃。注意 Tcell 是电池温度而不是环境温度可以用前面提到的 NOCT 公式从环境温度换算。模块输出是一个两元素的向量端口包含电流和电压需要先用 Demux 或 Selector 把它拆成两条信号电流信号接到受控电流源的电流控制端或者直接进 Scope电压信号同理。我第一次用这个模块时踩过一个低级坑Ir 端口喂的是 1以为归一化辐照结果曲线一塌糊涂。后来才反应过来这里要的是绝对辐照度 1000不是 1 也不是 0.8。所以提交仿真前先确认输入信号的量级和单位这个模块的单位很死不会帮你换算。5.3 自建模型封装与 MPPT 联动的坑自建模型的思路是把前一节的 fsolve 脚本改写成 Simulink 里的 Matlab Function 块。函数输入是电压 V、辐照度 G 和电池温度 T输出是电流 I。但这里有个问题fsolve 在普通仿真模式下可以跑但如果要生成 C 代码然后部署到嵌入式控制器或者做硬件在环仿真fsolve 这种数值迭代算法是不支持代码生成的。解决思路有两个。一是提前离线的把 I-V 曲线在给定工况范围内都算好做成二维查找表LUT仿真时直接查表插值。二是用 Lambert W 函数把隐式方程显式化Matlab 里没有内置的 Lambert W 函数但工程数学工具箱里有 wrightOmega或者可以用简单的牛顿迭代在函数块里替代 fsolve。对 LUT 方案要注意辐照度和温度的网格密度我的经验是辐照每 50 W/m² 一个点、温度每 5℃ 一个点就已经能满足绝大多数系统级仿真需求。MPPT 联动是另一个高频场景。把模型输出接到一个 Boost 变换器再在控制回路里写一个扰动观察法PO——每个控制周期对参考电压加一个很小的扰动观察功率变化方向决定下个周期扰动方向保持还是反过来。这里最容易出问题的是代数环如果 I-V 模型直接接到一个纯电阻负载负载电流又回灌到电压计算里会在同一仿真步长内形成闭环Simulink 会报 algebraic loop 错误或者干脆卡死。解决办法是给反馈回路加一个 Unit Delay单位延迟或者 Memory 块代价是控制器响应滞后一个采样周期对 MPPT 这种本身每秒扰动几次的算法来说影响可以接受。6. 分布式模型怎么组织从单组件到多朝向阵列6.1 先分清分布式到底指电站还是指参数分布式模型这个词在光伏语境里有两层意思需要先分清楚。一种是指分布式光伏电站的系统级建模屋顶有南向、西向、东西多朝向的组件气象条件相同但各组件工作点不同逆变器、组串、汇流箱连在一起需要把整个电站拆成若干等效建模单元来做全英文。另一种是指组件内部的分布式参数建模把一块组件按电池片、按旁路二极管分段因为组件面积大时温度分布不均匀、遮挡又是局部的每个子模型的参数都不一样。我在实际项目中两类都会用到。做电站容量和发电量估算时用的是第一种思路分析局部遮挡下的组件功率损失时用的是第二种。两者不冲突可以嵌套一个分布式电站的每个等效单元内部又可以进一步按旁路分段。只是层级越多仿真时间越长所以一开始先想清楚你要回答什么问题再决定建多细。6.2 多辐照组件串联时的失配与旁路建模分布式电站中最典型的失配场景是组串内组件朝向不同或阴影不同导致同一组串里的组件工作在不同辐照下。串联组串有一个物理约束通过每块组件的电流必须相同。于是整串电流被最小的一块限制住。最直接的做法是把所有组件做成相同模型只有辐照度输入不同在 Simulink 里并联多个 PV Array 模块实例并串联连接中间还要给每块组件并联旁路二极管才符合实际。旁路二极管是否导通取决于该组件自身电压是否被外部电路压到负数。一旦组串电流超过该组件的短路电流该组件电压掉到 0 以下旁路二极管导通把这块组件从回路中短路掉组串电压减去这块组件的开路电压。这种非线性切换行为在 Simulink 中用 Simscape 电气模型做是最自然的因为求解器会自动处理二极管状态切换。自建模型要复现旁路需要写 if 条件判断当电流大于该组件当前辐照下的 Isc 时该组件的端电压按旁路路径重新计算。用一个快速计算来感受失配的严重程度一块组件在 1000 W/m² 下最大功率约 400WVmp 约 37.8VImp 约 10.6A。另一块组件在 600 W/m² 下 Isc 大约 6.7A。两块串联时若没有旁路整串电流被压到 6.7A第一块组件被迫偏离最大功率点整串输出功率远低于两块组件单独输出之和。有旁路时第二块被短路组串电压掉到只剩第一块的电压但电流可以回到 10.6A 以上总功率反而更高。这就是为什么旁路二极管设计如此关键也是分布式模型要精确模拟旁路行为的原因。6.3 用蒙特卡洛式仿真实测不同布局的失配损失在没有条件做现场实测时我推荐用蒙特卡洛的方式在 Simulink 或 Matlab 脚本里做失配损失评估。思路是这样的把屋顶按朝向划分成若干个区域每个区域的辐照度设定为一个随机量均值由朝向和当地气象数据决定标准差代表云层遮挡的不确定性。然后生成几百组随机工况每组工况下用分布式模型算出组串总发电量再和假设所有组件完全一致即辐照度全取均值的基准发电量对比统计失配损失百分比。这种做法比只算一个典型工况要可靠得多因为遮挡和云层变化是随机的单点评估很可能恰好碰上乐观或悲观情况。统计分析之后你会看到两个很有价值的数据一是失配损失的中位数二是损失的分布范围。中位数高说明布局本身有问题比如东西朝向组件混串分布范围特别大说明系统对天气随机性特别敏感可能需要调整组串划分方式。7. 常见问题与排错实录这些坑我替你踩过了7.1 fsolve 不收敛与步长敏感问题fsolve 不收敛是建模阶段最高频的坑几乎每个学生第一次跑都会遇到。现象很典型从某个电压点开始迭代突然发散电流变成负值或者几十倍的异常值。原因通常是初值离真实解太远或者电压扫描步长太粗导致相邻点的电流变化太剧烈。解决办法有三个层次。最直接的是用递推初值就是第 4.2 节代码里那样让每个点的初值等于上一个点的解这基本能解决 80% 的问题。第二招是缩小电压扫描步长特别是在膝盖附近的区域电流变化最快步长加密能让递推过程更平滑。第三招是给 fsolve 加上边界约束用 lsqnonlin 代替 fsolve把电流限定在 0 到 Isc×1.2 之间这样即使迭代走偏也不会得到物理上无意义的负电流。最后一个办法在参数辨识时尤其管用。7.2 Simulink 代数环与仿真发散自建光伏模型接入电路时代数环是最容易碰到的问题。表现是仿真报错Algebraic state in loop solving或者仿真步长无限缩小导致跑不动。根本原因是模型输出电流和电路电压相互依赖形成步长内的循环Simulink 的变步长求解器需要在每个步长内迭代求解代数约束一旦迭代不收敛仿真就卡住。我的处理顺序是先看反馈回路能不能加单位延迟。大多数 MPPT 控制回路加一个采样周期的延迟完全不影响算法性能因为控制频率本来就在 1kHz 到 10kHz 之间。如果加延迟会影响精度就改用 Simscape 的物理建模方式Simscape 求解器对电气网络有专门的建模方法不容易产生代数环。实在不行还可以把模型改成显式的查找表从源头上消掉隐式方程代数环问题自然消失。7.3 PV Array 模块参数填写与单位换算Simscape PV Array 模块的报错信息有时候很绕但大部分问题出在三处。一是组件串联电池片数填错半片组件按整片数填会直接导致 Vt 算错曲线整体偏移。二是温度和辐照的单位不对Ir 必须是绝对的 W/m²不能是标幺值Tcell 单位是摄氏度模块内部会自动换算开尔文。三是组串数和并联组串数填成倒置导致总电压和总电流的数量级完全不对。填完参数后做一个快速的合理性检查把辐照设成 1000 W/m²、温度设成 25℃跑一个稳态点看模块输出的 Vmp 和 Imp 是否接近 datasheet 铭牌值。如果偏差超过 2%大概率是参数填错了而不是模型的锅。这个检查我在每个新工程里都会做十几秒钟的时间能省掉后面一整天的怀疑人生。再补一个容易被忽略的点PV Array 模块输出的电压是模块内所有组串串联值的总和电流是单个组串电流乘并联组串数。如果你想观察单块组件的特性记得把组串数设成 1否则拿到的是整个阵列的合成曲线单组件曲线形状完全被掩盖了。批量仿真时这个问题特别容易漏一不留神就以阵列级结果去验证组件级模型怎么都对不上。
返回列表