ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

线性控制系统数学模型全解析:从微分方程到状态空间的转换与验证

2026/9/28 13:12:46 拓冰建站 浏览量
线性控制系统数学模型全解析:从微分方程到状态空间的转换与验证 做控制系统建模仿真这几年我最大的一个感受是数学模型的“形式”比大多数人想象中重要得多。同一套物理系统你把它写成微分方程、写成传递函数、写成状态空间分析它能做什么、不能做什么时看到的世界完全不一样。我见过不少同学在Simulink里模块搭得飞起却说不清系统阶次从哪来也见过有人用MATLAB做ARX辨识训练集MSE小到1e-4量级一跑compare却惨不忍睹——这些问题的根源往往不在求解器而在最开始选择数学模型的那一步。这次系列到了第四篇主轴是线性控制系统的数学模型。前三篇分别聊过仿真框架、非线性建模的取舍和面向控制的模型简化这篇我们把眼光收回到“线性系统”这个最经典也最容易被轻视的领域怎么把物理问题翻译成规范的数学模型、三种常见数学形式之间怎么换、以及模型建好了怎么验证才不被漂亮的指标骗过去。文章适合正在做课程设计、毕业设计的学生也适合刚入行做伺服系统、过程控制开发的工程师内容偏实操我尽量把推导过程也讲清楚不只是给结论。1. 从一次定位抖动调试说起数学模型的形式决定了你能看到什么1.1 一台电机低速爬行的真实场景先讲一个我亲身踩过的坑。当时我在调试一台直流电机位置伺服系统负载不大但低速定位时姿态非常怪给定一个小角度阶跃电机不会平滑到位而是先慢慢爬一段中间偶尔卡顿一下最后突然冲过去再带一点过冲回来。我反复调速度环的积分增益怎么调都压不住那种间歇性抖动。第一反应是摩擦问题。用微分方程建模视角看系统大致是Jd²θ/dt² K_ti - B*dθ/dt - T_fric其中T_fric是库仑摩擦加静摩擦的混合。摩擦在低速段占比很大速度过零时摩擦力突变系统本质上在“停顿—突破—滑动”之间循环。这个框架能解释现象但它没法告诉我该加多少增益或者怎么补偿相位滞后。1.2 换一种数学形式问题突然变得清楚后来我换了个思路把同一台电机在某个工作点附近线性化写出从电压到位置的传递函数然后画伯德图。这一画问题立刻露馅中频段有个谐振峰相位曲线提前掉了五十多度。这不是摩擦主导而是机械谐振——减速器弹性、联轴器柔度在起作用。在微分方程视角里那条摩擦项把注意力全带走了换成传递函数视角频域信息直接告诉你“这里有个模态相位掉得厉害”。这件事给我的教训非常具体数学模型的形式不是方便写方程的手段而是决定你用哪套分析工具、能看到哪类问题的透镜。线性系统里有微分方程、传递函数、状态空间三种主流框架很多人把它们理解成同一个东西的不同写法实际上它们的适用场景、信息密度和调试直觉差别巨大。后面几节我会逐一拆开讲并且用同一台电机从头到尾演算一遍。2. 微分方程、传递函数、状态空间三种视角的取舍边界2.1 微分方程物理世界最诚实的记录者微分方程是三种模型里最贴近物理过程的。电机绕组里的电压降等于电阻压降加电感压降加反电动势转轴上的转矩等于转动惯量乘角加速度再加粘性摩擦。这一步不需要任何“系统论”概念完全是基尔霍夫定律和牛顿第二定律的直接落地。线性控制系统的数学模型一般写作a_n dⁿy/dtⁿ a_(n-1) dⁿ⁻¹y/dtⁿ⁻¹ ... a_0 y b_m dᵐu/dtᵐ ... b_0 u。判断系统是不是线性核心就两条叠加性——u₁加u₂的响应等于各自响应之和齐次性——输入放大k倍输出也放大k倍。工程里绝大多数物理系统都不严格线性电机的摩擦、饱和、死区都是非线性环节只有在一个平衡点附近做小信号线性化、切掉高阶项之后才得到线性模型。这个近似在控制器设计阶段基本够用因为反馈本身会自动修正小偏差带来的精度损失。微分方程的优点在于物理量纲全程可见检查起来直觉友好。比如Jdω/dt K_ti - B*ω这一项里每一项的单位都是N·m量纲对得上方程基本就没写错。它的缺点同样明显当系统阶数升高、输入输出变多微分方程组会变成一大坨联立方程手工求解很痛苦也很难从方程本身直接读出稳定裕度、响应速度这类工程指标。2.2 传递函数把微分方程变成“代数题”传递函数解决的是微分方程求解和分析的麻烦。在零初始条件下做拉普拉斯变换微分算子sⁿ变成代数符号微分方程变成有理分式G(s) Y(s)/U(s)。因为变成了代数对象系统的串联、并联、反馈连接都变成分式乘除和框图化简用梅森公式就可以算出整个回路的闭环传函。对线性时不变单输入单输出系统传递函数给的直觉极其强大极点在左半平面系统就稳定离虚轴越近动态越慢零点会让特定频段增益衰减或相位变化开环伯德图上的增益交界频率和相位裕度直接告诉你闭环能做多宽的带宽、会不会振荡。前面说的电机爬行问题就是在传递函数框架下通过伯德图发现的谐振相位滞后。代价是它默认零初始条件并且只适用于线性时不变系统。如果系统运行中参数一直变或者输入输出多到五六个单个传递函数会演化成传递函数矩阵分析起来非常不优雅也很难做时域的最优控制设计。2.3 状态空间多变量与时变系统的正确打开方式状态空间把系统数学模型改写成一组一阶微分方程ẋ(t) A x(t) B u(t)y(t) C x(t) D u(t)。x叫状态向量包含能完全描述系统内部行为的最小信息集。对电机来说取x [θ, ω]ᵀ非常自然转动惯量和摩擦系数进了A矩阵反电动势和转矩系数分别进了B和C物理结构一目了然。状态空间的好处有三个。第一统一处理多输入多输出系统每个通道只是多加一列B矩阵分量第二天然适配计算机仿真数值积分器只处理一阶微分方程组这正是Simulink内部实现的核心套路第三为现代控制理论提供了施展空间能控性、能观性、LQR、状态观测器全部建立在A、B、C矩阵的代数性质上。三种形式的取舍边界我用一张表总结方便对照模型形式适用系统分析强项主要限制微分方程任意物理系统物理含义清晰、建模直觉好高阶多变量时求解困难传递函数线性时不变、SISO频域设计、稳定性分析零初始条件、MIMO不直观状态空间LTI、MIMO、时变计算机仿真、现代控制理论新手难以直接获得物理直觉选型原则其实一句话初步建模用微分方程把物理关系写清楚做频域整定、分析稳定裕度用传递函数做仿真和现代控制器设计用状态空间。三者数学上等价但工程流程上分工明确。接下来我用一台直流电机把从微分方程到状态空间的完整路线演算一遍。2.4 顺便说下PMSM同样是这套思路电气领域大量使用的永磁同步电机PMSM也是同一个套路。PMSM原始模型是三相对称绕组方程直接建模非常棘手但经过Clark变换和Park变换到dq旋转坐标系后在稳态工作点附近做线性化就得到dq电流环上的一阶/二阶线性模型转矩表达式T_e 1.5 * p * ψ_f * i_q在q轴电流作控制量时接近线性。这就是为什么论文里PMSM的电流环能直接简化成一阶惯性环节——不是物理上真是线性的而是你在dq坐标系里做了小信号线性化得到了线性控制系统的数学模型。后面频域整定、辨识验证那一整套工具全建立在这句“局部线性”的前提上。3. 把物理系统翻译成微分方程的四步走3.1 建模前的两件事选输入输出与写清假设建模最忌讳上来就列方程。先问两个问题系统的输入是什么输出是什么同样一台直流电机输入选电枢电压、输出选转角和输入选负载转矩、输出选电枢电流模型结构完全不同。我通常先画一个最简单的方框图把能控制的外部量电压、负载和关心的物理量角度、速度、电流标出来再开始动手。接着是写假设。这一步看起来不起眼实际上是整个建模过程的“免责声明”假设电枢电感远小于机械时间常数、假设粘性摩擦系数恒定、假设磁场不饱和。写清楚假设后续模型解释不通时第一反应就是回去查假设是否被打破。我见过太多人把L直接删掉也不做记录等仿真和实测对不上时根本不知道是哪个简化出的问题。3.2 电枢回路与机械运动的联立方程以永磁直流电机为例电枢回路电压平衡方程是u(t) Ri(t) Ldi/dt e(t)其中反电动势e(t) K_eω(t)。机械这边按牛顿第二定律Jdω/dt K_ti(t) - Bω(t) - T_load。这里的K_t是转矩常数单位N·m/AK_e是反电动势常数单位V·s/rad。在SI单位制下K_t和K_e数值相等这是电机内部的物理对称性做模型验证时可以用来互相校核。两个方程联立输入是电压u输出可以选电流i、转速ω或转角θ。系统阶数取决于你保留了多少能量存储环节电感L存储磁能转动惯量J存储机械动能所以完整模型是三阶i、ω、θ三个变量。如果电枢回路的电气时间常数L/R比机械时间常数J/B小一个数量级以上可以令L≈0模型降为二阶这个简化对控制设计影响不大——这是电机建模里最常用的降阶手段。3.3 化简与标准化让微分方程“规范”起来把L≈0代入电枢电流i (u - K_e*ω)/R。把这个i表达式代进机械方程Jdω/dt K_t(u - K_eω)/R - Bω - T_load整理成标准一阶微分方程形式dω/dt K_t/(RJ) * u - (K_tK_e RB)/(RJ) * ω - T_load/J如果取转角θ为输出再补一个运动学方程dθ/dt ω就得到一个二阶线性控制系统d²θ/dt² (K_tK_e RB)/(RJ) * dθ/dt K_t/(RJ) * u - T_load/J注意每个系数的物理含义都很明确ω前面的系数决定转矩转速特性的斜率也就是电机的“速度刚度”RJ/(K_tK_e RB)是机械时间常数的形态告诉你空载加速有多快。标准化之后才能顺畅地做下一节的频域转换。顺带说一句校核量纲是个好习惯d²θ/dt²单位是rad/s²右边K_t/(RJ)乘电压u之后经过单位换算也应该落回rad/s²两边单位不齐多半是某个常数漏乘或括号抄错了。3.4 工程中的小技巧极限行为验证方程列完别急着仿真。我推荐两个成本极低的验证手段。第一是稳态验证令d²θ/dt²0得到稳态转速ω_ss K_tu/(K_tK_e R*B)。这跟常识比对一下——电压升高转速升高负载增大转速下降方向都对数值可以和厂家铭牌上的空载转速对一下量级误差在几十个百分点内说明模型基本正确。第二是零输入响应验证把u0看系统会不会自然衰减稳定。电机断电后靠机械摩擦和反电动势阻尼自然停转这是物理直觉如果仿真响应是发散的说明某个阻尼项的符号写反了。这两步加起来花不了五分钟但能过滤掉至少一半低级错误。接下来进入模型形式转换——这是后续做辨识、频域设计绕不开的环节。4. 传递函数与状态空间的互相转换手算一次胜过背十遍4.1 从微分方程到传递函数拉普拉斯变换的落地有了上面的二阶微分方程在零初始条件下做拉普拉斯变换把二阶项换成s²Θ(s)一阶项换成sΘ(s)输入和负载换成对应的象函数得到s²Θ(s) (K_tK_e RB)/(RJ) * sΘ(s) K_t/(RJ) * U(s) - (1/J) * T_load(s)只考虑电压输入T_load0时传递函数为G(s) Θ(s)/U(s) K_t/(RJ) / [s² (K_tK_e RB)/(RJ) * s]注意分母里有一个s因子来自积分环节所以电机电压—转角传函属于一型系统I型系统低频增益无穷大对恒定的位置指令能做到无静差跟踪。这个性质光看微分方程不太明显写成传递函数后一眼就能读出来。工程里你基本不会真从微分方程手工做拉普拉斯变换去算传函MATLAB里df后一行tf命令就能搞定。但你必须能看懂分母每个系数的来路否则系统辨识工具给出一堆系数时你很难判断哪些有物理意义、哪些纯粹是数值拟合出来的。4.2 从传递函数到状态空间可控标准型的意义反向转换同样重要。假设通过辨识或推导得到一个二阶传函G(s) (b₁s b₀)/(s² a₁s a₀)想把它转成状态空间最常用的规范形式是可控标准型A [0 1; -a₀ -a₁]B [0; 1]C [b₀ b₁]D 0这里传函分母系数[a₀ a₁]落在A矩阵最后一行分子系数[b₀ b₁]落在C矩阵。对上一节的电机传函把分母、分子按s降幂排列的系数抄进去就完成了从“频率视角”到“时域视角”的变换。可控标准型名字里的“可控”暗示了一个事实在这种结构下系统从输入到状态的可达性一目了然单输入单输出系统只要没有零极点对消就是完全可控的。这个性质在做状态反馈设计比如极点配置时特别方便因为你清楚状态全部能由输入激发并观测。4.3 从状态空间反推传递函数sI - A逆的意义反方向从状态空间求传函用的是G(s) C(sI - A)⁻¹B D。以刚才的A、B、C、D为例sI - A [s, -1; a₀, s a₁]它的逆是(sI - A)⁻¹ (1/(s² a₁s a₀)) * [s a₁, 1; -a₀, s]代入B [0; 1]、C [b₀ b₁]并展开G(s) [b₀ b₁] * (1/(s² a₁s a₀)) * [1; s] (b₀ b₁s)/(s² a₁s a₀)正好回到原传函。这一个小演算值得亲手做一遍因为(sI - A)的行列式就是特征多项式特征多项式的根就是系统极点——这一层关系把“时域状态矩阵”和“频域极点”焊在了一起是理解稳定性分析、观测器设计的桥梁。你自己算过一次之后再看到代码里用ss2tf、tf2ss来回切换心里就有底了那不过是矩阵运算的机械重复。4.4 建模工具箱里的隐藏前提MATLAB的System Identification Toolbox里从arx、n4sid到tfest最终给出的模型要么是传递函数、要么是状态空间底层共享同一套数据拟合流程。所以搞清楚这三种形式怎么转换不只是理论洁癖你用arx辨识得到一个黑箱模型后常常需要转成状态空间丢进Simulink和真实系统联调反过来拿到一个状态空间模型要转成传函画伯德图看稳定裕度。这些场景几乎每周都会遇到。下一节专门扒一个大家问得特别多的问题为什么ARX辨识后MSE小得离谱compare却一塌糊涂。5. ARX辨识里的“MSE小但compare差”一个绕不开的经典陷阱5.1 场景重现训练集上漂亮得惊人这个问题的问法我每隔一段时间就会在论坛或技术群看到一次“我用MATLAB对一段输入输出数据做ARX辨识模型阶次选了[2 2 1]训练数据上MSE小到1e-4量级看起来完美但用compare命令一对比仿真输出和实测差了数量级模型到底哪里出了问题”先把典型操作还原一下读入数据、iddata(y, u, Ts)构造数据集、arx(data, [na nb nk])做辨识、compare(data, model)看图。这里最容易被忽视、也是头号根源的地方藏在ARX模型结构和compare的默认行为里。5.2 一步预报误差 vs 仿真误差头号原因ARX模型的数学形式是A(q)y(t) B(q)u(t) e(t)其中e(t)假设为白噪声。辨识算法求解的目标函数本质上是最小化一步预报误差——也就是用过去时刻的真实输出y(t-1)、y(t-2)连同输入一起预测当前时刻的y(t)然后让预测误差最小。问题在于一步预报器每一步都能“偷看”真实输出所以哪怕模型本身很差只要它善于利用最近几个真实y值做修正一步预报误差依然可以小得惊人。而compare命令默认展示的是自由仿真输出simulated response只用输入信号驱动模型从头到尾不反馈真实输出误差会按系统动力学一步步累积。说白了你的模型在“开卷考试”里拿了高分却在“闭卷考试”里原形毕露。这个现象的类比我经常跟朋友讲就好比你预测股票明天的价格可以每天用“昨天实际收盘价 一个小修正”来保证预测很准但这跟你用一条动态模型从头预测未来一整周的曲线完全不是一回事。ARX辨识报告里的MSE属于前者compare检验的是后者。排查这类问题时第一步就是先把compare的调用参数看清楚明确你在比较的是仿真输出还是一步预报输出。% 典型错误对照实验 data iddata(y, u, Ts); m arx(data, [2 2 1]); % 这是“开卷考试”基于真实输出的预测误差 yp1 predict(m, data, 1); compare(data, m, Prediction, 1); % 这是“闭卷考试”只用输入驱动的自由仿真输出 compare(data, m); % 默认就是仿真模式5.3 数据与结构层面的其他坑排除了“偷看”问题后还有几个常见因素要逐一排查。第一是激励信号频带不足。用阶跃或三角波这种能量集中在低频的信号做辨识系统谐振频段的动态根本没被激发模型只能拟合低频增益仿真时高频段自然严重失真。好的辨识激励信号应该覆盖系统感兴趣的整个频带比如PRBS伪随机二进制序列或扫频chirp同时幅值不能太大以免触发非线性段。第二是阶次选择过高。ARX辨识里na、nb越高模型对训练数据的拟合能力越强但也越容易把测量噪声的随机趋势吸收进模型参数形成过拟合。检查方法是做交叉验证把数据切分成训练段和验证段如果训练MSE持续下降而验证MSE开始上升说明你已经越过“真实动态”开始拟合噪声了。第三是数据预处理不够。输入输出信号没去均值、没去趋势项或野值等于给模型加了一个虚假的直流偏置或低频漂移辨识结果里会出现一个根本不存在的慢极点compare时低频偏差非常明显。第四还要提一个模型结构层面的选择ARX把噪声模型和确定性模型共用一个分母多项式A(q)如果实际测量噪声不是这个结构比如是测量噪声而非过程噪声共分母会迫使辨识算法用同一个A(q)去折中拟合动态和噪声导致确定性部分的极点被噪声“带偏”。这时候可以考虑换用OE输出误差模型它把噪声模型单独分离对确定性部分的辨识更干净代价是辨识算法变成非线性优化需要给一个初始估计。5.4 一份可复现的排查清单把上面经验整理成操作清单是我在项目里实际执行过的流程可以直接照跑检查compare调用的选项确认比较的是仿真输出还是预报输出用predict(m, data, 1)和predict(m, data, 10)分别看1步和10步预报误差的变化趋势差距越大说明模型越依赖真实输出来“续命”。数据预处理先detrend去均值剔除野值必要时滤波但小心别把有效动态滤掉。确认激励信号辨识实验采集的数据如果没有PRBS或扫频先补实验不要幻想算法能无中生有。用交叉验证切分数据前70%辨识后30%验证观察验证误差拐点砍掉过高的阶次。换个模型结构arx和oe都试一遍比较compare结果和残差特性。用resid命令检查残差自相关和输入-残差互相关理想情况应接近白噪声。把辨识模型零极点画出来观察是否存在几乎对消的零极点对数值冗余以及极点是否接近单位圆模型可能趋向不稳定边界。这套流程走下来大多数“MSE小但compare差”的问题都能定位。我自己的经验里约一半是第一步的预报/仿真混淆三成是激励频带不足剩下的零星是阶次、预处理和结构选择问题。排查完如果还有疑问下一步就要进入模型验证的深水区了。6. 模型验证的最后一公里除了拟合优度还该看什么6.1 残差必须“白”白噪声检验让人安心的理由拟合优度fit percentage或MSE只是模型验证的第一道门槛它衡量的是“输出误差小不小”但没回答“误差里面还有没有信息”。如果一个模型的残差序列有明显自相关说明系统里还有周期性或滞后性动态没被模型吸收如果残差与输入信号存在互相关说明输入到输出的某条路径没被正确建模。这两类检验在MATLAB里用resid命令就能看理想输出是残差自相关曲线全部落在置信区间内输入-残差互相关同样干净。我常跟人说残差白不白噪好比体检报告上的血常规指标你体重正常拟合优度好只能说明表面状态白细胞异常残差有结构才是疾病前兆。实际项目里我拿过一个拟合优度98%的模型乍看完美但残差自相关在滞后10处有一个明显尖峰顺着这个线索挖下去发现是负载端一个没建模的谐振模态。改完结构后拟合优度只提高了0.5个百分点但那个尖峰消失了模型在样本外测试里的表现天差地别。6.2 极点位置与稳定性频域分析不能省很多做辨识的同学拿到模型就直接丢给控制器设计省略了最廉价的稳定性检查——看极点和零点。线性控制系统的数学模型里极点实部决定模态衰减速度虚部决定振荡频率。一个可靠的辨识模型所有极点都应落在左半平面离散模型在单位圆内而且不应该出现“几乎对消的零极点对”后者往往是数值病态或过拟合的信号。另有一条经验真实物理系统在低频段通常至少有一个积分或近似积分环节比如电机转角对电压就是一型系统如果辨识给出的传递函数低频增益是有限的而你的应用场景又确实存在位置积分行为就要警惕——可能是数据里低频信息不足模型没捕捉住那个积分环节。遇到这种情况与其强行提高阶次不如回到数据采集环节补一次长时间的低频激励实验。6.3 样本外验证换个工况再说话模型验证说到底就是一句话能不能在没参与辨识的数据上表现一致。我习惯把辨识实验设计成多段不同幅值、不同频率点的数据一部分用于辨识另一部分用于验证。如果模型在训练数据上拟合了95%换到另一个幅值水平的验证数据只剩70%大概率是模型把某一段的局部特性比如死区、饱和边缘当成了线性动态过拟合了局部。样本外测试还有一个容易被忽略的维度验证时要分别观察稳态误差和瞬态跟踪。稳态误差反映增益和直流特性是否准确瞬态反映动态极零点是否正确两者是一条曲线里不同频段的信息只看一个容易误判。实际操作里我用阶跃、斜坡、正弦扫频三类信号各做一组测试阶跃看稳态和超调斜坡看稳态跟踪能暴露积分行为是否正确扫频看频响是否和模型伯德图一致。6.4 一个取舍案例拟合度98%的模型最终为何被淘汰最后分享一个真实的取舍过程展示上面这些工具怎么组合使用。当时做一个温度回路辨识候选模型A在训练集上拟合优度98%残差自相关有一两个点轻微越界候选模型B拟合优度只有92%但残差干净极点位置和物理预期完全吻合。如果只看训练拟合度A明显胜出。我把两个模型都放到样本外数据上跑了一遍A的温度预测在换了一个设定值区间后开始周期性振荡B虽然训练拟合度低一点样本外走势却一直贴着实测曲线。再查A的极点发现它多了两个振幅很小的复极点频率正好落在加热器件热惯性时间常数附近——那是把某一段数据里的开关噪声当成动态拟合进去了样本外丢掉那段噪声后这两个极点的振荡特征立刻暴露。最终选了B并用B的模型参数重新整定了前馈增益实测效果比A稳定得多。这件事之后我给自己定了一条规矩拟合优度只能当筛选模型的入场券模型能不能用要看过残差、极点和样本外表现三者全部通过才签收。我自己这几年的体会是线性控制系统的数学模型看着是全流程里最“初级”的章节但实际项目里所有高级手段——状态观测器、模型预测控制、自适应整定——全都站在这一层地基上。踩过不计其数的坑之后我最大的改变是养成了自己的建模清单选变量、写假设、列方程、标准化、转形式、辨识验证每一步都留证据。这些东西写成文字不过几千字真正内化成习惯可能要几个项目周期的来回。希望这篇系列之四能帮你少走几步弯路下一篇我们接着聊非线性系统的模型近似与仿真实现那里更考验直觉也更需要这套线性基础打底。