返回课程总览

实验 08 · Delta 算子

采样与 Delta 算子

比较离散轨迹与连续参考解,并导出误差汇总和逐时刻长表。

完整讲义

Lab 08:采样与 Delta 算子

本实验从 Lab 7 中的固定递推继续前进,引入采样周期 T。Lab 7 使用给定矩阵直接计算 下一状态;这里先从 Delta 定义推导更新矩阵,再复用相同的“预分配、逐步更新、导出和验证” 流程。你将看到同一个连续模型如何产生不同采样精度的离散轨迹,并理解 Delta 算子为什么 适合连接连续时间和离散时间描述。

开始前复用 Lab 4 的 Git 检查点流程:用 git status 确认工作区干净;确认误差表、长表与 图像一致后,按相同方法提交 Lab 8 检查点。

学习目标

  • 理解 Delta 算子是采样状态的一阶差商。
  • 从 \(\delta\boldsymbol{x}(k)=A_\delta\boldsymbol{x}(k)\) 推导一步更新矩阵。
  • expm 生成线性连续系统的参考解。
  • 把采样误差整理为表格和可复现图像。

目录结构

labs/lab08/
  delta_operator_demo.m
  results/
    sampling-errors.csv
    sampling-trajectories.csv
  figures/
    sampling-comparison.png
  notes.md
小知识:Delta 算子不是 Dirac delta

控制论中的 Delta 算子 \(\delta\) 在这里表示采样差商;数学分析中的 Dirac delta 则是一种 广义函数。符号相同不代表对象相同。在技术写作中,第一次使用符号时给出明确定义,比依赖 读者猜测更可靠。

理论问题

采样时刻与移位算子

设连续轨迹为 \(\boldsymbol{x}(t)\),每隔 \(T>0\) 秒观测一次。第 \(k\) 个采样时刻和 对应样本记为:

\[ t_k=kT,\qquad \boldsymbol{x}(k)=\boldsymbol{x}(t_k). \]

移位算子 \(q\) 把序列向前移动一个采样点:

\[ q\boldsymbol{x}(k)=\boldsymbol{x}(k+1). \]

Delta 算子由移位算子归一化得到:

\[ \delta=\frac{q-I}{T},\qquad \delta\boldsymbol{x}(k) =\frac{\boldsymbol{x}(k+1)-\boldsymbol{x}(k)}{T}. \]

当轨迹可微时,必须固定物理时刻 \(t\) 再讨论 \(T\to0\):

\[ \lim_{T\to0}\frac{\boldsymbol{x}(t+T)-\boldsymbol{x}(t)}{T} =\dot{\boldsymbol{x}}(t). \]

因此,当采样时刻 \(t_k\) 逼近固定的 \(t\) 时,Delta 差商逼近该时刻的连续导数。在固定的 非零 \(T\) 下,Delta 算子仍是离散序列上的差分算子,不能直接把它当成连续导数。

Delta 模型与一步更新

\[ \delta\boldsymbol{x}(k) =A_\delta\boldsymbol{x}(k). \]

把 Delta 定义代入模型可得:

\[ \boldsymbol{x}(k+1)=(I+T A_\delta)\boldsymbol{x}(k), \qquad A_q=I+T A_\delta. \]

因此,对已经用 \(A_\delta\) 描述的离散 Delta 模型,\(A_q=I+T A_\delta\) 是同一个模型 在移位形式下的一步更新矩阵。

本实验使用阻尼振子:

\[ A_\delta=\begin{bmatrix}0&1\\-2&-0.6\end{bmatrix}, \qquad \boldsymbol{x}(0)=\begin{bmatrix}1\\0\end{bmatrix}. \]

连续模型、精确采样与 Euler 近似

若起点是无输入连续系统 \(\dot{\boldsymbol{x}}(t)=A_c\boldsymbol{x}(t)\),那么在采样时刻之间精确传播得到:

\[ A_q^{\mathrm{exact}}=e^{A_cT},\qquad A_\delta^{\mathrm{exact}}=\frac{e^{A_cT}-I}{T}. \]

本实验为了观察数值离散误差,把同一个数值矩阵同时写成 Starter 中的 AContinuous = ADelta,并使用 \(I+T A_c\) 近似 \(e^{A_cT}\)。这一步是前向 Euler 近似;AContinuous = ADelta 只是本算例的比较设定,不是通用恒等式。若研究从连续模型出发并要求精确采样,应使用上面的 矩阵指数关系,而不是直接令 \(A_\delta=A_c\)。

特征值与采样稳定性

若 \(\lambda_\delta\) 是 \(A_\delta\) 的特征值,那么对应一步矩阵的特征值为:

\[ \lambda_q=1+T\lambda_\delta. \]

离散线性系统渐近稳定要求所有一步特征值位于单位圆内,即 \(|1+T\lambda_\delta|<1\)。因此 \(T\) 不只影响曲线是否精细,也可能影响 Euler 离散模型的 稳定性。连续系统的稳定特征值经精确采样映射为 \(e^{T\lambda_c}\);Euler 使用的 \(1+T\lambda_c\) 在 \(T\) 较大时可能越出单位圆。

后续实验会把同一骨架扩展为有模式和输入的 Delta 模型:

\[ \delta\boldsymbol{x}=A_i\boldsymbol{x}+B_i\boldsymbol{u},\qquad \boldsymbol{x}(k+1)=(I+T A_i)\boldsymbol{x}(k)+T B_i\boldsymbol{u}(k). \]

Lab 9 让模式 \(i\) 随时间切换,Lab 10 再加入状态反馈。无论模型如何扩展,一步更新都应从 Delta 定义推导,而不是凭代码形状猜测。

公式到代码

对 \(T\in\{0.5,0.1,0.02\}\) 分别构造:

Aq = eye(2) + T * ADelta;
x(:, k + 1) = Aq * x(:, k);

第二行与 Lab 7 的 x(:, k + 1) = A * x(:, k) 具有相同结构。新增工作集中在第一行: Aq = eye(2) + T * ADelta 把采样周期和 Delta 矩阵组合成每一步真正使用的更新矩阵。

连续参考解使用矩阵指数:

xReference(:, k) = expm(AContinuous * time(k)) * x0;

本实验令 \(A_{\mathrm{continuous}}\) 与代码中的 ADelta 取相同数值,因此比较的是该连续 生成矩阵的精确轨迹与前向 Euler 轨迹。比较时必须让它们位于同一组采样时刻。

MATLAB 实验

  1. 完成 delta_operator_demo.m,总时间设为 10。
  2. 对三个采样步长分别保存时间向量、状态轨迹和参考轨迹。
  3. 计算每个时刻的 2-范数误差,以及全程最大误差。
  4. 将每个 T 的步数、末端误差和最大误差写入汇总表 sampling-errors.csv
  5. 将每个采样时刻写入长表 sampling-trajectories.csv,列固定为 Ttimex1x2referenceX1referenceX2error。每行只对应一个采样周期和一个时刻。
  6. 用三个子图比较 x1(t),统一坐标范围,并叠加连续参考解。
  7. 清空工作区后重新运行,确认输出路径与当前启动位置无关。

不要为了得到“好看”的结果删掉 \(T=0.5\)。较粗采样展示了方法的局限,是解释结果的重要部分。

数学验证

先选一个非零时刻,直接检查 Delta 定义:

deltaFromStates = (x(:, k + 1) - x(:, k)) / T;
deltaFromModel = ADelta * x(:, k);
definitionResidual = norm(deltaFromStates - deltaFromModel);

随后检查:

  • 三组实验的终止时间都等于 10。
  • T 减小时,步数按预期增加。
  • 最大误差整体下降;若没有下降,检查时间索引和参考解采样点。
  • \(T=0.5\) 的差异不是 MATLAB 故障,而是低阶离散化的数值误差。

这些结果支持“在当前模型和时间区间内,更小采样步长给出更小 Euler 误差”,不能推出任意系统、任意 T 都满足同样结论。

结果与记录

保留一张比较图、一个误差汇总表和一张逐时刻长表。sampling-errors.csv 适合直接比较三组 参数;sampling-trajectories.csv 允许以后不重新运行 MATLAB 就复绘曲线或检查任意时刻。 正文式描述应同时包含方法、指标和限制,例如:

> 在 0 到 10 的区间内,以矩阵指数解为参考,比较三个采样周期下 Delta 更新的最大状态误差。采样周期减小时,本算例的误差下降。

notes.md 还应写明 \(A_q=I+T A_\delta\) 是本实验使用的离散更新关系,避免把 \(A_q\) 和 \(A_\delta\) 混为同一个矩阵。

OpenCode 审计

复用 Lab 4 的工作流。输入 /models,确认当前模型是 DeepSeek V4 Pro,再按 Tab 进入 Plan 模式并输入:

请检查 labs/lab08/delta_operator_demo.m。

重点检查:
1. δx(k)=(x(k+1)-x(k))/T 是否与代码更新完全一致;
2. 讲义中的精确采样关系与前向 Euler 近似是否被代码和注释明确区分;
3. 三个采样周期是否使用相同终止时间和初值;
4. expm 参考解是否在相同时间点计算;
5. 误差表和图像是否可从脚本重新生成;
6. 结果描述是否错误地把数值收敛说成理论证明。

请先列出检查依据,再给出最小修改建议。不要替换模型参数。

如果建议把所有计算改成工具箱函数,应拒绝这一修改:本实验需要显式保留公式到代码的对应 关系。接受计划后按 Tab 进入 Build 模式。修改完成后,在第二个 PowerShell 终端运行 git statusgit diff -- labs\lab08,再重新执行数值验证。

完成标准

  • 能从 Delta 定义推导 \(A_q=I+T A_\delta\)。
  • 能解释移位算子、Delta 算子、精确采样矩阵和 Euler 更新矩阵之间的区别。
  • 能用 \(\lambda_q=1+T\lambda_\delta\) 解释采样周期为何会影响离散稳定性。
  • sampling-errors.csv 包含三组可核对指标。
  • sampling-trajectories.csv 的列名和每个采样周期的行数都能与脚本对应。
  • 图像与文字准确表达采样步长的影响,不夸大结论。
  • 提交 Lab 8 检查点后,git status 显示工作区干净。