实验 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 实验
- 完成
delta_operator_demo.m,总时间设为 10。 - 对三个采样步长分别保存时间向量、状态轨迹和参考轨迹。
- 计算每个时刻的
2-范数误差,以及全程最大误差。 - 将每个
T的步数、末端误差和最大误差写入汇总表sampling-errors.csv。 - 将每个采样时刻写入长表
sampling-trajectories.csv,列固定为T、time、x1、x2、referenceX1、referenceX2和error。每行只对应一个采样周期和一个时刻。 - 用三个子图比较
x1(t),统一坐标范围,并叠加连续参考解。 - 清空工作区后重新运行,确认输出路径与当前启动位置无关。
不要为了得到“好看”的结果删掉 \(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 status 和 git 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显示工作区干净。