线性定常连续系统离散化实战:从状态空间模型到能控性分析

1次阅读
没有评论

共计 2388 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

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

线性定常连续系统离散化实战:从状态空间模型到能控性分析

  • 连续系统离散化的必要性
  • 数字控制器只能在离散时间点进行采样和控制
  • 计算机无法直接处理连续时间信号
  • 现代控制系统大多采用数字实现

  • 采样周期选择的困境

  • 过大的采样周期会导致高频信号丢失(香农采样定理)
  • 过小的采样周期增加计算成本
  • 不当采样可能导致系统能控性完全丧失

技术对比

在离散化方法的选择上,工程师们通常会考虑以下几种主流技术:

  1. 零阶保持法(ZOH)
  2. 最简单的离散化方法
  3. 假设输入信号在采样周期内保持恒定
  4. 计算简单但精度有限
  5. 适用于大多数工业控制系统

  6. 一阶保持法(FOH)

  7. 比 ZOH 更高阶的近似
  8. 假设输入信号在采样周期内线性变化
  9. 计算复杂度增加
  10. 对快速变化信号表现更好

  11. 双线性变换(Tustin)

  12. 也称为梯形法或双线性近似
  13. 保持系统稳定性
  14. 频率响应有畸变(频率扭曲)
  15. 常用于滤波器设计

核心实现

状态空间方程离散化

连续系统的状态空间方程一般表示为:

$$
\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$,比较不同离散化方法和采样周期下的能控性:

  1. 采样周期 $T_s = 0.1$ 秒
  2. ZOH: 完全能控
  3. Tustin: 完全能控

  4. 采样周期 $T_s = 1.0$ 秒

  5. ZOH: 能控性下降
  6. Tustin: 仍保持较好能控性

  7. 采样周期 $T_s = 2.0$ 秒

  8. ZOH: 几乎丧失能控性
  9. Tustin: 能控性显著恶化

开放式问题

  1. 如何设计自适应采样策略,在保证能控性的同时优化计算效率?
  2. 对于病态系统,有哪些改进的离散化方法可以更好地保持能控性?
  3. 在实际工程中,如何平衡离散化误差与数字实现复杂度?

结语

系统离散化是数字控制系统设计中的关键步骤,需要认真考虑采样周期选择和各种离散化方法的特性。通过本文的案例和分析,我们可以看到,不同的离散化方法对系统能控性的影响各不相同,工程师需要根据具体应用场景做出权衡。希望这些实践经验能够帮助你在实际项目中更好地处理离散化问题。

正文完
 0
评论(没有评论)