第3章 连续系统建模:积分模块、微分模块、传递函数模块、状态空间模块、连续系统仿真设置
连续系统建模,说白了就是描述那些随时间连续变化的物理过程。比如电机转速、弹簧振动、水温变化——这些都不是跳变的,而是平滑过渡的。Simulink里处理这类问题,靠的就是几个核心模块。我刚开始学的时候,总觉得这些模块长得差不多,用起来却总出岔子。今天咱们就把它们掰开揉碎了讲清楚。
3.1 积分模块:连续系统的“记忆体”
积分模块是连续系统里最基础、也最容易被低估的模块。它的数学本质很简单:y(t) = ∫ x(t) dt。但实际用起来,坑不少。
核心要点:积分模块保存了系统的“状态”。没有积分器,就没有动态系统。
我在项目中遇到过一个问题:一个简单的PID控制器,仿真结果总是不对。查了半天,发现是积分器的初始条件设成了0,而实际系统启动时已经有初速度了。嗯,这里要注意——积分模块的初始条件参数,一定要根据物理实际来设置。
积分模块的参数设置,我习惯这样配:
| 参数 | 说明 | 我的建议 |
|---|---|---|
| Initial condition | 初始状态值 | 从物理模型或实测数据获取 |
| External reset | 外部复位方式 | 一般选none,除非需要重置 |
| Limit output | 输出限幅 | 建议勾选,防止积分饱和 |
| Show saturation port | 显示饱和标志 | 调试时打开,方便观察 |
小技巧:积分模块的“Limit output”一定要勾上。我曾经在一个位置环控制里忘了设限幅,结果积分器一路飘到1e6,仿真直接崩了。你想想看,物理系统哪有无限积分的道理?
3.2 微分模块:用的时候要小心
微分模块 y(t) = dx/dt,理论上很完美,实际用起来却是个“噪声放大器”。
为什么会这样?因为真实信号总有噪声。微分操作对高频噪声特别敏感——信号稍微抖一下,导数就剧烈跳变。我在做振动分析时吃过这个亏:直接用微分模块处理加速度信号,结果出来的速度曲线全是毛刺,根本没法用。
所以我的建议是:
- 能不用就不用。很多场景可以用积分反推,或者用传递函数近似
- 必须用时加滤波。比如用
s/(T*s+1)这种近似微分器 - 仿真步长要小。微分精度依赖小步长,步长大了误差惊人
警告:千万不要在纯微分模块后面直接接饱和或非线性模块。我曾经这么干过,结果仿真结果完全失真,查了两天才发现是微分后的高频分量被非线性环节“整流”了。
3.3 传递函数模块:经典控制理论的桥梁
传递函数模块 Transfer Fcn 是频域设计的核心。你只要给出分子分母系数,Simulink自动帮你搭好内部结构。
举个例子,一个二阶低通滤波器:
分子: [1]
分母: [1, 2*ζ*ω, ω^2]
比如阻尼比0.7,自然频率10 rad/s:
分子: [1]
分母: [1, 14, 100]
我在实际项目中习惯这样配:
- 分子分母长度要匹配。分子阶次不能高于分母,否则物理不可实现
- 系数用变量名,别写死。比如
[1]写成num,方便调参 - 用
tf()函数先在MATLAB里验证,再复制到模块里
经验之谈:传递函数模块的“分母”系数顺序是从高次到低次。我刚开始总搞反,把 [1, 14, 100] 写成 [100, 14, 1],结果系统完全不对。你记住:最高次项系数在最前面。
3.4 状态空间模块:现代控制理论的利器
状态空间模块 State-Space 用矩阵描述系统:
dx/dt = A*x + B*u
y = C*x + D*u
这个模块的好处是:
- 适合多输入多输出系统
- 内部状态清晰,方便做状态反馈
- 数值稳定性比传递函数好
我做一个四轮独立驱动车辆模型时,就用状态空间模块。四个轮子、三个方向自由度,总共7个状态。如果用传递函数,得写7个模块,连线连到崩溃。状态空间一个模块搞定,矩阵一填就行。
参数设置要注意:
| 矩阵 | 维度 | 说明 |
|---|---|---|
| A | n×n | 系统矩阵,n为状态数 |
| B | n×m | 输入矩阵,m为输入数 |
| C | p×n | 输出矩阵,p为输出数 |
| D | p×m | 直通矩阵,通常为0 |
注意:D矩阵不能随便填0。如果系统有直通路径(比如比例控制),D矩阵非零。我见过有人把D设成全0,结果仿真结果跟实测差了一个常数偏移,查了半天才发现是直通项丢了。
3.5 连续系统仿真设置:别让仿真设置毁了你的模型
模型搭得再好,仿真设置不对,结果也是废的。我见过太多人在这上面翻车。
仿真设置的核心参数:
| 参数 | 推荐值 | 为什么 |
|---|---|---|
| Solver | ode45(变步长)或ode4(定步长) | ode45精度高,ode4适合实时仿真 |
| Start time | 0 | 一般从0开始 |
| Stop time | 根据系统时间常数定 | 至少覆盖5个最大时间常数 |
| Max step size | 系统最小时间常数的1/10 | 步长太大,高频动态丢失 |
| Relative tolerance | 1e-3 或 1e-4 | 精度要求高就设小点 |
我个人习惯这样配:
- 先跑一次变步长(ode45),看系统动态有多快
- 根据结果,确定合适的定步长
- 如果模型有开关或非线性,用ode23t或ode15s,别用ode45
避坑指南:我曾经做一个液压系统仿真,用ode45跑,结果压力曲线一直在振荡。我以为是模型错了,折腾了两天。后来换成ode23t,问题立刻解决。原来液压系统的刚性太大,ode45根本处理不了。记住:刚性系统用刚性求解器。
3.6 知识体系总览
下面这张图,把连续系统建模的核心逻辑串起来了。你看一眼,心里就有数了。
这张图把四个模块和仿真设置的关系理清了。你从中心出发,先选模块,再配参数,最后调仿真设置。每一步都有坑,但每一步也都有解法。
好了,连续系统建模这块,核心就是这些。积分器管记忆,微分器管变化率,传递函数管频域,状态空间管多变量。仿真设置是最后一道关,别让它卡住你。下次咱们聊离散系统,那又是另一番天地了。