3. 模型线性化与工作点分析
在控制器设计中,直接拿一个非线性模型去调PID或做频域设计,往往会遇到两个问题:一是工作点不同,系统动态差别很大;二是频域工具(如bode、margin)默认对象是线性时不变模型。因此,本节的核心任务是把非线性对象在指定工作点附近“变成”一个可用的线性模型,并确认这个线性模型在该工作点附近是可信的。
一、工作点与平衡点的关系
工作点(Operating Point)是系统在某一稳态工况下的状态与输入组合。平衡点(Equilibrium Point)是工作点中满足状态导数近似为零的那一类,即系统在该点保持不动。对于控制工程,我们通常关心的是“某个期望工况”对应的平衡点,例如水箱液位维持在0.5 m、电机转速维持在1500 r/min。
以常见的一阶非线性对象为例:
dx/dt = -a*x + b*u^2
y = x
其中 x 为状态,u 为输入,a、b 为正参数。令 dx/dt = 0,可得平衡关系 x_eq = (b/a)*u_eq^2。若希望 x_eq = 0.5,则 u_eq = sqrt(a*x_eq/b)。这就是平衡点求解的基本思路:令导数为零,解出状态与输入的对应关系。
二、MATLAB中的线性化工具链
MATLAB提供了两条主要路径:一是基于Simulink Control Design的linearize与findop,二是基于Symbolic Math Toolbox或手动推导的解析线性化。对于工程实践,推荐使用Simulink模型配合findop和linearize,因为可以自动处理复杂非线性环节。
典型流程如下:
- 在Simulink中搭建非线性模型,明确输入端口和输出端口。
- 使用
operspec创建操作点规格,指定哪些状态已知、哪些输入固定。 - 调用
findop求解平衡点,得到op对象。 - 调用
linearize在op处线性化,得到状态空间模型sys_lin。 - 用
bode、margin、step检查线性模型的频域与时域特性。
若没有Simulink模型,也可以直接用MATLAB函数编写非线性方程,再用fsolve求平衡点,用有限差分求雅可比矩阵完成线性化。例如:
a = 2; b = 1;
x_eq = 0.5;
u_eq = sqrt(a*x_eq/b);
% 数值雅可比
eps_u = 1e-6;
f = @(x,u) -a*x + b*u^2;
A = (f(x_eq+1e-6,u_eq)-f(x_eq-1e-6,u_eq))/2e-6;
B = (f(x_eq,u_eq+eps_u)-f(x_eq,u_eq-eps_u))/(2*eps_u);
C = 1; D = 0;
sys_lin = ss(A,B,C,D);
这里A = -a = -2,B = 2*b*u_eq = 2*1*0.5 = 1。得到的线性模型为 dx̃/dt = -2*x̃ + 1*ũ,ỹ = x̃。注意:线性化后的变量是相对于工作点的偏差量,不是绝对量。
三、频域特性分析:线性模型是否可用
得到线性模型后,不能直接拿去设计控制器,必须先确认它在工作点附近是否“像”原非线性系统。常用手段是频域分析:
- Bode图:观察幅频与相频曲线,确认截止频率、相位裕度。对于上述一阶系统,A = -2,时间常数T = 0.5 s,截止频率约0.318 Hz(2 rad/s)。
- Margin:若相位裕度小于45°,说明闭环后容易振荡,需要重新考虑工作点或控制器结构。
- 极点分布:线性化后极点应在左半平面。若出现右半平面极点,说明该工作点本身不稳定,线性化模型只能用于小范围分析。
- 时域对比:给非线性模型和线性模型相同的偏差输入(如0.01的小阶跃),比较输出响应。若偏差在5%以内,认为线性模型在该工作点附近可信。
需要强调的是,线性化只在工作点邻域有效。偏差越大,非线性项(如u²)的影响越明显。工程上通常取工作点附近±5%~±10%的范围作为线性模型的有效区间。
四、实操:从Simulink模型到线性模型
假设已有一个Simulink模型nonlinear_model.slx,输入端口为u,输出端口为y。以下命令完成平衡点求解与线性化:
% 创建操作点规格
opspec = operspec('nonlinear_model');
opspec.States(1).Known = true;
opspec.States(1).SteadyState = true;
opspec.Inputs(1).Known = true;
opspec.Inputs(1).u = 0.5;
% 求解平衡点
op = findop('nonlinear_model', opspec);
% 线性化
sys_lin = linearize('nonlinear_model', op);
% 频域分析
figure; bode(sys_lin); grid on;
figure; margin(sys_lin);
figure; step(sys_lin);
运行后,若sys_lin的极点为-2,则与解析结果一致。若极点与预期不符,应检查操作点规格中状态是否被正确固定,或输入是否被错误约束。
五、常见问题与判断依据
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| findop不收敛 | 初始猜测偏离平衡点太远 | 手动设置opspec.States(1).x为接近值 |
| 线性化后极点为正 | 工作点本身不稳定 | 确认物理意义,或改用其他工作点 |
| 频域曲线异常 | 线性化点与设计点不一致 | 重新核对op中的状态与输入值 |
| 时域对比偏差大 | 测试阶跃幅值超出线性范围 | 减小阶跃幅值至1%~5%工作点值 |
总结本节的关键动作:先明确工作点与平衡点的物理含义,再用findop求解、linearize线性化,最后用Bode、margin、step和时域对比确认线性模型在目标工况附近可信。只有这一步做扎实,后续的频域控制器设计才有可靠的基础。