3. 动态系统与数学模型基础
系统辨识的核心任务,是用一个数学模型去逼近真实动态系统的输入输出行为。要完成这件事,首先必须理解“动态系统”在数学上有哪些等价或互补的描述方式,以及这些描述在 MATLAB 中如何落地。本章围绕连续系统与离散系统、传递函数、状态空间、差分方程四条主线展开,并给出它们在 MATLAB 中的标准表示方法。
一、连续系统与离散系统:时间轴上的两种视角
连续系统用微分方程描述,输入 u(t) 与输出 y(t) 在时间上连续变化。以典型一阶惯性系统为例:
τ · dy(t)/dt + y(t) = K · u(t)
其中 τ 为时间常数,K 为静态增益。离散系统则用差分方程描述,只在采样时刻 kT(T 为采样周期)取值。同一物理对象,若用零阶保持器采样,可写成:
y[k] = a · y[k-1] + b · u[k-1]
连续与离散不是两个不同的系统,而是同一系统的两种表示。辨识时若数据来自计算机采集,天然是离散序列,通常先建立离散模型,再按需转换回连续模型。采样周期 T 的选择直接影响模型精度:T 过大,高频动态被混叠丢失;T 过小,数据冗余且数值病态。工程经验是让系统主要时间常数对应 5~10 个采样点。
二、传递函数:输入输出关系的频域表达
对连续系统做拉普拉斯变换(零初始条件),得到传递函数:
G(s) = Y(s) / U(s) = K / (τ·s + 1)
传递函数只描述输入到输出的外部关系,不暴露内部状态,适合单输入单输出(SISO)系统的频域分析与控制器设计。离散系统对应 Z 变换,得到脉冲传递函数 G(z)。MATLAB 中用 tf 构造:
K = 2; tau = 0.5;
G = tf(K, [tau 1]); % 连续传递函数
Gd = c2d(G, 0.1, 'zoh'); % 以 T=0.1s 离散化
运行后 Gd 会给出离散分子分母系数,可直接用于差分方程递推。判断模型是否合理,可看 step(G) 的稳态值是否等于 K、上升时间是否与 τ 匹配。
三、状态空间:内部结构的完整描述
当系统为多输入多输出(MIMO),或需要观察内部状态时,传递函数不够用,应使用状态空间模型:
dx/dt = A·x + B·u
y = C·x + D·u
其中 x 为状态向量,A 描述状态间耦合,B 描述输入对状态的作用,C 描述状态到输出的映射,D 为直通项。MATLAB 中用 ss 构造:
A = [0 1; -1/tau^2 -2/tau];
B = [0; K/tau^2];
C = [1 0]; D = 0;
sys = ss(A, B, C, D);
状态空间与传递函数可互相转换:tf(sys) 得到传递函数,ss(G) 得到状态空间。同一传递函数对应的状态空间实现不唯一,取决于状态变量的选取。
四、差分方程与 MATLAB 表示
离散差分方程是辨识算法最直接的模型形式。一般 n 阶差分方程写作:
y[k] + a1·y[k-1] + ... + an·y[k-n]
= b1·u[k-1] + ... + bm·u[k-m]
在 MATLAB 中,可用 filter 按系数向量递推仿真:
a = [1 -0.8]; b = [0 0.2];
u = ones(1, 50);
y = filter(b, a, u); % 单位阶跃响应序列
也可用 idpoly 或 arx 结构表示待辨识模型。辨识得到 a、b 后,代入 filter 即可复现输出,与实测数据对比残差,判断模型是否可用。
五、四种表示的选用原则
面对一个具体辨识任务,选哪种表示取决于三个问题:系统是 SISO 还是 MIMO?数据是连续采集还是离散采样?是否需要观察内部状态?SISO 且只关心输入输出关系时,传递函数或差分方程最简洁;MIMO 或需要状态反馈时,状态空间更合适;数据来自数字采集时,优先建立离散模型,再用 d2c 转回连续形式。
tf、ss、idpoly 对象之间可以互相转换,转换命令为 tf(sys)、ss(sys)、c2d、d2c。转换后建议用 step 或 compare 对比原模型与转换模型的响应,确认转换未引入明显误差。
T 必须与辨识实验中的实际采样周期一致。若建模时用 T=0.1s,而数据实际以 0.05s 采集,则差分方程系数 a、b 将完全错误,后续预测和控制器设计都会失效。