共计 2388 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在数字控制器设计中,我们常常需要将连续系统转换为离散系统,以便在计算机或微处理器上实现控制算法。然而,这个过程并非一帆风顺,其中最大的挑战之一就是采样周期的选择。采样周期过长可能导致系统能控性丢失,进而影响控制性能;采样周期过短则会增加计算负担,甚至引发数值稳定性问题。

- 连续系统离散化的必要性:
- 数字控制器只能在离散时间点进行采样和控制
- 计算机无法直接处理连续时间信号
-
现代控制系统大多采用数字实现
-
采样周期选择的困境:
- 过大的采样周期会导致高频信号丢失(香农采样定理)
- 过小的采样周期增加计算成本
- 不当采样可能导致系统能控性完全丧失
技术对比
在离散化方法的选择上,工程师们通常会考虑以下几种主流技术:
- 零阶保持法(ZOH)
- 最简单的离散化方法
- 假设输入信号在采样周期内保持恒定
- 计算简单但精度有限
-
适用于大多数工业控制系统
-
一阶保持法(FOH)
- 比 ZOH 更高阶的近似
- 假设输入信号在采样周期内线性变化
- 计算复杂度增加
-
对快速变化信号表现更好
-
双线性变换(Tustin)
- 也称为梯形法或双线性近似
- 保持系统稳定性
- 频率响应有畸变(频率扭曲)
- 常用于滤波器设计
核心实现
状态空间方程离散化
连续系统的状态空间方程一般表示为:
$$
\dot{x}(t) = A x(t) + B u(t)
$$
经过离散化后,我们得到:
$$
x[k+1] = \Phi x[k] + \Gamma u[k]
$$
其中:
$$
\Phi = e^{A T_s}, \quad \Gamma = \int_0^{T_s} e^{A \tau} B d\tau
$$
$T_s$ 是采样周期。对于 ZOH 方法,当 $A$ 可逆时,$\Gamma$ 可以表示为:
$$
\Gamma = A^{-1}(\Phi – I)B
$$
能控性矩阵计算
离散系统的能控性矩阵为:
$$
\mathcal{C} = [\Gamma \quad \Phi \Gamma \quad \cdots \quad \Phi^{n-1} \Gamma]
$$
系统完全能控的条件是 $\text{rank}(\mathcal{C}) = n$,其中 $n$ 是系统阶数。
代码示例
MATLAB 实现
% 连续系统矩阵
A = [0 1; -1 -0.5];
B = [0; 1];
C = [1 0];
D = 0;
% 采样周期
Ts = 0.1;
% 离散化(零阶保持)
sys = ss(A, B, C, D);
sysd = c2d(sys, Ts, 'zoh');
[Phi, Gamma] = ssdata(sysd);
% 计算能控性矩阵
n = size(A, 1);
Ctrb = Gamma;
for i = 1:n-1
Ctrb = [Ctrb Phi^i*Gamma];
end
% 检查能控性
rank_Ctrb = rank(Ctrb);
if rank_Ctrb == n
disp('系统完全能控');
else
disp('系统不完全能控');
end
Python 实现
import numpy as np
from scipy.linalg import expm, inv
# 连续系统矩阵
A = np.array([[0, 1], [-1, -0.5]])
B = np.array([[0], [1]])
# 采样周期
Ts = 0.1
# 离散化(零阶保持)
Phi = expm(A * Ts)
if np.linalg.matrix_rank(A) == A.shape[0]:
Gamma = inv(A) @ (Phi - np.eye(2)) @ B
else:
# 处理奇异矩阵情况
t = np.linspace(0, Ts, 100)
integrand = lambda tau: expm(A * tau) @ B
Gamma = np.trapz([integrand(tau) for tau in t], x=t, axis=0)
# 计算能控性矩阵
n = A.shape[0]
Ctrb = Gamma
for i in range(1, n):
Ctrb = np.hstack((Ctrb, np.linalg.matrix_power(Phi, i) @ Gamma))
# 检查能控性
rank_Ctrb = np.linalg.matrix_rank(Ctrb)
print(f'能控性矩阵秩: {rank_Ctrb}')
if rank_Ctrb == n:
print('系统完全能控')
else:
print('系统不完全能控')
避坑指南
采样周期选择
- 经验法则:采样频率应为系统带宽的 5 -10 倍
- 系统动态特性考虑:
- 对于快速响应系统,需要更小的采样周期
- 振荡系统需要足够采样率来捕获振荡特性
能控性恶化诊断
- 数值指标:
- 能控性矩阵条件数
- 最小奇异值与最大奇异值的比值
- MATLAB 中可用
cond()函数评估
病态矩阵处理
- 预处理技巧:
- 平衡变换(balance)
- 正交分解
- 正则化处理
验证案例
考虑一个二阶振荡系统:
$$
\ddot{x} + 2\zeta\omega_n\dot{x} + \omega_n^2 x = u
$$
状态空间表示为:
$$
A = \begin{bmatrix} 0 & 1 \ -\omega_n^2 & -2\zeta\omega_n \end{bmatrix}, \quad B = \begin{bmatrix} 0 \ 1 \end{bmatrix}
$$
取 $\omega_n = 1$,$\zeta = 0.1$,比较不同离散化方法和采样周期下的能控性:
- 采样周期 $T_s = 0.1$ 秒
- ZOH: 完全能控
-
Tustin: 完全能控
-
采样周期 $T_s = 1.0$ 秒
- ZOH: 能控性下降
-
Tustin: 仍保持较好能控性
-
采样周期 $T_s = 2.0$ 秒
- ZOH: 几乎丧失能控性
- Tustin: 能控性显著恶化
开放式问题
- 如何设计自适应采样策略,在保证能控性的同时优化计算效率?
- 对于病态系统,有哪些改进的离散化方法可以更好地保持能控性?
- 在实际工程中,如何平衡离散化误差与数字实现复杂度?
结语
系统离散化是数字控制系统设计中的关键步骤,需要认真考虑采样周期选择和各种离散化方法的特性。通过本文的案例和分析,我们可以看到,不同的离散化方法对系统能控性的影响各不相同,工程师需要根据具体应用场景做出权衡。希望这些实践经验能够帮助你在实际项目中更好地处理离散化问题。
