
我最近花了两周时间完整复现了一篇IEEE二区期刊上关于构网型逆变器Grid-Forming InverterGFMI小信号建模与稳定性分析的文章。整个项目用MATLAB纯M文件脚本实现核心方法是状态空间法加特征值分析没有用Simulink做任何仿真验证。这篇文章我会把这套建模思路、代码组织方式、参数处理细节和踩过的坑全部写出来给同样在复现电力电子小信号模型的朋友做一个可以直接参考的路线图。先说清楚这个项目解决的是什么问题构网型逆变器接入微网或弱电网时因为缺少大电网的电压和频率支撑系统稳定性完全靠自身控制器的动态特性来维持。下垂控制、电压电流双环、功率滤波器、LC滤波器这些环节相互耦合直接分析非常困难。状态空间法把整个系统统一写成dx/dt Ax Bu的形式再用特征值分析观察A矩阵特征根在复平面上的分布就能准确判断每个模态的稳定性、阻尼比和振荡频率进而定位不稳定来源是功率环还是电流环。适合人群是电力电子方向的研究生、做微电网控制的工程师以及需要把文献方法落地成代码的科研人员。1. 项目整体认知这篇文献到底在做什么1.1 构网型逆变器为什么成为研究热点构网型逆变器和传统的跟网型逆变器Grid-Following Inverter本质区别在于外部特性。跟网型逆变器把自己当成电流源需要锁相环跟踪电网相位跟着电网走构网型逆变器把自己当成电压源直接输出幅值和频率都受控的电压反过来给电网提供支撑。正是这种“自己建电压”的能力让GFMI成为高比例可再生能源场景下的关键装备。但是电压源这个角色不好当。跟网型逆变器有电网电压撑着控制器参数稍微调一调问题不大构网型逆变器在没有强电网支撑的场合控制器和滤波器之间的动态耦合会直接决定系统能不能稳定运行。这里说的稳定不是静态工作点的稳定而是扰动之后能不能回到平衡点的问题。要回答这个问题小信号模型是必然选择。1.2 状态空间法与小信号模型的组合逻辑小信号建模的思路其实不复杂先把系统中所有非线性环节功率计算、三角函数、PWM调制在稳态工作点附近做泰勒展开保留一阶项忽略高阶项得到一组线性常微分方程。这组方程用矩阵形式写出来就是状态空间模型也就是dx/dt Ax Buy Cx Du的标准形式。状态空间法的优势在这一步就体现出来了。A矩阵包含了系统所有固定参数的动态信息它的特征值直接对应系统的自然振荡模态。如果把特征值全部落在复平面的左半平面系统在平衡点附近就是渐进稳定的只要有任何一个特征值实部为正就说明系统存在发散趋势。更进一步通过特征值对应的特征向量和参与因子可以分辨出每个动态模态主要由哪个状态变量或哪段控制回路主导。1.3 为什么选择纯M文件而非Simulink很多人问我用Simulink搭非线性模型再线性化不是更快吗确实Simulink的Linear Analysis工具箱可以自动完成平衡点求解和线性化省去手推状态方程的巨大工作量。但纯M文件方式在这类文献复现场景中有几个不可替代的优势。第一批量参数扫描效率高。稳定性分析最核心的工作是看参数变化对特征值轨迹的影响比如下垂系数从0.01调到0.5Simulink每次线性化都需要预处理模型一个参数要跑几十个点就很慢。而状态空间模型一旦搭好扫参就变成简单的循环计算几千组参数几秒钟就能出结果。第二可追溯性强。M文件的每一行都能对应到文献里的某个公式查错方便审稿人问起来也能说清楚模型细节。第三不依赖Simulink的许可证和Toolbox一台装了基础版MATLAB的机器就能复现全部结果。2. 理论基础从物理系统到状态空间方程2.1 GFMI典型拓扑与控制层级拆解我复现的文献用的是最经典的三相两电平逆变器拓扑直流侧视为理想电压源交流侧接LC滤波器和线路阻抗负载是恒阻抗负载或弱电网。控制部分采用层级结构从外到内依次是功率环、电压环、电流环。功率环实现下垂特性有功功率偏差决定角频率偏移无功功率偏差决定电压幅值偏移。功率测量值通常要经过一阶低通滤波器滤除二倍频分量这个低通滤波器和下垂积分关系共同构成了功率环的动态。电压环和电流环都是dq旋转坐标系下的PI控制器电压外环输出电流参考值电流内环输出调制电压最终经过PWM调制生成桥臂电压。这个结构非常典型复现的时候只要抓住状态变量建模就顺了。2.2 小信号线性化的数学过程线性化过程可以拆成三步。第一步是列写完整的状态方程和代数方程包括滤波器的连续时间方程、控制器的微分方程、功率计算和下垂关系。第二步是求稳态工作点即令所有状态变量的导数为零然后解代数方程组。第三步是在工作点处对每个非线性项求偏导数。这里有个实操中非常重要的细节三角函数和乘积项怎么处理。比如逆变器输出电压与电容电压的关系在dq坐标系下含有正弦余弦项功率计算含有vdiq交叉项。处理方法是全部展开成两变量的乘积然后在工作点处做偏微分。比如f vdid vqiq在工作点(vd0, id0, vq0, iq0)处线性化得到Δf vd0Δid id0Δvd vq0Δiq iq0*Δvq。这一式子非常直观但展开的时候漏项是最常见的错误来源。2.3 状态变量的选取与状态矩阵构建状态变量选取是整个建模过程最关键也最容易出错的一步。我复现的系统中状态变量一共取了12个功率低通滤波器引入的有功和无功功率测量值2个下垂控制引入的相角偏差和频率偏差2个电压环PI控制器的积分状态2个电流环PI控制器的积分状态2个LC滤波器的电容电压dq分量2个电感电流dq分量2个。这12个状态变量构成的A矩阵维度就是12×12。状态变量选取的核心原则是完备性即每一个有积分作用的环节都必须对应一个状态变量。反过来纯比例环节、代数约束不要强行设成状态。比如dq变换本身不含积分特性就不需要单独设状态PWM调制如果近似成单位增益和一阶惯性环节就会引入一个状态变量我复现的文献采用了惯性环节近似所以调制延迟也占了一个动态。3. 特征值分析的原理与应用3.1 特征值、阻尼比和振荡频率的物理意义特征值分析的结果不能只看稳定不稳定还要看动态品质。对A矩阵求特征值得到的是共轭复根和一个实根的组合。共轭复根对应振荡模态写成λ σ jω的形式以后阻尼比ζ -σ / sqrt(σ² ω²)无阻尼自然振荡频率ωn sqrt(σ² ω²)。在实际调试中我会把特征值按频率区间分类功率环对应的模态一般频率很低在几赫兹到十几赫兹的量级电压环模态在几十到几百赫兹电流环和LC滤波器谐振模态在几百赫兹以上。阻尼比大小反映这个模态衰减的快慢工程上通常希望低频模态阻尼比在0.3以上低于0.1就属于弱阻尼即使系统理论上稳定动态响应也会有长时间的振荡。3.2 参与因子与模态辨识特征值只能告诉系统有哪些模态但没法直接说某个模态受哪个状态影响更大。这时候就要用参与因子Participation Factor。参与因子的计算方式是先求A矩阵的右特征向量矩阵V和左特征向量矩阵W第k个模态对应状态变量i的参与因子为p_ki V(k,i) * W(i,k)通常取模值并归一化。参与因子大的状态变量就是这个模态的主要参与环节。在我的复现结果里一对低频共轭特征值对应的最大参与因子来自功率低通滤波器状态和下垂积分状态这验证了低频振荡主要是功率环动态。而高频模态的参与因子集中在电感电流和电容电压状态说明它属于LC谐振模态。通过参与因子定位了主导状态之后针对性调参就变得非常高效。3.3 灵敏度分析与参数扫描文献里除了孤立的特征值结果还大量使用特征值轨迹随参数变化的内容也就是参数根轨迹图。特征值对参数的灵敏度就是特征值轨迹的斜率实际计算时可以用数值差分求取给参数加一个小扰动重新计算特征值然后作差除以扰动值。这样做的好处是定位让系统失去稳定的关键参数阈值也能在调参的时候知道该往哪个方向转动参数。参数扫描的实现过程很简单把参数值放在一个数组里循环每次重构A矩阵再求eig(A)即可。关键是要看清楚每个特征值在参数变化过程中如何移动特别是哪个分支最先跨越虚轴。我在复现中做了下垂系数和无功电压下垂系数的双参数扫描最终画出了系统稳定域边界曲线。4. MATLAB建模完整实操4.1 脚本总体架构与模块划分整个项目我拆成了五个M文件来组织这样每段功能都可以单独测试。main.m主脚本负责定义参数、调用建模函数、执行特征值分析和画图gfmi_ss.m核心建模函数输入稳态工作点和控制参数输出A矩阵及其他状态空间矩阵get_operating_point.m求解稳态工作点的函数participation_factor.m计算参与因子的函数plot_eigenvalues.m特征值图、参与因子图、根轨迹图绘制脚本这种模块化写法的优点是换一组参数时候只需要在主脚本里修改参数定义建模函数完全不用动。另外单步调试也很方便建模函数输出A矩阵后可以在命令行直接检查矩阵性质。4.2 平衡点求取稳态工作点计算的坑求稳态工作点这个环节我一开始直接用额定功率和额定电压去计算结果特征值分析出现虚假不稳定。原因很简单逆变器输出功率不等于负载吸收功率线路阻抗上还有电压降落必须通过潮流方程或者等效电路关系联立求解。合理的做法是把系统在dq同步旋转坐标系下展开令功率环输出角频率等于额定角频率输出电压相位作为参考然后按功率平衡关系迭代求解。具体来说给定有功功率参考值P0和无功功率参考值Q0由下垂关系算出角频率和电压幅值再结合线路阻抗求解输出电流。最终在工作点处电感电流和电容电压对应的稳态值要满足所有导数为零的条件。我分享一个实用的验证手段把求解出来的工作点代回非线性方程检验方程残差是否足够小。如果残差在1e-6量级说明工作点求对了如果数量级停留在1e-1那肯定有方程没列全。4.3 状态矩阵A的组装技巧A矩阵组装前需要把每个环节的线性化方程以小矩阵的形式先写出来。这里我通常借助符号计算帮助推导再用matlabFunction转换成数值函数。核心思路是每个环节线性化后都是特定状态变量的线性组合。比如电感电流的微分方程L * dΔi_d/dt Δv_id - Δv_d ω0 * L * Δi_q i_q0 * Δω这个方程中的线性化项包括状态变量Δi_d、Δv_id其实是控制器输出也是状态变量或控制器输出的线性组合、Δi_q、Δω。把这些系数填到A矩阵的对应行列即可。一个实操技巧是列一张“状态变量索引表”把12个状态变量的顺序固定下来状态1到2是功率滤波器状态3是频率偏差状态4是相角偏差状态5到6是电压环积分状态状态7到8是电流环积分状态状态9到10是电容电压dq状态11到12是电感电流dq。有了这张表组装A矩阵的时候就不容易发生行列错位。4.4 特征值求解与图形化输出特征值求解一行代码就够了lambda eig(A)。但为了让结果可读我会把特征值按实部大小排序再计算每组共轭复根的频率和阻尼比输出成表格。图形上最常用的是复平面特征值分布图横轴是实部纵轴是虚部。我还要画等阻尼比线和等频率线做参考阻尼比是根轨迹上一段圆弧等频率线是水平线。这样图上每个特征值点可以直接读出工况信息。画等阻尼比线的原理很简单ζ cos(θ)θ是特征值向量与负实轴的夹角所以等阻尼比就是一条从原点出发的射线。复现过程中文献里往往会给出参数A对应的特征值分布和参数B对应的特征值分布对比。我在画图时把两组特征值放在同一张图里用不同颜色标记稳定边界一目了然。所有绘图用基础的plot函数完成不需要额外工具箱。4.5 参数扫描与稳定性边界绘制参数扫描的写法如下for k 1:length(param_range) params.param_name param_range(k); [A, ~] gfmi_ss(params, operating_point); lambda eig(A); % 记录最大实部或所有特征值 max_real(k) max(real(lambda)); end然后plot(param_range, max_real)就可以看到系统从稳定到失稳的临界点也就是最大实部从负变正的参数值。如果想画双参数稳定域就用两层循环每个参数组合都判断最大特征值实部是否小于零最后用contour或imagesc画出稳定区域。这个过程中计算量其实不大因为有解析的A矩阵表达式每次构建和求解特征值耗时在毫秒量级。我扫过20×20共400个参数组合总时间不到10秒。这是纯M文件建模对比Simulink方法最明显的优势。4.6 关键结果解读如何判断系统稳定拿到特征值结果第一步看所有实部是否都是负数。第二步找最小阻尼比模态因为即使系统稳定最小阻尼比决定了动态响应最差的那个振荡模式。第三步用参与因子看最小阻尼比模态由哪个状态主导确定应该调哪段控制回路。我在复现文献时发现随着下垂系数增大功率环主导的低频模态实部会从负值向正值方向移动说明过大下垂系数会削弱系统稳定性。而电流环比例系数增大时高频LC模态的阻尼先增加后减小存在一个最优值。这些结论都是用特征值轨迹和参与因子分析得出来的完全复现了文献的核心结果。5. 常见问题与排查实录5.1 状态变量遗漏导致特征值异常第一次搭建模型时我遇到特征值数量不够的问题。理论上有12个状态变量就应该有12个特征值但求解出来只有10个。排查后发现问题出在调制器惯性环节我一开始把PWM调制当成单位增益没有为它单独设状态变量导致漏掉了两个调制惯性状态。这提醒我任何有储能或者等效惯性的环节哪怕看起来像纯延迟都应该在状态变量里体现。判断状态变量是否完备的方法很简单检查系统中是否有独立储能元件和独立积分环节。LC滤波器提供4个储能状态两个PI控制器提供4个积分状态功率低通滤波器提供2个一阶惯性状态调制惯性提供2个一阶惯性状态下垂控制本身的频率-相角关系提供1个积分状态合计13个但我后来把频率偏差与相角偏差合并考虑实际形式中用相角作为状态频率由下垂方程直接关联最终保留了12个有效状态。不同文献对状态变量取法略有差异但储能和积分器数量对得上就不会错。5.2 稳态工作点不收敛求解稳态工作点的时候一开始用了fsolve求解但经常报错或者收敛到无意义的解。原因是方程组里开关量太多初值给得不好就跑到别的根上去了。我的解决办法是先用一个简化的潮流计算获得一个较好的初值再交给fsolve精调。简化潮流计算的方法假设线路阻抗主要是感性忽略电阻先根据功率参考值求电压降落和功角得到近似工作点。这个初值已经很接近真实解fsolve只需要一两步迭代就能收敛。如果用力学里的话来说就是先用手推到一个差不多的位置再让机器精确落位。5.3 单位制混乱导致量纲错误另一个大坑是单位制不统一。控制器PI参数、下垂系数用标幺值还是国际单位直接决定了数值差异混用的话特征值计算结果会表现得很离谱。我建议所有建模过程统一采用标幺值基准取逆变器额定容量和额定电压。在标幺值体系下电压、电流、功率都归一化状态矩阵的数值尺度不会相差太大特征值计算和参与因子分析在数值上也更稳定。如果文献给出的是国际单位制下的参数转换时需要特别注意角频率基值。频域控制器的积分时间常数在标幺值下要乘上额定角频率这个换算关系漏掉的话控制器响应会差100多倍特征值分布直接错乱。5.4 特征值与文献结果对不上怎么办复现文献时最崩溃的就是特征值对不上。我的经验是按步骤排查先看参数是否完全一致尤其是控制器带宽、滤波器参数和线路阻抗是否用同一个单位制再看工作点是否一致输出有功无功不同导致工作点不同A矩阵也不同特征值自然对不上最后看线性化过程有没有丢项特别是功率计算和电压方程里的交叉项。还有一个经常被忽略的原因dq旋转坐标系的角度参考点不同。如果文献以逆变器输出电压相位为参考而我的模型以无穷大母线电压为参考同一个系统会得到不同的A矩阵特征值理论上是相同的但如果化简不到位数值精度就会有偏差。我复现时统一以无穷大母线电压相位作为参考所有电压电流的角度都按这个参考定义。6. 复现过程中的个人感悟与后续扩展建议6.1 复现文献的通用技巧这次复现最深的体会是读文献和改代码是两码事。文献里的公式推导可以省略很多中间过程但代码实现一步都不能省。我的习惯是先把公式按编号列出建立“公式-状态方程-A矩阵行列”的映射表然后一个公式一个公式落地。这样遇到结果对不上的时候能快速定位到具体公式和具体矩阵元素排查效率高很多。另外强烈建议在建模早期就把代码版本管理起来不需要特别复杂的工具git就够了。每次改动参数、改动方程都留下记录因为复现过程中会频繁尝试不同方案没有版本管理很容易改坏以后回退不回去。6.2 后续可以往哪些方向扩展这套状态空间模型的代码框架本身是通用的替换控制器结构或者增加自由度都比较方便。比如把下垂控制换成虚拟同步机控制只需要把功率环的状态方程换成VSG的转子运动方程和励磁方程增加虚拟惯量和阻尼系数两个参数即可。把负载类型从恒阻抗负载换成恒功率负载或者整流器负载也只需要修改负载匹配方程以及对A矩阵的对应分块做调整。如果想做更贴近工程的分析还可以在此基础上加入弱电网的线路动态或者变压器饱和特性研究它们对构网型逆变器稳定性的影响。我自己下一步就在把锁相环相关环节加进模型对比含PLL和不含PLL两种GFMI结构的稳定性边界差异。这条研究线做完基本就具备独立做电力电子小信号建模分析的能力了。