共计 1320 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要离散化?
在数字控制器设计中,我们处理的都是离散时间信号,但被控对象往往是连续系统。这就需要在设计阶段把连续系统模型转换为离散形式。手动推导离散化模型时,有两个常见痛点:

- 状态转移矩阵计算复杂,特别是高阶系统容易出错
- 离散化后的能控性分析对数值误差敏感,容易产生误判
数学推导
给定连续系统状态空间方程:
$$
\dot{x} = A x + B u
$$
采用零阶保持器 (ZOH) 离散化后,离散状态空间方程为:
$$
x_{k+1} = A_d x_k + B_d u_k
$$
其中:
$$
A_d = e^{AT} \
B_d = (\int_0^T e^{A\tau} d\tau) B
$$
这里的关键是矩阵指数 $e^{AT}$ 的计算。在 MATLAB 中可以直接用 expm 函数,Python 中可以用scipy.linalg.expm。
代码实现
MATLAB 版本
% 参数定义
A = [0 1; -2 -3]; % 连续系统 A 矩阵
B = [0; 1]; % 连续系统 B 矩阵
T = 0.1; % 采样周期
% 离散化
Ad = expm(A*T); % 矩阵指数计算
Bd = (Ad - eye(size(A)))/A * B; % 离散 B 矩阵
% 能控性分析
Ctrb = ctrb(Ad, Bd); % 能控性矩阵
rank_Ctrb = rank(Ctrb);
if rank_Ctrb == size(A,1)
disp('系统能控');
else
disp('系统不能控');
end
Python 版本
import numpy as np
from scipy.linalg import expm, solve
# 参数定义
A = np.array([[0, 1], [-2, -3]]) # 连续系统 A 矩阵
B = np.array([[0], [1]]) # 连续系统 B 矩阵
T = 0.1 # 采样周期
# 离散化
Ad = expm(A*T) # 矩阵指数计算
Bd = solve(A, (Ad - np.eye(2)) @ B) # 离散 B 矩阵
# 能控性分析
Ctrb = np.hstack([Bd, Ad @ Bd]) # 能控性矩阵
rank_Ctrb = np.linalg.matrix_rank(Ctrb)
print('系统能控' if rank_Ctrb == A.shape[0] else '系统不能控')
可视化对比
建议绘制 Bode 图来比较离散前后系统的频率特性。在 MATLAB 中可以用 c2d 函数和 bode 函数,Python 中可以用 control 库的相应函数。
避坑指南
- 采样周期选择
采样周期 $T$ 不能太大,否则会导致能控性丢失。临界条件与系统的特征频率有关,通常取 $T < 1/(10\omega_{max})$,其中 $\omega_{max}$ 是系统的最高特征频率。
- 数值精度问题
矩阵指数计算对数值精度敏感。对于病态矩阵,建议:
- 使用高精度计算库
- 采用 Pade 近似等数值稳定算法
-
对矩阵进行平衡化处理
-
能控性分析
直接计算能控性矩阵的秩可能不稳定,推荐:
- 计算能控性 Gramian 矩阵
- 检查奇异值是否足够大
开放性问题
- 带时延的系统
当系统存在时延 $\tau$ 时,离散化模型会更复杂。可以考虑:
- 将时延表示为状态变量
-
使用改进的离散化方法
-
能控性的工程意义
能控性分析不仅影响理论设计,还直接关系到:
- 控制器能否将系统驱动到期望状态
- 状态观测器的设计可行性
- 系统的稳定裕度
在实际工程中,我们还需要考虑噪声、非线性等因素对能控性的影响。
正文完
发表至: 未分类
近两天内
