第二章:系统建模基础——从物理世界到数学模型

大家好,欢迎来到第二章。说实话,系统建模这件事,是我在职业生涯中踩坑最多的地方。刚入行那会儿,我总觉得建模就是列几个方程,简单得很。直到有一次,我负责一个电机控制项目,模型建得不够精确,结果实物跑起来完全不是那么回事——嗯,从那以后,我再也不敢小看这一步了。

这一章,咱们就聊聊怎么把物理世界里的真实系统,变成我们可以在电脑里分析、计算的数学模型。说白了,就是给系统拍一张“数学照片”。

2.1 从物理世界到数学模型:为什么要建模?

你想想看,一个真实的系统,比如一个倒立摆、一个机械臂、或者一个无人机,它里面有各种物理量:位置、速度、电流、温度……这些量之间互相影响,关系复杂得很。我们不可能每次都把实物搬出来做实验,那成本太高了。

数学模型的作用,就是把这些复杂关系用数学语言表达出来。有了模型,我们就可以:

  • 仿真分析:在电脑上模拟系统行为,看看它会不会失控
  • 控制器设计:根据模型算出合适的控制参数
  • 性能预测:提前知道系统在不同工况下的表现

核心思想:建模不是追求“完全精确”,而是追求“足够好用”。一个过于复杂的模型,反而会让控制器设计变得困难。

我在项目中遇到过一位同事,他花了两周时间建了一个极其精细的模型,考虑了所有非线性因素。结果呢?控制器根本算不过来,实时性完全达不到要求。后来我们换了一个简化模型,效果反而更好。

2.2 微分方程与状态空间表示

说到建模,最基础的工具就是微分方程。为什么?因为物理世界的变化,本质上都是连续的、动态的。牛顿第二定律 F=ma,你看,加速度是速度的导数,速度是位置的导数——这不就是微分方程吗?

2.2.1 微分方程建模

咱们拿一个最简单的例子:RC电路。一个电阻R和一个电容C串联,输入电压是u(t),输出电压是y(t)。根据基尔霍夫定律,我们可以写出:

RC · dy(t)/dt + y(t) = u(t)

这就是一个一阶线性常微分方程。它描述了输出电压随时间变化的规律。如果你学过电路分析,应该对这个不陌生。

再复杂一点,比如一个弹簧-质量-阻尼系统:

m · d²x/dt² + b · dx/dt + k · x = F(t)

其中m是质量,b是阻尼系数,k是弹簧刚度,F(t)是外力。这是一个二阶微分方程。

我的习惯:拿到一个物理系统,先画出它的物理模型图,标出所有变量和参数。然后根据物理定律(牛顿定律、基尔霍夫定律、热力学定律等)列方程。这一步千万别急,列错了后面全白干。

2.2.2 状态空间表示

微分方程虽然直观,但系统一复杂,方程就变得又长又乱。比如一个多输入多输出系统,你写十几个微分方程,看着都头疼。

这时候,状态空间表示法就派上用场了。它把高阶微分方程转换成一组一阶微分方程组,用矩阵形式表达,简洁又漂亮。

还是拿那个弹簧-质量-阻尼系统举例。我们定义状态变量:

x₁ = x  (位置)
x₂ = dx/dt  (速度)

那么原方程可以写成:

dx₁/dt = x₂
dx₂/dt = (-k/m) · x₁ + (-b/m) · x₂ + (1/m) · F(t)

写成矩阵形式就是:

[dx₁/dt]   [0      1   ] [x₁]   [0  ]
[dx₂/dt] = [-k/m  -b/m] [x₂] + [1/m] · F(t)

y = [1  0] [x₁]
          [x₂]

这就是标准的状态空间表达式:

dx/dt = A · x + B · u
y = C · x + D · u

其中A是系统矩阵,B是输入矩阵,C是输出矩阵,D是直通矩阵(通常为0)。

为什么要用状态空间? 因为它统一了建模、分析和设计的框架。不管是单变量还是多变量,线性还是非线性,时变还是时不变,都能用这个框架处理。现代控制理论几乎都是建立在状态空间基础上的。

我曾经做过一个四旋翼无人机的姿态控制项目。四个电机,六个自由度,十几个状态变量。如果用微分方程硬写,那简直是一场噩梦。但用状态空间表示,A矩阵是12×12的,虽然大,但结构清晰,调试起来方便多了。

2.3 传递函数与零极点分析

如果说状态空间是“时域”的视角,那传递函数就是“频域”的视角。两者是同一个系统的不同描述方式,各有各的用处。

2.3.1 传递函数

传递函数是在零初始条件下,输出拉普拉斯变换与输入拉普拉斯变换之比。说白了,就是给系统一个正弦波输入,看它输出怎么变。

对于前面那个RC电路,对微分方程两边做拉普拉斯变换:

RC · s · Y(s) + Y(s) = U(s)
Y(s) · (RCs + 1) = U(s)
G(s) = Y(s)/U(s) = 1/(RCs + 1)

这就是一个一阶低通滤波器的传递函数。你看,多简洁!

对于一般的线性时不变系统,传递函数可以写成:

G(s) = (b_m · s^m + b_{m-1} · s^{m-1} + ... + b_0) / (a_n · s^n + a_{n-1} · s^{n-1} + ... + a_0)

其中n ≥ m,这是物理可实现系统的要求。

我的建议:在实际项目中,我通常先用传递函数做频域分析,看看系统的带宽、稳定性裕度。然后再转到状态空间做时域仿真和控制器设计。两个工具配合使用,效果最好。

2.3.2 零极点分析

传递函数的分子多项式的根叫“零点”,分母多项式的根叫“极点”。这两个东西,是系统特性的“基因密码”。

为什么这么说?

  • 极点决定稳定性:所有极点都在左半平面(实部小于0),系统就稳定。只要有一个极点在右半平面,系统就不稳定。
  • 极点决定响应速度:极点离虚轴越远,系统响应越快。离虚轴越近,响应越慢。
  • 零点影响动态形状:零点会影响系统响应的超调量和上升时间。

举个例子,一个二阶系统的传递函数:

G(s) = ω_n² / (s² + 2ζω_n · s + ω_n²)

它的极点是:

s = -ζω_n ± ω_n · √(ζ² - 1)

当ζ < 1时,极点是共轭复数,系统会有振荡。ζ越小,振荡越厉害。当ζ ≥ 1时,极点是实数,系统没有振荡。

零极点图:把零点和极点画在复平面上,就是零极点图。这个图能让你一眼看出系统的所有关键特性。我每次做控制器设计,第一件事就是看零极点图。

2.3.3 从状态空间到传递函数

这两者是可以互相转换的。给定状态空间模型:

dx/dt = A·x + B·u
y = C·x + D·u

对应的传递函数是:

G(s) = C · (sI - A)⁻¹ · B + D

反过来,从传递函数也可以得到状态空间模型(称为“实现”),但实现方式不唯一。

注意:我曾经在转换过程中吃过亏。从状态空间算传递函数时,如果系统有不可控或不可观的模态,会出现零极点对消。这时候传递函数看起来是稳定的,但实际系统内部可能有不稳定模态。所以,做零极点对消之前,一定要确认那些模态是不是真的可以被忽略。

2.4 建模实战:一个简单的例子

咱们来走一遍完整的建模流程。就拿一个直流电机来说吧。

第一步:物理分析

直流电机有两个主要部分:电枢回路(电气部分)和转子(机械部分)。电枢回路的电压方程:

u(t) = R·i(t) + L·di(t)/dt + e(t)

其中e(t)是反电动势,e(t) = K_e · ω(t)。

机械部分的转矩方程:

J · dω(t)/dt = T_m(t) - B·ω(t)

其中T_m(t) = K_t · i(t)是电磁转矩。

第二步:列微分方程

把两个方程联立:

L · di/dt = -R·i - K_e·ω + u
J · dω/dt = K_t·i - B·ω

第三步:状态空间表示

选择状态变量 x = [i, ω]ᵀ,输入 u,输出 y = ω:

[di/dt]   [-R/L   -K_e/L] [i]   [1/L]
[dω/dt] = [K_t/J   -B/J ] [ω] + [0  ] · u

y = [0  1] [i]
          [ω]

第四步:求传递函数

用公式 G(s) = C·(sI-A)⁻¹·B,得到:

G(s) = K_t / (J·L·s² + (J·R + B·L)·s + (B·R + K_e·K_t))

你看,一个二阶系统。极点的位置取决于电机参数。如果阻尼不够,电机启动时会有振荡。

实战经验:我在做电机控制时,通常先测出R、L、J这些参数。但要注意,这些参数会随着温度、负载变化。所以控制器设计时要留有余量,不能卡着边界算。

2.5 本章小结

这一章咱们聊了系统建模的三个层次:

  1. 微分方程:最直接的物理描述,适合简单系统
  2. 状态空间:统一的矩阵框架,适合复杂多变量系统
  3. 传递函数:频域视角,适合分析和设计控制器

这三种表示方法不是互斥的,而是互补的。在实际项目中,我经常来回切换使用。建模这件事,没有标准答案,只有最适合当前问题的答案。

下一章,咱们会深入聊聊怎么根据这些模型来设计控制器。到时候你会发现,建模这一步做得扎实,后面的工作会轻松很多。

好,这一章就到这里。有什么问题,欢迎在课程群里讨论。