---
title: 采样与数字控制
url: https://doc.liz6.com/theory/02-control-theory/07-sampling-and-delay
locale: zh
area: theory
tags:
- 控制理论
- 基础理论
date: 2026-09-10
modified: 2026-09-10
description: 软件控制器在离散时刻读取测量并更新动作，真实对象在两次更新之间仍继续变化。本篇使用动态建模中的精确递推，区分采样、保持、计算延迟与数值仿真。
---

# 采样与数字控制

软件控制器在离散时刻读取测量并更新动作，真实对象在两次更新之间仍继续变化。本篇使用[动态建模](02-dynamic-models.md)中的精确递推，区分采样、保持、计算延迟与数值仿真。

## 一次采样包含哪些事件？

在 $t_k=kT_s$ 读取 $y_k$，计算 $u_k$，然后将动作保持到下次更新，这叫零阶保持。先假设计算与传输没有额外延迟。$T_s$ 是真实控制周期，不是画面刷新周期。

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 380 430" width="380" height="430" role="img" aria-labelledby="control-sample" data-diagram-theme="native" style="max-width:100%;height:auto;display:block;margin:auto"><title id="control-sample">采样、计算与保持顺序</title><defs><marker id="control-sample-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0L10 5L0 10Z" fill="currentColor"/></marker></defs><rect x="44" y="12" width="300" height="52" rx="8" fill="var(--reading-surface,#f3f5f9)" stroke="currentColor"/><text x="194" y="44" text-anchor="middle" font-size="16" fill="currentColor">t = kTₛ：读取 yₖ</text><path d="M194 65v28" fill="none" stroke="currentColor" marker-end="url(#control-sample-arrow)"/><rect x="44" y="94" width="300" height="52" rx="8" fill="var(--reading-surface,#f3f5f9)" stroke="currentColor"/><text x="194" y="126" text-anchor="middle" font-size="16" fill="currentColor">用当前状态计算 uₖ</text><path d="M194 147v28" fill="none" stroke="currentColor" marker-end="url(#control-sample-arrow)"/><rect x="44" y="176" width="300" height="52" rx="8" fill="var(--reading-surface,#f3f5f9)" stroke="currentColor"/><text x="194" y="208" text-anchor="middle" font-size="16" fill="currentColor">区间内保持 uₖ</text><path d="M194 229v28" fill="none" stroke="currentColor" marker-end="url(#control-sample-arrow)"/><rect x="44" y="258" width="300" height="52" rx="8" fill="var(--reading-surface,#f3f5f9)" stroke="currentColor"/><text x="194" y="290" text-anchor="middle" font-size="16" fill="currentColor">对象持续演化</text><path d="M194 311v28" fill="none" stroke="currentColor" marker-end="url(#control-sample-arrow)"/><rect x="44" y="340" width="300" height="52" rx="8" fill="var(--reading-surface,#f3f5f9)" stroke="currentColor"/><text x="194" y="372" text-anchor="middle" font-size="16" fill="currentColor">t = (k+1)Tₛ：读取新状态</text></svg>

对 $\dot x=-x+u$，时间常数1 s，输入在每段保持不变，精确离散模型为

$$x_{k+1}=ax_k+bu_k,\qquad a=e^{-T_s},\quad b=1-a.$$

$u_k$ 先作用于 $[kT_s,(k+1)T_s)$，再得到 $x_{k+1}$。不能把未来状态拿来计算当前动作。这里只讨论偏差状态，允许正负动作，没有执行器饱和。

## 连续稳定，采样后还能稳定吗？

连续状态反馈 $u=-Kx$ 给出 $\dot x=-(1+K)x$，对 $K>0$ 渐近稳定。采样反馈 $u_k=-Kx_k$ 却给出

$$x_{k+1}=p_dx_k,\qquad p_d=a-(1-a)K.$$

离散状态按 $p_d^k$ 演化，稳定要求 $|p_d|<1$。取 $K=2$，得到 $p_d=3e^{-T_s}-2$，所以

$$0<T_s<\ln3\approx1.099\ \mathrm{s}.$$

$T_s=0.2$ s时 $p_d\approx0.456$，单调衰减；$T_s=1$ s时约−0.896，符号交替但幅度衰减；$T_s=1.2$ s时约−1.096，交替发散。这个差异来自真实采样保持，即使使用精确对象更新也存在。

**采样与数字控制 · 实验**

对象ẋ=−x+u，x0=1，K=2；每次动作保持一周期，区间内用解析解。延迟模式以x−1=x0初始化。谱半径小于1才渐近稳定，纵轴会随发散幅度调整。


从 $x_0=1$ 开始，改变控制周期并观察采样点与连续区间内的对象轨迹。横轴是秒，保持固定观察时长。数据点之间按恒定输入下的解析解绘制，不用直线连接假装连续响应。

## 一拍延迟再增加一个状态

如果本轮只能执行上一轮动作，$u_k=-Kx_{k-1}$，就有

$$x_{k+1}=ax_k-bKx_{k-1},\qquad z^2-az+bK=0.$$

这时必须保存旧状态或待执行动作。取 $K=2,T_s=0.5$，无延迟时极点约−0.180，稳定；一拍延迟时共轭根模长为 $\sqrt{2(1-e^{-0.5})}\approx0.887$，仍稳定但振荡。若 $T_s=0.8$，无延迟极点约−0.652，而一拍延迟根模长约1.049，变为不稳定。不能把“读数更新频繁”直接等同于“动作没有延迟”。

一般离散 LTI 状态模型为 $x_{k+1}=A_dx_k+B_du_k$。其渐近稳定条件是所有闭环特征值严格位于单位圆内。映射 $z=e^{sT_s}$ 适用于连续自由模态的精确采样；采样反馈的闭环通常不等于把连续闭环极点直接代入该映射，因为控制在区间内被保持。

## 仿真步长为何是另一件事？

用 Euler 模拟连续 $\dot x=-3x$ 时，数值更新为 $x_{j+1}=(1-3h)x_j$。若 $h=1$ s，系数−2导致数值发散，但解析解 $x=e^{-3t}x_0$ 稳定。此处错在积分步长，不是控制周期。

验证应固定 $T_s$ 和延迟，仅减小内部积分步长 $h$；如果结果显著变化，先检查数值收敛。线性对象在零阶保持下可用精确离散化避开该误差，但测量采样、噪声混叠与计算延迟仍然存在。

## PID 的离散实现需要明确顺序

例如前向积分 $z_{k+1}=z_k+K_iT_se_k$，微分低通可用精确保持更新 $y_{f,k+1}=\alpha y_{f,k}+(1-\alpha)y_{m,k}$，$\alpha=e^{-T_s/\tau_f}$。计算动作时使用哪个时刻的状态，需要在整个实现中一致。

抗混叠滤波在采样前处理超出可辨范围的分量，采样后平滑无法恢复已混叠的信息。滤波同时增加动态和相位代价。选择周期应依据所需闭环带宽、计算/通信预算与对象模态，并验证最坏延迟和抖动，而不是套一个对所有系统都有效的倍数。

## 自检

$K=2,T_s=\ln3$ 时，$p_d=-1$。这是渐近稳定吗？

<details><summary>参考思路</summary>

不是。无输入时状态正负交替且幅度不衰减，是稳定区间的边界。严格稳定要求模长小于1。

</details>

降低浏览器动画帧率是否应该改变实验的极点与采样周期？

<details><summary>参考思路</summary>

不应该。仿真按规定的物理时间与控制事件计算，屏幕只负责显示。否则画面性能就错误地成为模型参数。

</details>

## 延伸

[python-control `sample_system`](https://python-control.readthedocs.io/en/stable/generated/control.sample_system.html)提供不同离散化方法及采样周期参数。与实际保持方式一致的离散化，才适合后续闭环设计。
