返回课程总览

实验 10 · 可靠控制

可靠反馈、执行器故障与异步切换

加入状态反馈、执行器效率矩阵和控制器切换延迟,比较多种闭环工况。

完整讲义

Lab 10:可靠反馈、执行器故障与异步切换

本实验保留 Lab 9 的模式序列、脉冲顺序和状态更新,在同一个循环中加入控制输入。你将比较 控制器模式与系统模式同步或不同步时的状态,并用执行器效率矩阵描述部分故障。完成后还要 保存一条定义明确的轨迹,供 Lab 11 直接分析。

开始前复用 Lab 4 的 Git 检查点流程:用 git status 确认工作区干净;四个工况和 analysis-input.mat 全部验证后,按相同方法提交 Lab 10 检查点。

学习目标

  • 把状态反馈 \(\boldsymbol{u}=K\boldsymbol{x}\) 接入 Delta 算子更新。
  • 用对角矩阵 \(\Omega\) 表示不同通道的执行器效率。
  • 明确系统模式和控制器模式是两个不同序列。
  • 用统一指标比较四种闭环工况。

目录结构

labs/lab10/
  reliable_feedback_demo.m
  simulateControlledSystem.m
  results/
    case-metrics.csv
    analysis-input.mat
  figures/
    feedback-comparison.png
  notes.md
小知识:执行器故障不一定等于完全失效

执行器可能完全失效,也可能只剩一部分效率。对角矩阵 \(\Omega=\operatorname{diag}(\omega_1,\omega_2)\) 可以分别描述两个通道的有效比例;\(\omega_i=1\) 表示正常,\(\omega_i=0\) 表示该通道完全失效,介于两者之间表示部分失效。

理论问题

开环、闭环与状态反馈

开环仿真不根据当前状态生成控制输入;本实验把它实现为零控制输入。闭环仿真则测量或取得 当前状态,并通过状态反馈 \(\boldsymbol{u}=K_j\boldsymbol{x}\) 让控制输入随状态变化。 这里 \(i=\sigma(k)\) 表示系统模式,\(j=\sigma_c(k)\) 表示控制器模式。

在固定的 \(i\)、\(j\) 和执行器效率 \(\Omega\) 下,反馈后的 Delta 流可以合并为:

\[ \begin{aligned} \delta\boldsymbol{x} &=A_i\boldsymbol{x}+B_i\Omega K_j\boldsymbol{x}\\ &=A_{\mathrm{cl}}(i,j,\Omega)\boldsymbol{x},\\ A_{\mathrm{cl}}(i,j,\Omega)&=A_i+B_i\Omega K_j. \end{aligned} \]

于是一次普通更新使用 \(I+T A_{\mathrm{cl}}(i,j,\Omega)\)。有些教材把状态反馈写成 \(\boldsymbol{u}=-K\boldsymbol{x}\);本实验明确写成 \(\boldsymbol{u}=K_j\boldsymbol{x}\), 反馈符号已经包含在给定的 K 矩阵中,不能再额外添加负号。

情形 模型含义
开环 禁用控制,等价退化检查中的 \(K=0\)
同步健康 \(i=j\) 且 \(\Omega=I\)
异步健康 延迟区间内可能有 \(i\ne j\),但 \(\Omega=I\)
异步故障 延迟区间内可能有 \(i\ne j\),并且 \(\Omega\ne I\)

这张表把三个因素分开:系统本身使用哪个 \(A_i,B_i\),控制器选择哪个 \(K_j\),执行器又 把命令输入保留了多少。只有这样,比较结果时才能知道差异来自哪里。

脉冲、故障与异步模式

继续采用 Lab 9 的事件记号:\(\boldsymbol{x}(k^-)\) 是脉冲前状态, \(\boldsymbol{x}(k^+)=\widetilde{\boldsymbol{x}}(k)\) 是脉冲后状态,并定义 \(\boldsymbol{z}(k):=\boldsymbol{x}(k^+)\)。受控的后跳变流动写为:

\[ \begin{aligned} \frac{\boldsymbol{x}((k+1)^-)-\boldsymbol{z}(k)}{T} &=A_{\sigma(k)}\boldsymbol{z}(k) +B_{\sigma(k)}\boldsymbol{u}_f(k),\\ \boldsymbol{u}_f(k)&=\Omega\boldsymbol{u}(k),\\ \boldsymbol{u}(k)&=K_{\sigma_c(k)}\boldsymbol{z}(k). \end{aligned} \]

若该时刻有脉冲,则 \(\boldsymbol{x}(k^+)=M_{\sigma(k)}\boldsymbol{x}(k^-)\);否则 \(\boldsymbol{x}(k^+)=\boldsymbol{x}(k^-)\)。因此控制量和这一采样步的状态流都从脉冲后 状态开始。换言之,应先得到 \(\boldsymbol{x}(k^+)\),再用 \(A_{\mathrm{cl}}(i,j,\Omega)\) 计算 \(\boldsymbol{x}((k+1)^-)\)。这仍是 Lab 9 定义的 jump-flow 组合;只有普通时刻左右状态相同时,它才退化为 Lab 8 的普通 Delta 更新。

\(\sigma(k)\) 是系统当前模式,\(\sigma_c(k)\) 是控制器所使用的模式。同步时二者相同;异步时控制器在切换后延迟若干步才更新。

本实验用一个整数 controllerDelay 建立简单延迟:

\[ \sigma_c(k)=\sigma\!\left(\max(0,k-d)\right), \qquad d=\texttt{controllerDelay}. \]

这不是对所有异步控制理论的完整刻画,但足以让程序明确区分“被控对象已经切换”和“控制器尚未切换”。

公式到代码

在 Lab 9 的脉冲处理之后加入:

MATLAB 循环索引 k 对应数学更新时刻 \(n=k-1\)。因此 controllerIndex = max(1, k - controllerDelay) 正好实现 \(\sigma_c(n)=\sigma(\max(0,n-d))\),而不是把两套索引直接视为相同。

controllerIndex = max(1, k - controllerDelay);
controllerMode = modeSequence(controllerIndex);
uCommand = K{controllerMode} * xTilde;
uFault = Omega * uCommand;
deltaX = A{plantMode} * xTilde + B{plantMode} * uFault;
xNext = xTilde + T * deltaX;

必须分别保存 plantModecontrollerModeuCommanduFault。否则图像出现异常时,很难判断来自模式延迟还是执行器效率。

MATLAB 实验

使用相同初值、模式序列、采样周期和脉冲矩阵比较:

工况 controllerDelay Ω
开环 不使用控制器 零控制输入
同步健康 0 I
异步健康 2 I
异步故障 2 diag(0.7,0.5)
  1. 先把 controllerDelay=0Ω=I,手算第一次更新。
  2. 设置两步延迟,在图中标出系统模式与控制器模式不一致的区间。
  3. 加入部分故障,比较命令控制量和实际控制量。
  4. 对每个工况计算末端状态范数、最大状态范数和不匹配步数。
  5. 写入 case-metrics.csv,并绘制状态范数比较图。
  6. 把异步故障工况保存为 analysis-input.mat,作为 Lab 11 的唯一轨迹输入。

只改变表格中指定的因素。若每个工况同时更改增益、初值和模式序列,比较就失去解释性。

交给 Lab 11 的数据

analysis-input.mat 只保存一个名为 analysisInput 的 struct,字段固定为:

analysisInput.x
analysisInput.plantModes
analysisInput.controllerModes
analysisInput.impulseMask
analysisInput.T
analysisInput.caseName

其中 x 包含 \(\boldsymbol{x}(0)\) 到 \(\boldsymbol{x}(N)\),模式和脉冲字段包含 \(N\) 个 更新时刻。选用异步故障工况,是因为它同时保留切换、脉冲、控制器延迟和执行器故障,适合 下一次实验检查 Lyapunov 历史和驻留区间。不要把图像或人工复制的数值作为 Lab 11 输入。

数学验证

按由简到繁的方式检查:

  • K=0,受控函数的结果应退化为同一参数下的开环轨迹。用矩阵范数断言两条完整轨迹一致,而不是只比较末端值;这对应 Lab 9 的无控制更新形式。
  • Ω=I,必须满足 uFault=uCommand
  • controllerDelay=0,必须满足每一步 plantMode=controllerMode
  • 手算同步健康工况第一步的 u、有效闭环矩阵、δxx(1),并确认没有重复添加反馈负号。
  • 检查四个工况使用完全相同的模式序列和脉冲时刻。

末端范数较小可以描述该有限实验中的收敛现象,但不能替代对所有允许切换信号、故障和初值的稳定性证明。

结果与记录

指标表负责精确比较,状态范数图负责展示趋势。文字中写出控制器延迟和 \(\Omega\) 的具体值,不使用“有少量故障”这类无法复现的描述。

notes.md 至少包含:控制律、故障模型、异步规则、比较指标和结论边界。结果段可以陈述“在本算例中”,避免把一个轨迹推广成一般定理。

OpenCode 审计

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

请检查 labs/lab10 的可靠反馈仿真。

请分别追踪系统模式 plantMode、控制器模式 controllerMode、命令输入 uCommand
和故障后输入 uFault,不要把它们合并成一个变量。

检查以下内容:
1. controllerDelay=0、Omega=I 时是否回到同步健康控制;
2. 延迟两步的索引是否在 MATLAB 的 1 起始索引下正确;
3. u=K_j*x 的符号是否与给定 K 一致,有没有错误地再加负号;
4. A_cl(i,j,Omega)=A_i+B_i*Omega*K_j 是否与逐步计算一致;
5. MATLAB 索引 k 与数学时刻 n=k-1 是否对应,且脉冲前状态 x(n-)、脉冲后状态
   z(n)=x(n+)、控制输入和后跳变流动的顺序是否与讲义一致;
6. 四个工况是否只改变预定因素;
7. analysis-input.mat 是否只保存异步故障工况和约定字段;
8. notes.md 的结论是否超过数值实验能够支持的范围。

把 OpenCode 给出的每项判断对应到一个公式、断言或表格字段。没有检查依据的笼统评价不应 直接采纳。接受计划后按 Tab 进入 Build 模式。修改完成后,在第二个 PowerShell 终端 运行 git statusgit diff -- labs\lab10,再重新比较四个工况。

完成标准

  • 四种工况由同一个 simulateControlledSystem.m 生成。
  • 退化测试和首步手算均通过。
  • 指标表能够区分同步、异步和部分故障的影响。
  • analysis-input.mat 可由主脚本重新生成,并包含 Lab 11 约定的全部字段。