实验 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;
必须分别保存 plantMode、controllerMode、uCommand 和 uFault。否则图像出现异常时,很难判断来自模式延迟还是执行器效率。
MATLAB 实验
使用相同初值、模式序列、采样周期和脉冲矩阵比较:
| 工况 | controllerDelay |
Ω |
|---|---|---|
| 开环 | 不使用控制器 | 零控制输入 |
| 同步健康 | 0 | I |
| 异步健康 | 2 | I |
| 异步故障 | 2 | diag(0.7,0.5) |
- 先把
controllerDelay=0、Ω=I,手算第一次更新。 - 设置两步延迟,在图中标出系统模式与控制器模式不一致的区间。
- 加入部分故障,比较命令控制量和实际控制量。
- 对每个工况计算末端状态范数、最大状态范数和不匹配步数。
- 写入
case-metrics.csv,并绘制状态范数比较图。 - 把异步故障工况保存为
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、有效闭环矩阵、δx和x(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 status 和 git diff -- labs\lab10,再重新比较四个工况。
完成标准
- 四种工况由同一个
simulateControlledSystem.m生成。 - 退化测试和首步手算均通过。
- 指标表能够区分同步、异步和部分故障的影响。
analysis-input.mat可由主脚本重新生成,并包含 Lab 11 约定的全部字段。