8种电弧模型MATLAB实现:从Mayr到Cassie的断路器仿真指南
简介8种电弧模型的MATLAB实现包面向电气工程专业学生、研究人员及电力系统工程师用于电弧放电现象的原理验证、特性分析与工况仿真。压缩包共6个文件含2个Simulink模型可分别演示集成与单模型运行2份PDF文献阐述大气电弧模型理论与实验对照1个自定义模块脚本支持扩展非线性电阻等元件另有1份说明文档指导使用流程与环境配置。整体仅293KB轻量易部署。已有1476人浏览学习适合需要快速搭建电弧仿真环境、横向对比不同建模方法的中高级MATLAB用户。通过修改电流、电压、温度等参数可观察不同工况下电弧特性变化并借助文献验证仿真结果为电力开关设备设计、故障诊断等应用提供支撑。1. 从“一句话Mayr模型”到8种电弧模型的matlab实现amb2.zip解决的是什么在断路器分断和故障电弧仿真里电弧模型是最容易让整个仿真翻车的一块。很多人第一步是从文献里抄一个Mayr方程写在Simulink里结果是低压短路工况下直接发散或者过零电压尖峰高到完全没法看。8种电弧模型的matlab实现的模型amb2.zip不是给你堆了8个孤立的公式而是把Cassie、Mayr、Habedank、Schavemaker、Schwarz这类主流的黑盒电弧模型整理成一套可以在MATLAB/Simulink里直接切换和复用的实现。它能解决一个具体问题不同燃弧阶段用不同模型而不是用一个模型硬扛全程。适合做电力系统暂态仿真、低压电器开发或电弧故障检测算法验证的人拿它做模型选型、参数对比和波形校核的起点。2. 8种电弧模型到底在算什么先把黑盒模型的原型和选型讲透电弧不是一个线性的“电阻”建模时通常把它看成一对电极之间随时间变化的电导g(t)。所谓黑盒模型就是不关心弧柱内部的温度分布、流体运动和电磁过程只关心外特性电压、电流、电导之间的关系。这8种模型表面上各有各的公式实际上共享同一个数学套路只是对弧隙热过程的近似程度不同。把这一层看透了后面的参数设置才不会变成玄学。2.1 所有黑盒电弧模型的共同套路电导就是那个状态变量先用一个统一的视角看绝大多数黑盒电弧模型都可以写成dg/dt f(g, u, i)或者d(ln g)/dt f(u, i, P)其中g是电弧电导u是电弧电压i是电弧电流P是散热相关参数。外部电路通过电压源和阻抗决定u、i电弧模型根据当前状态输出一个电导在电路里就表现为一个非线性时变电阻。这样一来8种模型的差异就只剩下两个f的具体形式以及参数代表什么物理量。还有一个容易被忽略的点部分模型包里会混入“静态电弧模型”也就是u与i之间的代数关系比如u C / i^β这类非线性电阻公式。静态模型没有状态变量不描述电导随时间怎么变化适合算故障电流幅值不适合做开断暂态过程。拿到amb2.zip之后第一件事就是把动态模型和静态模型分开别混在一起调参。2.2 大电流选Cassie、过零选Mayr一张对比表定位模型Cassie模型和Mayr模型是整个黑盒电弧模型体系的两个根。Cassie模型写成dg/dt (u² / Uc² - 1) · g / τ物理图像是弧柱截面随电流扩张和收缩电弧电压在大电流阶段近似一个常数Uc。当电弧电压高于Uc时电导上升低于Uc时电导衰减。所以在短路开断的大电流燃弧平台期电弧电压是一条接近方波的波形幅值等于Uc。这就是为什么你想看燃弧电压平台、弧压峰值的时候首选Cassie。Mayr模型写成d(ln g)/dt (u · i / P0 - 1) / τ它假设弧隙的散热功率基本恒定当瞬时功率u·i大于散热功率P0时电导上升反过来电导下降。电流过零附近u·i变得很小电导快速衰减电弧电阻迅速恢复于是产生一个窄而高的过零电压尖峰。这个尖峰是Mayr模型的标志性特征也是绝缘配合仿真里最需要关心的东西。两个模型的边界很清晰先记住这个结论大电流平台区用Cassie过零前后用Mayr。两者不是竞争关系而是各管一段。模型关注阶段典型输出特征关键参数适用场景Cassie燃弧中段、大电流区电弧电压平台接近常数τ、Uc短路电流开断、弧压平台估算Mayr电流过零前后过零电压尖峰、电阻恢复τ、P0介质恢复、过零分析、弧后电流2.3 Habedank、Schavemaker、Schwarz混合模型与改进模型什么时候登场Cassie和Mayr是两个极端假设实际电弧在两个阶段之间是渐变的。Habedank模型把两者串联电弧总电导满足1/g 1/g_cassie 1/g_mayr相当于把弧隙看成两段不同物理特性的电阻串联。这样在一个仿真里大电流段由Cassie段主导过零段由Mayr段主导不需要手动切模型。中压断路器整段开断仿真里Habedank比单独用Cassie或Mayr都稳。Schavemaker模型是Mayr的改进。它把散热功率P不再是常数而是写成与瞬时电压电流比值相关的形式使得计算出的弧后电流更接近实测。做故障电弧检测、保护算法验证的人一般更喜欢它因为弧后电流波形细节对检测算法影响很大。Schwarz模型则把Mayr的τ和P都写成电导g的幂函数τ τ0 · g^αP P0 · g^β电导变化时散热和时间常数跟着变比固定参数更接近气体热应力的真实趋势。电弧炉、低压开关电器这类弧隙状态大幅变化的场景用Schwarz更合理。另外Kizilcay模型在电力系统电磁暂态仿真里也很常见它本质上是Cassie和Mayr方程的重新组合适合放在完整的电网模型里跑而不是单独看弧隙。Hochrainer这类变体则是把时间常数写成电流或电导的函数方向跟Schwarz类似。如果amb2.zip里的8个模型是围绕这些名字做的排列组合拿到之后不要着急挨个跑。先按仿真目标筛掉一半只看开断燃弧平台留Cassie系只看过零和弧后留Mayr系要整段开断过程用Habedank要弧后电流细节用Schavemaker。剩下的一半才是真正需要花时间调参的。3. 用MATLAB把电弧模型跑起来从最小方程到可封装模块选型结束之后才是动手阶段。我的建议是不要一上来就在Simulink里搭完整断路器模型先把单个电弧模型放到一个理想电流源回路里验证确认波形形状对再往系统里放。常见做法是先用MATLAB Function写最小实现再用S函数统一接口最后接进Simulink回路。3.1 最小实现MATLAB Function块直接写Mayr方程先写一个最简单的Mayr模型输入电弧电压和电流输出电导变化率然后在Simulink里用一个积分器对接。function dg mayr_dg(u, i, g, P0, tau0) % Mayr 电弧模型微分方程 % u: 电弧电压 (V) % i: 电弧电流 (A) % g: 当前电导 (S) % P0: 散热功率常数 (W) % tau0: 时间常数常数 (s) power u * i; dg (power / P0 - 1.0) * g / tau0; end这个函数放在Simulink的MATLAB Function块里u和i来自外部电路测量g来自积分器反馈。积分器初值就是电弧的初始电导。注意初值不能给0否则u i / g这一步会直接除零我给默认值时一般从1e-4 S到1e-2 S之间取对应开关触头刚分开时的小弧柱。P0的量级要根据燃弧电流来估起步按几千瓦到几百千瓦给tau0在微秒到毫秒之间试。如果不想开Simulink也可以在脚本里配合ode15s做最小验证function dg mayr_ode(t, g, params) % 配套 ode15s 的 Mayr 模型理想电流源供电 i params.I_mag * sin(2 * pi * params.freq * t); u i / g; % 电弧当成纯电阻u i / g dg (u * i / params.P0 - 1.0) * g / params.tau0; end主脚本里把初值、时间窗、求解器配好运行后直接画g和u i/g就能立刻看到过零尖峰的形状。这一步跑通了再进Simulink。脚本的好处是调参快不用每次打开模型改参数。注意t 0时i 0u i / g 0不会出现除零但如果g的初值给到1e-10这种极端小值u会瞬间变成巨大的数值这就是后面要讲的发散的常见来源。3.2 用S函数统一八个模型的接口方便换模型最小实现验证完之后我建议把模型统一封装成一个S函数通过model_type参数切换8种模型。这样做的好处是Simulink里只需要一个S-Function块换模型时改参数而不是改接线。function [sys, x0, str, ts] arc_sfun(t, x, u, flag, model_type, params) % 电弧模型 S 函数通过 model_type 选择不同模型 % 输入 u: [电弧电压(V); 电弧电流(A)] % 输出: 电弧电导 (S) switch flag case 0 sizes simsizes; sizes.NumContStates 1; sizes.NumDiscStates 0; sizes.NumOutputs 1; sizes.NumInputs 2; sizes.DirFeedthrough 1; % 输出由输入直接算出必须置1 sizes.NumSampleTimes 1; sys simsizes(sizes); x0 params.g0; % 初始电导 str []; ts [0 0]; % 连续状态 case 1 g x(1); ug u(1); ig u(2); switch model_type case cassie sys ((ug / params.Uc)^2 - 1) * g / params.tau; case mayr sys (ug * ig / params.P0 - 1) * g / params.tau; % case habedank 等其余 6 个模型在这里扩展 otherwise error(未知模型类型: %s, model_type); end case 3 sys x(1); % 输出电导 otherwise sys []; end这里有一个特别容易踩的点DirFeedthrough必须设为1。因为当前时刻的电导变化率直接依赖当前时刻的输入uSimulink需要提前知道这一点否则会报代数环错误或者输出结果一直不对。把8个模型都往switch的case里填参数从params结构体取整个模块就变成了一台“电弧模型切换器”。用S函数而不是8个独立模型文件的另一个好处是参数统一。每种模型都有自己的物理参数但结构体里的g0、tau、P0这些字段保持一致切换模型后只需要改少量参数就能跑便于对比。3.3 Simulink接线与三个关键参数初值、求解器、时间窗Simulink里面最常用的接法是把电弧当作受控电压源。具体步骤是这样搭一个单相测试回路交流电压源串联线路阻抗再接一个受控电压源表示电弧。在电弧两端接电压测量模块回路里串电流测量模块两路信号合成一个2维向量送进S-Function块。S函数输出电导g用Gain模块取倒数得到电弧电阻R_arc。把电流测量值乘以R_arc得到电弧电压参考值送给受控电压源。这就完成了“电流→电阻→电压”的反馈闭环。这里最容易触发代数环。解决办法是在反馈回路里加一个Memory块截断瞬时直通或者在受控电压源前加一个一阶惯性环节时间常数给1e-7级对结果影响极小但能把环打断。参数方面三个关键参数必须先定下来否则后面全是无效劳动参数建议初值范围说明初始电导 g01e-4 ~ 1e-2 S不能为0越小代表弧隙刚开始越不导电时间常数 tauCassie0.1 ~ 1 msMayr0.5 ~ 50 μs决定电导变化的快慢过零尖峰宽度主要看它散热功率 P0燃弧电流 × 弧压平台值再缩小到它的0.5 ~ 0.8倍Mayr系模型的“热平衡”基准点求解器设置上别用ode45硬扛。电弧模型是典型的刚性方程尤其过零附近电导变化跨好几个数量级ode45会把步长缩到1e-9仿真慢到没法看。我一般直接上ode15sMax Step限制在2e-5秒左右既能抓住过零尖峰又能保证速度。时间窗也不用一上来就跑完整分断过程先跑一个20ms工频周波确认波形形状没问题再逐步延长。4. 电弧模型仿真的“翻车”记录5个最容易踩的坑以下问题都是实际调模型过程中反复出现的按出现频率排。每一条我都给出现象、原因和解决办法。4.1 仿真直接发散数值刚性与求解器没配对现象Simulink报错说无法推进到某个时间点或者波形在几十微秒内飞到1e10级别积分器输出完全溢出。原因电弧状态方程在过零附近刚性强电导变化率出现数量级跳变。默认的ode45是显式求解器遇到这种问题会不断缩步长直到卡死或发散。这不是模型写错是求解器没配对。解决换成ode15s或ode23t并把Max Step设到1e-5到1e-4秒之间。如果还发散就把积分器输出加一个下限保护比如用Saturation块把g限制在1e-7到1e2之间防止除零和负电导。这么做不会改变正常燃弧段的波形但能挡住数值异常。4.2 电流过零后电压尖峰离谱参数没有按电流等级换算现象Mayr模型的过零电压尖峰算出来几千伏甚至上万伏远超断路器或绝缘配合的承受范围波形看起来完全脱离物理。原因过零时电导快速下降u i / g这一关系下只要g掉到1e-6 S量级即使电流只有几安培电压也会被放大到兆伏级别。本质上是P0和tau设置没有和实际燃弧电流等级匹配。小电流等级的开关用了几百千瓦的P0电导衰减太慢波形平大电流等级用了太小的P0电导骤降尖峰爆表。解决先用示波器或实验数据得到一个工频周波内u·i的平均值把P0设到该平均值的附近再调tau把尖峰宽度压到几十微秒到几百微秒量级。尖峰太高就增大P0和tau尖峰太矮、几乎看不到介质恢复迹象就减小这两个参数。别按论文里的数值直接抄低压和中压的P0可以差三个数量级。4.3 八种模型对比结果几乎一样参考条件没有统一现象花时间把8个模型全跑了一遍发现波形基本重合对比图白做了。原因不是模型没差异而是参数没有按模型各自的物理意义换算。所有模型都用同一个g0、同一个tau、同一个P0相当于让8个近似取向各异的模型强行输出了同样尺度的曲线自然看不出区别。另一个常见原因是都喂了同一条理想电流源波形电弧电压被电流源强制钳位根本没有让模型“自己决定”电导变化。解决统一燃弧电流等级、统一弧长、统一初始电导但每个模型的参数必须按适用范围单独设置。对比时只看特征量比如燃弧电压平台高度、过零尖峰幅值、尖峰宽度、弧后电流衰减时间。理想电流源只能做单模型验证做模型对比要换成电压源加限流阻抗的回路让电弧电压形成真实反馈。4.4 封装成库后外部参数改不动Mask与工作区变量作用域冲突现象把调好的模型封装成子系统并做了Mask双击可以改参数但改完重新仿真波形没有任何变化仿佛改了个寂寞。原因Mask里定义的变量名和当前MATLAB基础工作区里的变量名重名了。Simulink在解析Mask参数时优先使用了工作区同名变量导致界面输入的值被覆盖。解决把所有Mask参数名加上前缀比如arc_g0、arc_tau、arc_P0避免和工作区变量冲突。同时在Mask编辑器的初始化代码里显式声明参数引用用逗号分隔把参数传递进子系统而不是让Simulink自动到工作区找。如果问题还在就把基础工作区里那些同名变量清掉再试这是最直接的定位手段。4.5 电弧能量积分总是偏高时间窗和步长偷走了过零细节现象用u × i积分算燃弧能量仿真结果比实测值高20%甚至更多怎么调参数都压不下来。原因过零附近的电压尖峰时间很短但幅值很高。积分步长不够密时求解器会把尖峰附近的值当成平台来积造成能量虚高。另外Simulink对连续积分结果做输出时如果采样率设置过大输出波形上的尖峰细节直接消失但从积分器数值上看能量已经被多算了。解决给积分器加输出采样时间设置到1e-6秒级别保证尖峰细节进入输出。第二给瞬时功率加一个幅值限幅比如超过正常弧压峰值5倍的瞬时功率直接截断防止数值尖峰污染能量积分。第三对比能量时固定起始点从电弧电压建立后开始积分到电流首次过零结束而不是整个仿真时间窗全积进去。这样算出来的燃弧能量才有横向可比性。5. 让模型可信的最后一公里校准、验证与复用模型跑通只是第一步能让别人信服才是真功夫。验证时先看波形形状再看数值。Cassie模型在大电流平台期电弧电压应接近常数Uc电压波形顶部是平的Mayr模型在过零附近必须出现一个窄的电压尖峰宽度跟tau直接相关。这两条是黑盒电弧模型的地基特征对不上就说明参数或接线有问题不用急着往下分析。参数校准我习惯先粗扫再精调。用MATLAB对整个参数空间做一次扫描目标量可以选燃弧能量或过零尖峰幅值% 对 Mayr 模型的 P0 做粗扫描找能量最接近实测的区间 P0_list logspace(2, 5, 20); energy_min inf; for k 1:length(P0_list) params.P0 P0_list(k); [t, g] ode15s((t, g) mayr_ode(t, g, params), tspan, g0); u_arc params.I_mag * sin(2 * pi * params.freq * t) ./ g; i_arc params.I_mag * sin(2 * pi * params.freq * t); E_coarse(k) trapz(t, u_arc .* i_arc); endtrapz对非均匀时间步长有误差但粗扫阶段够用。扫描结束后把E_coarse和实测能量最接近的P0区间缩小再换ode15s精算。这里一个长期经验先用Cassie把燃弧平台电压Uc校准到与实测弧压一致再用Mayr校准过零尖峰和弧后电流最后用Habedank或Schavemaker复验整段波形。每一步只动一个参数不要同时改P0和tau否则永远定位不到问题。复用方面把调好的参数放回到S函数的params结构体里整个模块存成自定义库后续新项目直接从库里拖。库里的模型要保持model_type接口不变遇到新工况就复制一套参数进去不复制模型本身。我最早用Cassie去算过零后的恢复电压尖峰怎么都压不住后来才意识到根本不是参数问题是拿错了模型。从此养成了一个习惯任何电弧模型的计算结果先看波形形状再看数值形状不对数值都是白搭。希望帮到你。本文还有配套的精品资源点击获取