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

1次阅读
没有评论

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

image.webp

为什么需要离散化?

在数字控制器设计中,我们处理的都是离散时间信号,但被控对象往往是连续系统。这就需要在设计阶段把连续系统模型转换为离散形式。手动推导离散化模型时,有两个常见痛点:

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

  • 状态转移矩阵计算复杂,特别是高阶系统容易出错
  • 离散化后的能控性分析对数值误差敏感,容易产生误判

数学推导

给定连续系统状态空间方程:

$$
\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 库的相应函数。

避坑指南

  1. 采样周期选择

采样周期 $T$ 不能太大,否则会导致能控性丢失。临界条件与系统的特征频率有关,通常取 $T < 1/(10\omega_{max})$,其中 $\omega_{max}$ 是系统的最高特征频率。

  1. 数值精度问题

矩阵指数计算对数值精度敏感。对于病态矩阵,建议:

  • 使用高精度计算库
  • 采用 Pade 近似等数值稳定算法
  • 对矩阵进行平衡化处理

  • 能控性分析

直接计算能控性矩阵的秩可能不稳定,推荐:

  • 计算能控性 Gramian 矩阵
  • 检查奇异值是否足够大

开放性问题

  1. 带时延的系统

当系统存在时延 $\tau$ 时,离散化模型会更复杂。可以考虑:

  • 将时延表示为状态变量
  • 使用改进的离散化方法

  • 能控性的工程意义

能控性分析不仅影响理论设计,还直接关系到:

  • 控制器能否将系统驱动到期望状态
  • 状态观测器的设计可行性
  • 系统的稳定裕度

在实际工程中,我们还需要考虑噪声、非线性等因素对能控性的影响。

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