实验 12 · 综合项目
可复现的论文式 MATLAB 项目
组织可重复运行的 Delta 算子切换系统实验,生成指标、MDADT 检查、图像和研究记录。
完整讲义
Lab 12:可复现的论文式 MATLAB 项目
本项目把 Lab 7-11 的状态迭代、Delta 算子、切换脉冲、可靠反馈和稳定性数值检查合并为一个 小型研究工作流。仿真循环从 Lab 10 的受控模型整理而来,Lyapunov 数值和驻留区间分析直接复用 Lab 11 的方法。目标不是完成一项包含全部理论证明的研究,而是练习以后编写实际论文时如何用 MATLAB 组织模型、实验、验证、图表和限制说明。
开始前复用 Lab 4 的 Git 检查点流程:用 git status 确认工作区干净;完整项目从空工作区 重复运行并通过全部检查后,提交最终检查点。
学习目标
- 用单一入口脚本重复生成全部结果。
- 比较开环、同步控制、异步控制和部分执行器故障。
- 让模型参数、仿真、分析和绘图各自承担清晰职责。
- 生成可追溯的指标表、矢量图、预览图和环境信息。
- 把理论背景、数值证据和结论边界写进研究记录。
目录结构
Starter 只提供本项目新增的源文件和写作模板。countModeDwells.m 与 checkMdadt.m 从已完成的 Lab 11 中复制,不会在大作业 Starter 中重复提供。results/ 与 figures/ 应由 run_all.m 自动创建,不放入 Starter 压缩包。
final-project/
README.md
paper-notes.md
prompts.md
run_all.m
modelParameters.m
simulateCase.m
analyzeResults.m
countModeDwells.m
checkMdadt.m
makeFigures.m
results/
metrics.csv
dwell-summary.csv
mdadt-check.csv
environment.txt
figures/
switching-signal.pdf
state-comparison.pdf
norm-comparison.pdf
preview/
switching-signal.png
state-comparison.png
norm-comparison.png
小知识:README 是写给未来读者的信
可复现项目的读者也包括几个月后的自己。README 不应记录临时操作,而应稳定说明研究问题、入口脚本、所需环境、输出文件和复现步骤。好的 README 能把“只有作者电脑能运行的脚本”变成可检查的研究材料。
理论问题
项目采用简化的二维 Delta 算子切换脉冲系统。\(\boldsymbol{x}(k^-)\) 表示脉冲前状态, \(\boldsymbol{x}(k^+)=\widetilde{\boldsymbol{x}}(k)\) 表示脉冲后状态,并记 \(\boldsymbol{z}(k):=\boldsymbol{x}(k^+)\):
\[ \begin{aligned} \boldsymbol{z}(k) &=M_{\sigma(k)}\boldsymbol{x}(k^-),\qquad \text{脉冲时刻},\\ \frac{\boldsymbol{x}((k+1)^-)-\boldsymbol{z}(k)}{T} &=A_{\sigma(k)}\boldsymbol{z}(k) +B_{\sigma(k)}\Omega K_{\sigma_c(k)}\boldsymbol{z}(k). \end{aligned} \]
普通时刻定义 \(\boldsymbol{z}(k)=\boldsymbol{x}(k^+)=\boldsymbol{x}(k^-)\)。因此每一步都 先从脉冲前状态确定脉冲后状态,再计算控制输入和后跳变流动。这里的差商以 \(\boldsymbol{z}(k)\) 为起点,不重新定义 Lab 8 中以 \(\boldsymbol{x}(k)\) 为基点的 Delta 算子;没有脉冲时两者才恢复为同一个普通更新。
参数固定为:
\[ T=0.1,\qquad \boldsymbol{x}(0)=\begin{bmatrix}3\\-2\end{bmatrix}, \qquad N=120, \]
\[ A_1=\begin{bmatrix}0.4&1.0\\-0.2&0.3\end{bmatrix}. \]
\[ A_2=\begin{bmatrix}0.2&-0.8\\0.3&0.5\end{bmatrix}, \qquad B_1=B_2=I. \]
\[ K_1=\begin{bmatrix}-1.2&-1.0\\0.2&-0.9\end{bmatrix}. \]
\[ K_2=\begin{bmatrix}-0.9&0.8\\-0.3&-1.4\end{bmatrix}. \]
\[ M_1=1.10I,\qquad M_2=1.05I. \]
\[ \Omega_{\mathrm{fault}}=\operatorname{diag}(0.7,0.5). \]
Lab 11 使用的正定矩阵继续作为统一的数值分析参数:
\[ P=\begin{bmatrix}2.0&0.3\\0.3&1.0\end{bmatrix}, \qquad V(k)=\boldsymbol{x}(k)^{\mathsf T}P\boldsymbol{x}(k). \]
共同模式序列还要满足逐模式的 MDADT 数值检查:
\[ N_i(k_0,k_1)\le N_{0i}+\frac{T_i(k_0,k_1)}{\tau_i}, \qquad 0\le k_0<k_1\le N. \]
这里 \(N_i\) 不计区间起点的初始模式,\(T_i\) 是区间内模式 \(i\) 的更新步数。与 Lab 11 相同,检查覆盖所有半开子区间,不能只检查完整的 120 步序列。
模式每 \(20\) 步切换一次,异步工况的控制器延迟为 \(d=2\) 步。选择这些参数是为了得到 清晰、可检查的教学算例,不代表对其他系统的通用参数建议。
与后续理论学习的联系
这个项目为后续阅读可靠控制研究资料提供两类准备。第一类是提出问题、界定研究范围并组织 研究路线;第二类是读懂 Delta 算子脉冲切换系统、执行器故障、异步控制和可靠镇定中的基本 符号与数值算例。这里按学习任务组织内容,所需定义和算例均在讲义中给出。
对应关系如下:
| 理论部分 | 本项目中的准备 |
|---|---|
| 研究背景与问题定义 | 研究问题、已有机制、当前范围和后续方向 |
| 可靠镇定理论基础 | Delta 模型、切换脉冲、执行器故障、异步控制和 Lyapunov/LMI 语言 |
| 系统描述与符号 | Delta 状态方程、切换信号、脉冲映射、故障矩阵 |
| 假设与定义 | 固定采样周期、模式规则、控制器延迟和工况边界 |
| 稳定化定理 | 只阅读条件和变量含义,不在本项目证明 |
| 数值算例 | 参数集中、工况比较、Lyapunov 指标、驻留区间、图表和环境记录 |
更进一步的时滞与 H∞ 性能问题、状态观测器问题分别适合作为后续专题。本项目只在 paper-notes.md 中标出它们与当前模型相比新增了什么,不实现这些扩展。
公式到代码
职责分配如下:
run_all.m
├─ modelParameters.m 定义唯一参数来源
├─ simulateCase.m 执行统一状态更新
├─ analyzeResults.m 生成比较指标
├─ countModeDwells.m 复用 Lab 11 的驻留区间函数
├─ checkMdadt.m 复用 Lab 11 的 MDADT 子区间检查
└─ makeFigures.m 生成 PDF 与 PNG
run_all.m 是唯一入口。四种工况都调用同一个 simulateCase,只改变配置:
| 工况 | 控制 | 延迟 | 执行器效率 |
|---|---|---|---|
| open-loop | 无 | 无 | 无控制输入 |
| matched-healthy | 有 | 0 | I |
| asynchronous-healthy | 有 | 2 | I |
| asynchronous-fault | 有 | 2 | diag(0.7,0.5) |
MATLAB 循环索引 k 对应数学更新时刻 \(n=k-1\):x(:,k) 保存 \(\boldsymbol{x}(n^-)\),xTilde(:,k) 保存 \(\boldsymbol{z}(n)=\boldsymbol{x}(n^+)\),modeSequence(k) 保存 \(\sigma(n)\)。 仿真循环严格执行:模式切换时先应用 \(M\),再按延迟确定控制器模式,计算 \(\boldsymbol{u}\) 和 \(\Omega\boldsymbol{u}\),最后进行后跳变流动。保存 x、xTilde、 系统模式、控制器模式和输入,便于追踪每一步。
analyzeResults(results, P) 对四个工况使用同一个 \(P\),在原有状态范数和不匹配次数之外, 记录 initialV、finalV、maximumV 和 positiveDeltaVCount。这些字段描述有限轨迹,不把 \(V(k)\) 的数值变化升级为稳定性证明。countModeDwells 对共同的模式序列只计算一次; checkMdadt 用两组参数检查所有半开子区间,并写入 mdadt-check.csv。
MATLAB 实验
- 阅读全部 Starter 文件,在
prompts.md记录让 OpenCode 解释代码的第一次提示词。 - 从
labs/lab11/复制你已经完成并检查过的countModeDwells.m和checkMdadt.m,不要让 OpenCode 重新生成替代版本。 - 完成缺失的仿真、指标和绘图逻辑,不改变固定参数。
- 从 MATLAB 的空工作区运行
run_all.m。 - 生成
metrics.csv,包含统一的状态范数、模式不匹配和 Lyapunov 数值指标。 - 生成
dwell-summary.csv,人工核对前两个驻留区间和最后一个区间。 - 用
N0=[1,1]、tau=[20,20]验证所有子区间通过,再用N0=[1,1]、tau=[25,25]验证全区间通过但至少一个子区间失败,保存mdadt-check.csv。 - 生成三张 PDF 矢量图,并在
figures/preview/生成 300 DPI PNG 预览。 - 把 MATLAB 版本、操作系统和运行时间写入
environment.txt。 - 再次运行入口脚本,确认旧输出会被一致地更新而不是依赖人工编辑。
图像使用明确的轴标签、图例和一致颜色。exportgraphics(...,"ContentType","vector") 用于 适合技术报告排版的 PDF,exportgraphics(...,"Resolution",300) 用于 PNG 预览。不要用 屏幕截图代替导出的图。
数学验证
验证分为三层:
1. 实现验证
- 数组尺寸与 120 步设置一致。
- 首次切换时的脉冲状态能够手算复核。
controllerDelay=0时系统模式与控制器模式完全一致。Ω=I时命令输入与实际输入相同。P对称且全部特征值为正,四个工况的initialV由同一初值给出相同结果。positiveDeltaVCount必须来自diff(V),不能根据图像人工填写。dwell-summary.csv的各区间长度之和等于 120。- MDADT 的
expected-pass参数集对所有子区间通过;full-only-trap的全区间判定通过,但allIntervalsPass至少有一项为假。
2. 退化验证
- 禁用控制后得到开环工况。
- 把延迟从 2 改为 0 后回到同步控制。
- 把故障矩阵改为
I后回到异步健康工况。 - 把脉冲矩阵改为
I后回到无脉冲模型。
3. 结果合理性
参考实现应呈现以下数量级,而不是要求逐位相等:
| 工况 | 末端状态范数的参考数量级 |
|---|---|
| 开环 | 约 4.5e2 |
| 同步健康 | 约 4.3e-4 |
| 异步健康 | 约 6.6e-4 |
| 异步故障 | 约 3.5e-1 |
若结果相差多个数量级,先检查事件顺序、控制器模式索引和 \(\Omega\) 的位置。参考数量级用于发现实现错误,不是要求人为调整输出。
最重要的结论边界是:数值仿真不能证明稳定性。它只能展示这组参数、初值和切换序列下的有限轨迹。一般稳定性结论仍需完整假设、Lyapunov 条件和严格证明。
结果与记录
README
README.md 包含:研究问题、模型、参数来源、文件职责、运行环境、复现步骤、输出清单、主要观察和限制。所有路径使用相对路径,不写本机用户名或绝对路径。
paper-notes
paper-notes.md 按未来论文写作结构整理:
- 引言中要回答的问题与未实现扩展。
- 系统描述中的符号表、维数和操作顺序。
- 假设、定义、引理和定理分别承担什么作用。
- 数值算例如何报告参数、工况、指标和图注。
- 哪些信息属于理论,哪些属于仿真,哪些仍未知。
当前项目省略范数有界不确定性、非线性脉冲项、完整 LMI 求解、时滞、H∞ 性能和观测器。省略项应明确记录,不能让读者误以为已被程序覆盖。
图表与环境
metrics.csv 是工况与 Lyapunov 数值比较的来源;dwell-summary.csv 记录切换序列结构; mdadt-check.csv 记录逐模式 MDADT 的全区间与所有子区间判定;PDF 适合技术报告和后续 论文排版;PNG 用于快速预览;environment.txt 记录复现环境。正文中的任何具体数值都应 能追溯到表格,而不是人工从图上估读。
OpenCode 审计
复用 Lab 4 的工作流。输入 /models,确认当前模型是 DeepSeek V4 Pro,再按 Tab 进入 Plan 模式。先在 prompts.md 保存提示词和取舍记录:
请审查 final-project 的完整研究流程。
模型是二维 Delta 算子切换脉冲系统,四个工况必须共用同一仿真函数。
请按以下顺序工作:
1. 把每个公式对应到 modelParameters.m 和 simulateCase.m 的变量;
2. 检查数学时刻 n=k-1 的索引对应,以及脉冲、控制器延迟、执行器故障和后跳变流动的执行顺序;
3. 检查 run_all.m 是否能从空工作区生成 metrics.csv、dwell-summary.csv、mdadt-check.csv、environment.txt、PDF 和 PNG;
4. 检查 analyzeResults.m 是否对四个工况使用相同的 P 和指标定义;
5. 检查 countModeDwells.m 和 checkMdadt.m 是否确实来自 Lab 11,且 MDADT 检查覆盖所有半开子区间;
6. 检查 README.md 与 paper-notes.md 是否明确说明 Lyapunov 数值和仿真不能证明稳定性;
7. 不要添加 Simulink、Robust Control Toolbox 或 Optimization Toolbox。
先报告发现和依据,得到确认后再修改文件。
至少记录一项拒绝或修改过的建议。例如,若 OpenCode 建议删去开环发散工况以改善图像, 应拒绝,因为开环是解释控制效果的必要对照。确认审计计划后按 Tab 进入 Build 模式。 修改完成后,在第二个 PowerShell 终端运行 git status 和 git diff -- final-project, 核对实际改动并逐项重新运行验证。
完成标准
run_all.m从空工作区生成约定的全部派生文件。- 四个工况只通过配置改变,共用参数、仿真和指标定义。
- 指标数量级、退化测试和事件手算相互一致。
metrics.csv包含四个 Lyapunov 数值字段,dwell-summary.csv覆盖全部 120 个更新时刻,mdadt-check.csv能暴露只检查全区间的错误。countModeDwells.m和checkMdadt.m是从 Lab 11 复制并复查的成果,不是大作业中的重复实现。- README、研究笔记、图表与代码中的模型描述没有冲突。
- 结论明确限定在数值算例范围内,并指出后续理论扩展。