返回课程总览

实验 12 · 综合项目

可复现的论文式 MATLAB 项目

组织可重复运行的 Delta 算子切换系统实验,生成指标、MDADT 检查、图像和研究记录。

完整讲义

Lab 12:可复现的论文式 MATLAB 项目

本项目把 Lab 7-11 的状态迭代、Delta 算子、切换脉冲、可靠反馈和稳定性数值检查合并为一个 小型研究工作流。仿真循环从 Lab 10 的受控模型整理而来,Lyapunov 数值和驻留区间分析直接复用 Lab 11 的方法。目标不是完成一项包含全部理论证明的研究,而是练习以后编写实际论文时如何用 MATLAB 组织模型、实验、验证、图表和限制说明。

开始前复用 Lab 4 的 Git 检查点流程:用 git status 确认工作区干净;完整项目从空工作区 重复运行并通过全部检查后,提交最终检查点。

学习目标

  • 用单一入口脚本重复生成全部结果。
  • 比较开环、同步控制、异步控制和部分执行器故障。
  • 让模型参数、仿真、分析和绘图各自承担清晰职责。
  • 生成可追溯的指标表、矢量图、预览图和环境信息。
  • 把理论背景、数值证据和结论边界写进研究记录。

目录结构

Starter 只提供本项目新增的源文件和写作模板。countModeDwells.mcheckMdadt.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}\),最后进行后跳变流动。保存 xxTilde、 系统模式、控制器模式和输入,便于追踪每一步。

analyzeResults(results, P) 对四个工况使用同一个 \(P\),在原有状态范数和不匹配次数之外, 记录 initialVfinalVmaximumVpositiveDeltaVCount。这些字段描述有限轨迹,不把 \(V(k)\) 的数值变化升级为稳定性证明。countModeDwells 对共同的模式序列只计算一次; checkMdadt 用两组参数检查所有半开子区间,并写入 mdadt-check.csv

MATLAB 实验

  1. 阅读全部 Starter 文件,在 prompts.md 记录让 OpenCode 解释代码的第一次提示词。
  2. labs/lab11/ 复制你已经完成并检查过的 countModeDwells.mcheckMdadt.m,不要让 OpenCode 重新生成替代版本。
  3. 完成缺失的仿真、指标和绘图逻辑,不改变固定参数。
  4. 从 MATLAB 的空工作区运行 run_all.m
  5. 生成 metrics.csv,包含统一的状态范数、模式不匹配和 Lyapunov 数值指标。
  6. 生成 dwell-summary.csv,人工核对前两个驻留区间和最后一个区间。
  7. N0=[1,1]tau=[20,20] 验证所有子区间通过,再用 N0=[1,1]tau=[25,25] 验证全区间通过但至少一个子区间失败,保存 mdadt-check.csv
  8. 生成三张 PDF 矢量图,并在 figures/preview/ 生成 300 DPI PNG 预览。
  9. 把 MATLAB 版本、操作系统和运行时间写入 environment.txt
  10. 再次运行入口脚本,确认旧输出会被一致地更新而不是依赖人工编辑。

图像使用明确的轴标签、图例和一致颜色。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 按未来论文写作结构整理:

  1. 引言中要回答的问题与未实现扩展。
  2. 系统描述中的符号表、维数和操作顺序。
  3. 假设、定义、引理和定理分别承担什么作用。
  4. 数值算例如何报告参数、工况、指标和图注。
  5. 哪些信息属于理论,哪些属于仿真,哪些仍未知。

当前项目省略范数有界不确定性、非线性脉冲项、完整 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 statusgit diff -- final-project, 核对实际改动并逐项重新运行验证。

完成标准

  • run_all.m 从空工作区生成约定的全部派生文件。
  • 四个工况只通过配置改变,共用参数、仿真和指标定义。
  • 指标数量级、退化测试和事件手算相互一致。
  • metrics.csv 包含四个 Lyapunov 数值字段,dwell-summary.csv 覆盖全部 120 个更新时刻,mdadt-check.csv 能暴露只检查全区间的错误。
  • countModeDwells.mcheckMdadt.m 是从 Lab 11 复制并复查的成果,不是大作业中的重复实现。
  • README、研究笔记、图表与代码中的模型描述没有冲突。
  • 结论明确限定在数值算例范围内,并指出后续理论扩展。