第四部分:最优控制
第十章:线性二次型调节器(LQR)
10.1 最优控制问题
10.1.1 问题形式化
给定线性系统:
x˙=Ax+Bu\\dot{x} = Ax + Bux˙=Ax+Bu
寻找控制律 u(t)u(t)u(t),使得性能指标最小化:
J=∫0∞[xT(t)Qx(t)+uT(t)Ru(t)]dt+xT(Tf)Sx(Tf)J = \\int_0^{\\infty} [x^T(t)Qx(t) + u^T(t)Ru(t)] dt + x^T(T_f)Sx(T_f)J=∫0∞[xT(t)Qx(t)+uT(t)Ru(t)]dt+xT(Tf)Sx(Tf)
其中:
- Q≥0Q \\geq 0Q≥0:状态权重矩阵(惩罚状态偏差)
- R>0R > 0R>0:控制权重矩阵(惩罚控制能量)
- S≥0S \\geq 0S≥0:终端状态权重
- TfT_fTf:终端时间(Tf=∞T_f = \\inftyTf=∞ 为无限时间问题)
10.1.2 物理意义
性能指标 JJJ 是两部分的权衡:
- xTQxx^T Q xxTQx:惩罚状态偏离零(调节性能)
- uTRuu^T R uuTRu:惩罚控制能量(执行成本)
QQQ 和 RRR 的选择反映了设计者对"调节精度"和"控制能量"的偏好。
10.2 LQR 的解
10.2.1 有限时间 LQR
定理 10.1:有限时间 LQR 问题的最优控制律为状态反馈:
u∗(t)=−K(t)x(t)u^*(t) = -K(t)x(t)u∗(t)=−K(t)x(t)
其中反馈增益为:
K(t)=R−1BTP(t)K(t) = R^{-1}B^TP(t)K(t)=R−1BTP(t)
P(t)P(t)P(t) 是以下微分 Riccati 方程的解:
−P˙=ATP+PA−PBR−1BTP+Q,P(Tf)=S-\\dot{P} = A^TP + PA – PBR^{-1}B^TP + Q, \\quad P(T_f) = S−P˙=ATP+PA−PBR−1BTP+Q,P(Tf)=S
10.2.2 无限时间 LQR
定理 10.2:当 Tf→∞T_f \\to \\inftyTf→∞ 且系统 (A,B)(A, B)(A,B) 能控、(A,Q1/2)(A, Q^{1/2})(A,Q1/2) 能观时,P(t)P(t)P(t) 收敛到常数矩阵 PPP,它是以下**代数 Riccati 方程(ARE)**的唯一正定解:
ATP+PA−PBR−1BTP+Q=0A^TP + PA – PBR^{-1}B^TP + Q = 0ATP+PA−PBR−1BTP+Q=0
最优控制律为时不变的状态反馈:
u∗(t)=−Kx(t),K=R−1BTPu^*(t) = -Kx(t), \\quad K = R^{-1}B^TPu∗(t)=−Kx(t),K=R−1BTP
10.2.3 LQR 的稳定性
定理 10.3:LQR 闭环系统 x˙=(A−BK)x\\dot{x} = (A – BK)xx˙=(A−BK)x 是渐近稳定的。
证明:取 Lyapunov 函数 V(x)=xTPxV(x) = x^TPxV(x)=xTPx(P>0P > 0P>0),则:
V˙=xT[(A−BK)TP+P(A−BK)]x=−xT(Q+KTRK)x<0\\dot{V} = x^T[(A-BK)^TP + P(A-BK)]x = -x^T(Q + K^TRK)x < 0V˙=xT[(A−BK)TP+P(A−BK)]x=−xT(Q+KTRK)x<0
由 Lyapunov 定理,闭环系统渐近稳定。□\\square□
10.3 LQR 的性质
10.3.1 最优性条件
LQR 的最优性由 Hamilton-Jacobi-Bellman (HJB) 方程保证:
minu[xTQx+uTRu+∂V∂x(Ax+Bu)]=0\\min_u \\left[ x^TQx + u^TRu + \\frac{\\partial V}{\\partial x}(Ax + Bu) \\right] = 0umin[xTQx+uTRu+∂x∂V(Ax+Bu)]=0
代入 V(x)=xTPxV(x) = x^TPxV(x)=xTPx,可以推导出 ARE。
10.3.2 频域解释
定理 10.4(LQR 的回路传递恢复):LQR 闭环系统在每个输入端口的开环传递函数满足:
∣1+K(jωI−A)−1B∣≥1∀ω|1 + K(j\\omega I – A)^{-1}B| \\geq 1 \\quad \\forall \\omega∣1+K(jωI−A)−1B∣≥1∀ω
这意味着 LQR 保证了至少 60° 的相位裕度和无穷大的增益裕度——LQR 具有内在的鲁棒性。
10.3.3 QQQ 和 RRR 的选择
- Q=IQ = IQ=I:等权惩罚所有状态
- Q=CTCQ = C^TCQ=CTC:惩罚输出(物理上可测量的量)
- R=ρIR = \\rho IR=ρI:ρ\\rhoρ 大意味着更注重节省控制能量,ρ\\rhoρ 小意味着更注重调节精度
Bryson 法则:令 Qii=1/xi,max2Q_{ii} = 1/x_{i,\\max}^2Qii=1/xi,max2,Rjj=1/uj,max2R_{jj} = 1/u_{j,\\max}^2Rjj=1/uj,max2,其中 xi,maxx_{i,\\max}xi,max 和 uj,maxu_{j,\\max}uj,max 是可接受的最大值。
10.4 LQR 的计算
10.4.1 直接求解 ARE
对于小规模系统,可以直接求解 ARE:
ATP+PA−PBR−1BTP+Q=0A^TP + PA – PBR^{-1}B^TP + Q = 0ATP+PA−PBR−1BTP+Q=0
方法:
- Schur 分解法
- 矩阵符号函数法
- 迭代法
10.4.2 Python 实现
使用 scipy.linalg.solve_continuous_are 可以直接求解。
第十一章:线性二次高斯控制(LQG)
11.1 从 LQR 到 LQG
LQR 假设所有状态都可直接测量,但实际中并非如此。LQG(Linear Quadratic Gaussian) 将 LQR 与 Kalman 滤波结合:
11.1.1 问题设置
x˙=Ax+Bu+w,w∼N(0,Qn)\\dot{x} = Ax + Bu + w, \\quad w \\sim \\mathcal{N}(0, Q_n)x˙=Ax+Bu+w,w∼N(0,Qn)
y=Cx+v,v∼N(0,Rn)y = Cx + v, \\quad v \\sim \\mathcal{N}(0, R_n)y=Cx+v,v∼N(0,Rn)
最小化:
J=limT→∞1TE[∫0T(xTQx+uTRu)dt]J = \\lim_{T \\to \\infty} \\frac{1}{T} \\mathbb{E}\\left[\\int_0^T (x^TQx + u^TRu) dt\\right]J=T→∞limT1E[∫0T(xTQx+uTRu)dt]
11.2 分离原理
定理 11.1(LQG 分离原理):LQG 的最优控制律为:
u∗=−Kx^u^* = -K\\hat{x}u∗=−Kx^
其中 KKK 是 LQR 最优增益,x^\\hat{x}x^ 是 Kalman 滤波器的状态估计。
控制器设计和估计器设计完全解耦——这就是分离原理。
11.3 LQG 的性质
11.3.1 确定等价原理
LQG 的最优控制律与确定性 LQR 的形式相同,只是用估计状态代替真实状态——这称为确定等价原理(Certainty Equivalence)。
11.3.2 鲁棒性问题
虽然 LQG 在数学上是最优的,但它的鲁棒性不如 LQR。这是因为 Kalman 滤波器的引入可能降低系统的稳定裕度。
这促使了 H∞H_\\inftyH∞ 控制理论的发展——在设计时直接考虑模型不确定性。
第十二章:模型预测控制(MPC)
12.1 MPC 的基本思想
12.1.1 滚动优化
模型预测控制(Model Predictive Control, MPC) 的核心思想是:
在每个时刻,基于当前状态和系统模型,求解一个有限时域的最优控制问题,只执行第一步控制,然后在下一时刻重复这个过程。
这就是"滚动优化"(receding horizon)。
12.1.2 MPC 的数学形式
在时刻 kkk,求解:
minuk,…,uk+N−1∑i=0N−1[xk+iTQxk+i+uk+iTRuk+i]+xk+NTPxk+N\\min_{u_k, \\dots, u_{k+N-1}} \\sum_{i=0}^{N-1} [x_{k+i}^T Q x_{k+i} + u_{k+i}^T R u_{k+i}] + x_{k+N}^T P x_{k+N}uk,…,uk+N−1mini=0∑N−1[xk+iTQxk+i+uk+iTRuk+i]+xk+NTPxk+N
约束条件:
xk+i+1=Axk+i+Buk+ix_{k+i+1} = Ax_{k+i} + Bu_{k+i}xk+i+1=Axk+i+Buk+i
xmin≤xk+i≤xmaxx_{\\min} \\leq x_{k+i} \\leq x_{\\max}xmin≤xk+i≤xmax
umin≤uk+i≤umaxu_{\\min} \\leq u_{k+i} \\leq u_{\\max}umin≤uk+i≤umax
只执行 uk∗u_k^*uk∗,在 k+1k+1k+1 时刻重新求解。
12.2 MPC 的优势
12.2.1 处理约束
MPC 是唯一能系统地处理约束的控制方法。这在实际工程中极为重要:
- 执行器有物理限制(阀门开度、电机转速)
- 状态有安全限制(温度不能过高、位置不能超出范围)
12.2.2 多变量处理
MPC 自然地处理多输入多输出(MIMO)系统,不需要解耦。
12.2.3 前馈能力
如果可以预测未来的参考信号或干扰,MPC 可以提前做出反应。
12.3 MPC 的计算
12.3.1 无约束 MPC
无约束 MPC 可以解析求解,等价于一个时变状态反馈律。
12.3.2 有约束 MPC
有约束 MPC 需要求解二次规划(QP):
minz12zTHz+fTz\\min_z \\frac{1}{2}z^THz + f^Tzzmin21zTHz+fTz
s.t.Gz≤b\\text{s.t.} \\quad Gz \\leq bs.t.Gz≤b
现代 QP 求解器可以在毫秒级时间内求解中等规模的问题。
12.3.3 显式 MPC
对于小规模系统,可以离线计算所有可能状态区域的最优控制律,得到分段仿射(PWA)的显式解。
12.4 MPC 与最优控制的关系
MPC 可以看作有限时域的 LQR 加约束。当预测时域 N→∞N \\to \\inftyN→∞ 且无约束时,MPC 收敛到 LQR。
MPC 的"滚动优化"思想也与强化学习中的"模型预测"方法有深刻的联系。
第五部分:与机器学习的联系
第十三章:控制论视角下的序列建模
13.1 序列建模作为控制问题
从控制论的角度,序列建模可以被重新表述为:
给定输入序列 x0,x1,…,xTx_0, x_1, \\dots, x_Tx0,x1,…,xT,设计一个动态系统(控制器),使得输出 yty_tyt 尽可能接近期望的目标 yt∗y_t^*yt∗。
这个视角揭示了序列建模与控制论之间的深层联系:
| 状态 xtx_txt | 隐状态 hth_tht |
| 输入 utu_tut | 输入 token xtx_txt |
| 输出 yty_tyt | 预测的下一个 token |
| 状态转移 AAA | 状态矩阵 Aˉ\\bar{A}Aˉ |
| 输入矩阵 BBB | 输入矩阵 Bˉ\\bar{B}Bˉ |
| 输出矩阵 CCC | 输出矩阵 Cˉ\\bar{C}Cˉ |
| 控制目标 | 最小化预测损失 |
13.2 SSM 的控制论解释
13.2.1 稳定性与记忆
SSM 的状态转移矩阵 Aˉ\\bar{A}Aˉ 的特征值决定了系统的"记忆"行为:
- ∣λˉ∣<1|\\bar{\\lambda}| < 1∣λˉ∣<1:模态衰减,信息随时间流失
- ∣λˉ∣≈1|\\bar{\\lambda}| \\approx 1∣λˉ∣≈1:模态持久,信息长期保持
- ∣λˉ∣>1|\\bar{\\lambda}| > 1∣λˉ∣>1:模态发散,系统不稳定
HiPPO 理论的本质是:选择最优的 AAA 矩阵,使得系统在"记住重要信息"和"忘掉无关信息"之间达到最优平衡。
这与控制论中的稳定性-性能权衡一脉相承:
- 太稳定(衰减太快):丢失长程信息
- 太不稳定(衰减太慢):无法区分新旧信息
13.2.2 能控性与表达能力
SSM 的能控性决定了模型能否将任意输入映射到任意隐状态:
- 如果 SSM 完全能控,它可以将输入信息编码到隐状态的任意方向
- 能控性矩阵的秩反映了模型可以影响的状态空间维度
定理 13.1:对于 SSM ht=Aˉht−1+Bˉxth_t = \\bar{A}h_{t-1} + \\bar{B}x_tht=Aˉht−1+Bˉxt,如果 (Aˉ,Bˉ)(\\bar{A}, \\bar{B})(Aˉ,Bˉ) 完全能控,则模型可以将任意长度为 nnn 的输入序列映射到 RN\\mathbb{R}^NRN 中的任意状态。
13.2.3 能观性与信息提取
SSM 的能观性决定了模型能否从输出中提取所有隐状态的信息:
- 如果 SSM 完全能观,输出 yt=Chty_t = Ch_tyt=Cht 包含了隐状态的全部信息
- 能观性矩阵的秩反映了可以从输出中恢复的状态空间维度
13.3 选择性机制的控制论解释
13.3.1 自适应控制的视角
Mamba 的选择性机制(输入依赖的 Δ\\DeltaΔ, BBB, CCC)可以理解为一种自适应控制:
- 系统参数根据输入内容实时调整
- 这使得模型能够根据上下文动态调整"记忆策略"
在控制论中,自适应控制器根据系统运行状况调整参数,以应对未知或时变的系统特性。Mamba 的选择性机制做的是同样的事情——根据输入内容调整"系统参数"(Δ\\DeltaΔ, BBB, CCC),以最优地压缩历史信息。
13.3.2 切换系统的视角
选择性 SSM 可以被理解为一个切换系统(switched system)——在每个时间步,系统在不同的"模式"之间切换:
ht=Aˉtht−1+Bˉtxth_t = \\bar{A}_t h_{t-1} + \\bar{B}_t x_tht=Aˉtht−1+Bˉtxt
其中 Aˉt\\bar{A}_tAˉt, Bˉt\\bar{B}_tBˉt 由输入 xtx_txt 决定。
切换系统的稳定性分析比 LTI 系统复杂得多——即使每个单独的模式都是稳定的,切换也可能导致不稳定。这解释了为什么选择性 SSM 需要精心设计(如 AAA 保持固定,只有 Δ\\DeltaΔ, BBB, CCC 变化)。
13.3.3 最优控制的视角
从最优控制的角度,选择性机制可以理解为在每个时刻求解一个"局部最优控制问题":
给定当前状态 ht−1h_{t-1}ht−1 和输入 xtx_txt,选择 Δt\\Delta_tΔt, BtB_tBt, CtC_tCt 使得输出 yty_tyt 最接近期望值。
这类似于 MPC 的滚动优化思想——在每个时刻做出局部最优决策。
13.4 Kalman 滤波器与 SSM 训练
13.4.1 EM 算法
SSM 的训练可以与 Kalman 滤波器的期望最大化(EM)算法类比:
- E 步(前向传播):给定当前参数,用 Kalman 滤波器计算状态的后验估计
- M 步(参数更新):给定状态估计,更新系统参数 (A,B,C)(A, B, C)(A,B,C) 以最大化似然
在深度 SSM 中,前向传播类似于 E 步(用当前参数计算隐状态),反向传播类似于 M 步(根据梯度更新参数)。
13.4.2 信息滤波器
Kalman 滤波器的对偶形式——信息滤波器——使用信息矩阵 Λ=P−1\\Lambda = P^{-1}Λ=P−1 和信息向量 η=Λx\\eta = \\Lambda xη=Λx:
Λk∣k=Λk∣k−1+CTR−1C\\Lambda_{k|k} = \\Lambda_{k|k-1} + C^TR^{-1}CΛk∣k=Λk∣k−1+CTR−1C
ηk∣k=ηk∣k−1+CTR−1yk\\eta_{k|k} = \\eta_{k|k-1} + C^TR^{-1}y_kηk∣k=ηk∣k−1+CTR−1yk
这与 Transformer 的注意力机制有相似之处——信息矩阵的更新类似于注意力权重的累积。
第十四章:自适应控制与在线学习
14.1 自适应控制的基本问题
14.1.1 问题设置
当被控对象的参数未知或时变时,需要控制器在线调整以适应变化:
x˙=A(θ)x+B(θ)u\\dot{x} = A(\\theta)x + B(\\theta)ux˙=A(θ)x+B(θ)u
其中 θ\\thetaθ 是未知参数。
14.1.2 自适应控制的方法
14.2 在线学习与自适应控制
14.2.1 在线凸优化
自适应控制可以被形式化为在线凸优化问题:
在每一轮 ttt:
目标:最小化遗憾(regret):
RT=∑t=1Tℓt(wt)−minw∑t=1Tℓt(w)R_T = \\sum_{t=1}^T \\ell_t(w_t) – \\min_w \\sum_{t=1}^T \\ell_t(w)RT=t=1∑Tℓt(wt)−wmint=1∑Tℓt(w)
在线梯度下降(OGD)实现了 O(T)O(\\sqrt{T})O(T) 的遗憾界。
14.2.2 SSM 的在线学习
SSM 的递推更新 ht=Aˉht−1+Bˉxth_t = \\bar{A}h_{t-1} + \\bar{B}x_tht=Aˉht−1+Bˉxt 可以被看作一种特殊的在线学习算法:
- 隐状态 hth_tht 是"模型参数"
- 输入 xtx_txt 是"数据"
- 状态转移 Aˉ\\bar{A}Aˉ 是"正则化"(防止参数变化太快)
- 输入矩阵 Bˉ\\bar{B}Bˉ 是"学习率"(控制新数据的影响)
选择性机制中的 Δt\\Delta_tΔt 控制了"学习率"的大小——大 Δ\\DeltaΔ 意味着快速学习(忘掉旧信息,关注新输入),小 Δ\\DeltaΔ 意味着保守学习(保持旧信息,忽略新输入)。
14.3 鲁棒自适应控制
14.3.1 参数不确定性的处理
实际系统中,参数估计总有误差。鲁棒自适应控制的目标是:
即使参数估计不完美,也要保证系统的稳定性和性能。
方法:
- σ-修正:在自适应律中加入泄漏项,防止参数漂移
- 死区(dead-zone):当误差很小时停止自适应
- 投影算法:将参数约束在已知的有界集合内
14.3.2 与 SSM 训练的联系
SSM 训练中的梯度下降可以被看作一种自适应控制:
- 参数 θ=(A,B,C,Δ)\\theta = (A, B, C, \\Delta)θ=(A,B,C,Δ) 是被控量
- 损失函数 L\\mathcal{L}L 是性能指标
- 梯度 ∇θL\\nabla_\\theta \\mathcal{L}∇θL 是控制信号
- 学习率 η\\etaη 是控制增益
训练的稳定性(不发散)对应于控制系统的稳定性。学习率调度对应于增益调度。
第十五章:强化学习与最优控制的统一
15.1 最优控制与强化学习的共同框架
15.1.1 MDP 框架
最优控制和强化学习都可以用**马尔可夫决策过程(MDP)**来统一描述:
MDP 由 (S,A,P,R,γ)(S, A, P, R, \\gamma)(S,A,P,R,γ) 定义:
- SSS:状态空间
- AAA:动作空间
- P(s′∣s,a)P(s'|s, a)P(s′∣s,a):状态转移概率
- R(s,a)R(s, a)R(s,a):奖励函数
- γ\\gammaγ:折扣因子
15.1.2 最优控制作为 MDP
确定性 LQR 可以写成 MDP 的形式:
- 状态 st=xts_t = x_tst=xt
- 动作 at=uta_t = u_tat=ut
- 转移 st+1=Ast+Bats_{t+1} = As_t + Ba_tst+1=Ast+Bat(确定性)
- 奖励 rt=−(xtTQxt+utTRut)r_t = -(x_t^TQx_t + u_t^TRu_t)rt=−(xtTQxt+utTRut)
- 折扣因子 γ=1\\gamma = 1γ=1(无限时域)或 γ<1\\gamma < 1γ<1
15.2 动态规划与 HJB 方程
15.2.1 值函数
定义值函数 V(x)V(x)V(x):从状态 xxx 出发,遵循最优策略所能获得的累积奖励。
Bellman 最优方程:
V(x)=maxa[R(x,a)+γE[V(x′)∣x,a]]V(x) = \\max_a [R(x, a) + \\gamma \\mathbb{E}[V(x')|x, a]]V(x)=amax[R(x,a)+γE[V(x′)∣x,a]]
15.2.2 HJB 方程
对于连续时间系统 x˙=f(x,u)\\dot{x} = f(x, u)x˙=f(x,u),HJB 方程为:
0=minu[r(x,u)+∇xV(x)⋅f(x,u)]0 = \\min_u [r(x, u) + \\nabla_x V(x) \\cdot f(x, u)]0=umin[r(x,u)+∇xV(x)⋅f(x,u)]
对于 LQR(f=Ax+Buf = Ax + Buf=Ax+Bu, r=xTQx+uTRur = x^TQx + u^TRur=xTQx+uTRu),解为 V(x)=xTPxV(x) = x^TPxV(x)=xTPx,推导出 ARE。
15.2.3 策略梯度
强化学习中的策略梯度方法:
∇θJ(θ)=E[∑t=0T∇θlogπθ(at∣st)⋅Aπ(st,at)]\\nabla_\\theta J(\\theta) = \\mathbb{E}\\left[\\sum_{t=0}^T \\nabla_\\theta \\log \\pi_\\theta(a_t|s_t) \\cdot A^{\\pi}(s_t, a_t)\\right]∇θJ(θ)=E[t=0∑T∇θlogπθ(at∣st)⋅Aπ(st,at)]
其中 AπA^{\\pi}Aπ 是优势函数。这与最优控制中的协态方程(costate equation)有深刻联系。
15.3 神经网络用于控制
15.3.1 神经网络作为函数逼近器
深度强化学习用神经网络逼近值函数或策略:
- 值函数逼近:Vθ(s)≈V∗(s)V_\\theta(s) \\approx V^*(s)Vθ(s)≈V∗(s)
- 策略逼近:πθ(a∣s)≈π∗(a∣s)\\pi_\\theta(a|s) \\approx \\pi^*(a|s)πθ(a∣s)≈π∗(a∣s)
15.3.2 神经 ODE 与控制
神经常微分方程(Neural ODE):
x˙=fθ(x,t)\\dot{x} = f_\\theta(x, t)x˙=fθ(x,t)
将神经网络作为连续时间动态系统,这直接连接了深度学习和控制论。训练 Neural ODE 等价于求解一个最优控制问题。
15.3.3 SSM 与控制的统一视角
SSM(如 Mamba)可以被理解为一种学习到的动态系统:
- 参数 (A,B,C)(A, B, C)(A,B,C) 通过学习得到
- 选择性机制是学习到的自适应控制律
- 训练过程是最优控制问题的数值求解
这个统一视角揭示了:深度学习和控制论不是两个独立的领域,而是同一个数学框架的不同表现形式。
15.4 世界模型与控制
15.4.1 世界模型的概念
世界模型(World Model) 是对环境动态的学习到的模型:
st+1=fθ(st,at)s_{t+1} = f_\\theta(s_t, a_t)st+1=fθ(st,at)
它允许智能体在"想象"中规划和决策,而不需要与真实环境交互。
15.4.2 SSM 作为世界模型
SSM 天然适合作为世界模型的核心组件:
- 状态表示:hth_tht 编码了环境的历史信息
- 动态预测:ht+1=Aˉht+Bˉath_{t+1} = \\bar{A}h_t + \\bar{B}a_tht+1=Aˉht+Bˉat 预测下一个状态
- 观测生成:yt=Chty_t = Ch_tyt=Cht 生成观测
Dreamer(Hafner et al., 2020)等模型已经在使用类似 SSM 的结构作为世界模型。
第十六章:完整可运行代码实现
16.1 经典控制系统仿真
"""
经典控制系统的完整仿真。
包含: 传递函数、阶跃响应、Bode 图、根轨迹。
"""
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
class TransferFunction:
"""传递函数的简单表示和仿真。"""
def __init__(self, num, den):
"""
Args:
num: 分子多项式系数 (高次到低次)
den: 分母多项式系数 (高次到低次)
"""
self.num = np.array(num, dtype=float)
self.den = np.array(den, dtype=float)
self.system = signal.TransferFunction(self.num, self.den)
def poles(self):
"""返回极点。"""
return np.roots(self.den)
def zeros(self):
"""返回零点。"""
return np.roots(self.num)
def is_stable(self):
"""判断是否稳定(所有极点在左半平面)。"""
return all(np.real(self.poles()) < 0)
def step_response(self, T=None):
"""计算阶跃响应。"""
t, y = signal.step(self.system, T=T)
return t, y
def impulse_response(self, T=None):
"""计算脉冲响应。"""
t, y = signal.impulse(self.system, T=T)
return t, y
def bode(self, omega=None):
"""计算 Bode 图数据。"""
if omega is None:
omega = np.logspace(–2, 2, 1000)
w, mag, phase = signal.bode(self.system, omega)
return w, mag, phase
def __mul__(self, other):
"""串联。"""
num = np.convolve(self.num, other.num)
den = np.convolve(self.den, other.den)
return TransferFunction(num, den)
def feedback(self, H=None, sign=–1):
"""闭环反馈。"""
if H is None:
H = TransferFunction([1], [1]) # 单位反馈
# T = G / (1 + G*H)
GH_num = np.convolve(self.num, H.num)
GH_den = np.convolve(self.den, H.den)
if sign == –1:
den_new = np.polyadd(GH_den, GH_num)
else:
den_new = np.polysub(GH_den, GH_num)
return TransferFunction(GH_num, den_new)
def demonstrate_second_order():
"""演示二阶系统的阶跃响应。"""
print("=" * 60)
print("二阶系统阶跃响应演示")
print("=" * 60)
wn = 2.0 # 自然频率
zeta_list = [0.1, 0.3, 0.5, 0.707, 1.0, 1.5]
results = []
for zeta in zeta_list:
# G(s) = wn^2 / (s^2 + 2*zeta*wn*s + wn^2)
G = TransferFunction([wn**2], [1, 2*zeta*wn, wn**2])
t, y = G.step_response(T=np.linspace(0, 5, 500))
# 计算性能指标
y_final = y[–1]
overshoot = max(0, (max(y) – y_final) / y_final * 100)
# 调节时间 (2%)
idx = np.where(np.abs(y – y_final) > 0.02 * y_final)[0]
ts = t[idx[–1]] if len(idx) > 0 else 0
results.append({
'zeta': zeta,
'overshoot': overshoot,
'settling_time': ts,
'peak': max(y),
})
print(f" ζ = {zeta:.3f}: 超调 = {overshoot:.1f}%, "
f"调节时间 = {ts:.2f}s, 峰值 = {max(y):.4f}")
return results
def demonstrate_pid_tuning():
"""演示 PID 控制器参数整定。"""
print("\\n" + "=" * 60)
print("PID 控制器整定演示")
print("=" * 60)
# 被控对象: G(s) = 1 / (s^2 + 2s + 1)
G = TransferFunction([1], [1, 2, 1])
# 不同 PID 参数
pid_params = [
{'name': 'P only', 'Kp': 5.0, 'Ki': 0.0, 'Kd': 0.0},
{'name': 'PI', 'Kp': 5.0, 'Ki': 2.0, 'Kd': 0.0},
{'name': 'PD', 'Kp': 5.0, 'Ki': 0.0, 'Kd': 1.0},
{'name': 'PID', 'Kp': 5.0, 'Ki': 2.0, 'Kd': 1.0},
]
for params in pid_params:
Kp, Ki, Kd = params['Kp'], params['Ki'], params['Kd']
# PID 控制器: C(s) = (Kd*s^2 + Kp*s + Ki) / s
if Ki > 0:
C_num = [Kd, Kp, Ki]
C_den = [1, 0]
else:
C_num = [Kd, Kp]
C_den = [1]
C = TransferFunction(C_num, C_den)
T = C.feedback(G) # 闭环
if T.is_stable():
t, y = T.step_response(T=np.linspace(0, 10, 500))
overshoot = max(0, (max(y) – 1) * 100)
print(f" {params['name']:8s}: 稳定, 超调 = {overshoot:.1f}%")
else:
print(f" {params['name']:8s}: 不稳定!")
if __name__ == "__main__":
demonstrate_second_order()
demonstrate_pid_tuning()
16.2 状态空间与 LQR
"""
状态空间系统的完整实现。
包含: 能控性/能观性检验、极点配置、LQR 设计。
"""
import numpy as np
from scipy.linalg import solve_continuous_are, eigvals
class StateSpaceSystem:
"""连续时间状态空间系统。"""
def __init__(self, A, B, C, D=None):
self.A = np.array(A, dtype=float)
self.B = np.array(B, dtype=float)
self.C = np.array(C, dtype=float)
if D is None:
self.D = np.zeros((C.shape[0], B.shape[1]))
else:
self.D = np.array(D, dtype=float)
self.n = A.shape[0]
def controllability_matrix(self):
"""构造能控性矩阵。"""
n = self.n
m = self.B.shape[1]
C_mat = np.zeros((n, n * m))
AB_power = np.eye(n)
for i in range(n):
C_mat[:, i*m:(i+1)*m] = AB_power @ self.B
AB_power = AB_power @ self.A
return C_mat
def observability_matrix(self):
"""构造能观性矩阵。"""
n = self.n
p = self.C.shape[0]
O_mat = np.zeros((p * n, n))
CA_power = self.C.copy()
for i in range(n):
O_mat[i*p:(i+1)*p, :] = CA_power
CA_power = CA_power @ self.A
return O_mat
def is_controllable(self):
"""判断是否完全能控。"""
C_mat = self.controllability_matrix()
return np.linalg.matrix_rank(C_mat) == self.n
def is_observable(self):
"""判断是否完全能观。"""
O_mat = self.observability_matrix()
return np.linalg.matrix_rank(O_mat) == self.n
def is_stable(self):
"""判断是否稳定。"""
return all(np.real(eigvals(self.A)) < 0)
def simulate(self, u_func, x0, T, dt=0.001):
"""仿真系统响应。
Args:
u_func: 输入函数 u(t) -> array
x0: 初始状态
T: 仿真时长
dt: 时间步长
Returns:
t: 时间序列
x: 状态序列
y: 输出序列
"""
steps = int(T / dt)
t = np.linspace(0, T, steps)
x = np.zeros((steps, self.n))
y = np.zeros((steps, self.C.shape[0]))
x[0] = x0
y[0] = self.C @ x0 + self.D @ u_func(0)
for i in range(1, steps):
u = u_func(t[i–1])
dx = self.A @ x[i–1] + self.B @ u
x[i] = x[i–1] + dx * dt
y[i] = self.C @ x[i] + self.D @ u
return t, x, y
def transfer_function(self):
"""计算传递函数 G(s) = C(sI-A)^{-1}B + D(在特定频率点评估)。"""
# 返回 A 的特征值作为极点
return eigvals(self.A)
def lqr_design(A, B, Q, R):
"""设计 LQR 控制器。
Args:
A, B: 系统矩阵
Q: 状态权重矩阵
R: 控制权重矩阵
Returns:
K: 反馈增益矩阵
P: Riccati 方程的解
"""
# 求解代数 Riccati 方程: A^T P + PA – PBR^{-1}B^TP + Q = 0
P = solve_continuous_are(A, B, Q, R)
# 计算反馈增益: K = R^{-1} B^T P
K = np.linalg.solve(R, B.T @ P)
return K, P
def demonstrate_state_space():
"""演示状态空间系统的基本操作。"""
print("=" * 60)
print("状态空间系统演示")
print("=" * 60)
# 弹簧-阻尼器-质量系统
m, c, k = 1.0, 0.5, 2.0
A = np.array([[0, 1], [–k/m, –c/m]])
B = np.array([[0], [1/m]])
C = np.array([[1, 0]])
D = np.array([[0]])
sys = StateSpaceSystem(A, B, C, D)
print(f"\\n系统参数: m={m}, c={c}, k={k}")
print(f"状态维度: {sys.n}")
print(f"特征值: {eigvals(A)}")
print(f"稳定: {sys.is_stable()}")
print(f"能控: {sys.is_controllable()}")
print(f"能观: {sys.is_observable()}")
# 仿真阶跃响应
u_func = lambda t: 1.0 if t >= 0 else 0.0
t, x, y = sys.simulate(u_func, np.zeros(2), T=20, dt=0.01)
print(f"\\n阶跃响应:")
print(f" 终值: {y[–1, 0]:.4f}")
print(f" 超调: {max(0, (max(y[:, 0]) – 1) * 100):.1f}%")
return sys
def demonstrate_lqr():
"""演示 LQR 控制器设计。"""
print("\\n" + "=" * 60)
print("LQR 控制器设计演示")
print("=" * 60)
# 倒立摆线性化模型
M, m, l, g = 1.0, 0.1, 0.5, 9.8
# 状态: [x, x_dot, theta, theta_dot]
A = np.array([
[0, 1, 0, 0],
[0, 0, –m*g/M, 0],
[0, 0, 0, 1],
[0, 0, (M+m)*g/(M*l), 0]
])
B = np.array([[0], [1/M], [0], [–1/(M*l)]])
C = np.array([[1, 0, 0, 0]]) # 只测量位置
sys = StateSpaceSystem(A, B, C)
print(f"\\n倒立摆系统:")
print(f" 开环特征值: {np.sort_complex(eigvals(A))}")
print(f" 能控: {sys.is_controllable()}")
print(f" 能观: {sys.is_observable()}")
# LQR 设计
Q = np.diag([10, 1, 100, 1]) # 大权重惩罚角度偏差
R = np.array([[0.1]])
K, P = lqr_design(A, B, Q, R)
print(f"\\nLQR 反馈增益 K: {K.flatten()}")
print(f"闭环特征值: {np.sort_complex(eigvals(A – B @ K))}")
# 闭环系统仿真
A_cl = A – B @ K
sys_cl = StateSpaceSystem(A_cl, B, C)
x0 = np.array([0, 0, 0.1, 0]) # 初始角度 0.1 rad
t, x, y = sys_cl.simulate(lambda t: 0, x0, T=5, dt=0.001)
print(f"\\n闭环响应 (初始角度 0.1 rad):")
print(f" 最终角度: {x[–1, 2]:.6f} rad")
print(f" 角度调节时间: {t[np.where(np.abs(x[:, 2]) > 0.001)[0][–1]]:.2f}s"
if len(np.where(np.abs(x[:, 2]) > 0.001)[0]) > 0 else " 立即稳定")
if __name__ == "__main__":
demonstrate_state_space()
demonstrate_lqr()
16.3 Kalman 滤波器
"""
Kalman 滤波器的完整实现。
包含: 离散时间 Kalman 滤波器、状态估计演示。
"""
import numpy as np
class KalmanFilter:
"""离散时间 Kalman 滤波器。
系统模型:
x[k+1] = A x[k] + B u[k] + w[k], w ~ N(0, Q)
y[k] = C x[k] + v[k], v ~ N(0, R)
"""
def __init__(self, A, B, C, Q, R, x0=None, P0=None):
"""
Args:
A: 状态转移矩阵 (n, n)
B: 输入矩阵 (n, m)
C: 观测矩阵 (p, n)
Q: 过程噪声协方差 (n, n)
R: 测量噪声协方差 (p, p)
x0: 初始状态估计
P0: 初始误差协方差
"""
self.A = np.array(A, dtype=float)
self.B = np.array(B, dtype=float)
self.C = np.array(C, dtype=float)
self.Q = np.array(Q, dtype=float)
self.R = np.array(R, dtype=float)
self.n = A.shape[0] # 状态维度
self.p = C.shape[0] # 观测维度
# 初始估计
self.x_hat = np.zeros(self.n) if x0 is None else np.array(x0, dtype=float)
self.P = np.eye(self.n) * 1000 if P0 is None else np.array(P0, dtype=float)
# 存储历史
self.history = {
'x_hat': [self.x_hat.copy()],
'P': [self.P.copy()],
'K': [],
}
def predict(self, u=None):
"""预测步骤。
Args:
u: 输入 (m,) 或 None
"""
if u is None:
u = np.zeros(self.B.shape[1])
# 状态预测
self.x_hat = self.A @ self.x_hat + self.B @ u
# 协方差预测
self.P = self.A @ self.P @ self.A.T + self.Q
def update(self, y):
"""更新步骤。
Args:
y: 观测值 (p,)
"""
# 计算 Kalman 增益
S = self.C @ self.P @ self.C.T + self.R # 新息协方差
K = self.P @ self.C.T @ np.linalg.inv(S)
# 状态更新
y_pred = self.C @ self.x_hat
self.x_hat = self.x_hat + K @ (y – y_pred)
# 协方差更新 (Joseph 形式,数值更稳定)
I_KC = np.eye(self.n) – K @ self.C
self.P = I_KC @ self.P @ I_KC.T + K @ self.R @ K.T
# 记录历史
self.history['x_hat'].append(self.x_hat.copy())
self.history['P'].append(self.P.copy())
self.history['K'].append(K.copy())
return self.x_hat, self.P, K
def step(self, y, u=None):
"""一步预测+更新。
Args:
y: 观测值
u: 输入
Returns:
x_hat: 状态估计
P: 误差协方差
"""
self.predict(u)
return self.update(y)
def get_estimates(self):
"""返回所有状态估计。"""
return np.array(self.history['x_hat'])
def get_covariances(self):
"""返回所有协方差矩阵。"""
return self.history['P']
def demonstrate_kalman_filter():
"""演示 Kalman 滤波器用于状态估计。"""
print("=" * 60)
print("Kalman 滤波器演示")
print("=" * 60)
np.random.seed(42)
# 系统: 匀速运动模型
# 状态: [位置, 速度]
dt = 1.0
A = np.array([[1, dt], [0, 1]])
B = np.array([[0], [0]]) # 无控制输入
C = np.array([[1, 0]]) # 只观测位置
# 噪声参数
q = 0.1 # 过程噪声强度
Q = np.array([[q*dt**3/3, q*dt**2/2],
[q*dt**2/2, q*dt]])
R = np.array([[1.0]]) # 测量噪声方差
print(f"\\n系统模型:")
print(f" 状态转移 A:\\n{A}")
print(f" 观测矩阵 C: {C}")
print(f" 过程噪声 Q:\\n{Q}")
print(f" 测量噪声 R: {R}")
# 生成真实轨迹
T = 50
x_true = np.zeros((T, 2))
x_true[0] = [0, 1] # 初始位置 0,速度 1
for k in range(1, T):
w = np.random.multivariate_normal([0, 0], Q)
x_true[k] = A @ x_true[k–1] + w
# 生成观测
y_obs = np.zeros(T)
for k in range(T):
v = np.random.normal(0, np.sqrt(R[0, 0]))
y_obs[k] = C @ x_true[k] + v
# Kalman 滤波
kf = KalmanFilter(A, B, C, Q, R, x0=[0, 0], P0=np.eye(2)*10)
for k in range(T):
kf.predict()
kf.update(y_obs[k])
# 结果分析
x_est = kf.get_estimates()
# 计算误差
pos_error = np.sqrt(np.mean((x_est[1:, 0] – x_true[:, 0])**2))
vel_error = np.sqrt(np.mean((x_est[1:, 1] – x_true[:, 1])**2))
print(f"\\n滤波结果 (T={T}):")
print(f" 位置 RMSE: {pos_error:.4f}")
print(f" 速度 RMSE: {vel_error:.4f}")
print(f" 观测 RMSE: {np.sqrt(np.mean((y_obs – x_true[:, 0])**2)):.4f}")
print(f" 滤波后位置误差减小: {(1 – pos_error/np.std(y_obs – x_true[:, 0]))*100:.1f}%")
# 展示稳态 Kalman 增益
K_ss = kf.history['K'][–1]
print(f"\\n稳态 Kalman 增益: {K_ss.flatten()}")
# 稳态协方差
P_ss = kf.history['P'][–1]
print(f"稳态协方差矩阵:\\n{P_ss}")
return kf, x_true, y_obs
if __name__ == "__main__":
demonstrate_kalman_filter()
16.4 MPC 实现
"""
模型预测控制 (MPC) 的简单实现。
使用二次规划求解有限时域最优控制问题。
"""
import numpy as np
from scipy.linalg import block_diag
class SimpleMPC:
"""简单的线性 MPC 控制器。
求解:
min sum_{i=0}^{N-1} (x_i^T Q x_i + u_i^T R u_i) + x_N^T P x_N
s.t. x_{i+1} = A x_i + B u_i
u_min <= u_i <= u_max
x_min <= x_i <= x_max
"""
def __init__(self, A, B, Q, R, N, u_min=None, u_max=None, x_min=None, x_max=None):
"""
Args:
A, B: 系统矩阵
Q, R: 权重矩阵
N: 预测时域
u_min, u_max: 控制约束
x_min, x_max: 状态约束
"""
self.A = np.array(A, dtype=float)
self.B = np.array(B, dtype=float)
self.Q = np.array(Q, dtype=float)
self.R = np.array(R, dtype=float)
self.N = N
self.n = A.shape[0]
self.m = B.shape[1]
# 终端权重 (用 DARE 的解)
self.P = self._solve_dare()
# 约束
self.u_min = u_min
self.u_max = u_max
self.x_min = x_min
self.x_max = x_max
def _solve_dare(self):
"""求解离散代数 Riccati 方程。"""
P = self.Q.copy()
for _ in range(100):
P_new = self.Q + self.A.T @ P @ self.A – \\
self.A.T @ P @ self.B @ \\
np.linalg.solve(self.R + self.B.T @ P @ self.B, self.B.T @ P @ self.A)
if np.max(np.abs(P_new – P)) < 1e-10:
break
P = P_new
return P
def solve(self, x0):
"""求解 MPC 优化问题 (无约束情况,解析解)。
Args:
x0: 当前状态
Returns:
u_opt: 最优控制序列 (N, m)
"""
# 构建预测矩阵
# X = Psi * x0 + Theta * U
n, m, N = self.n, self.m, self.N
A, B = self.A, self.B
Psi = np.zeros((n * N, n))
A_power = np.eye(n)
for i in range(N):
A_power = A_power @ A
Psi[i*n:(i+1)*n, :] = A_power
Theta = np.zeros((n * N, m * N))
for i in range(N):
A_power = np.eye(n)
for j in range(i+1):
Theta[i*n:(i+1)*n, (i–j)*m:(i–j+1)*m] = A_power @ B
A_power = A_power @ A
# 构建成本矩阵
Q_bar = block_diag(*([self.Q] * N))
R_bar = block_diag(*([self.R] * N))
# H = Theta^T (Q_bar + …) Theta + R_bar
# 简化: 忽略终端约束的影响
H = Theta.T @ Q_bar @ Theta + R_bar
f = Theta.T @ Q_bar @ Psi @ x0
# 求解: min 0.5 * U^T H U + f^T U
# 无约束解: U* = -H^{-1} f
try:
U_opt = –np.linalg.solve(H, f)
except np.linalg.LinAlgError:
U_opt = –np.linalg.lstsq(H, f, rcond=None)[0]
# 应用约束 (简单投影)
U_opt = U_opt.reshape(N, m)
if self.u_min is not None:
U_opt = np.maximum(U_opt, self.u_min)
if self.u_max is not None:
U_opt = np.minimum(U_opt, self.u_max)
return U_opt
def control(self, x0):
"""计算当前时刻的控制量。
Args:
x0: 当前状态
Returns:
u: 当前控制量 (m,)
"""
U_opt = self.solve(x0)
return U_opt[0]
def demonstrate_mpc():
"""演示 MPC 控制器。"""
print("=" * 60)
print("模型预测控制 (MPC) 演示")
print("=" * 60)
# 双积分器系统 (位置-速度)
dt = 0.1
A = np.array([[1, dt], [0, 1]])
B = np.array([[0], [dt]])
Q = np.diag([10, 1])
R = np.array([[0.1]])
# MPC 参数
N = 20
u_min = np.array([–2.0])
u_max = np.array([2.0])
mpc = SimpleMPC(A, B, Q, R, N, u_min=u_min, u_max=u_max)
print(f"\\n系统: 双积分器")
print(f" A = \\n{A}")
print(f" B = {B.flatten()}")
print(f"预测时域: {N}")
print(f"控制约束: [{u_min[0]}, {u_max[0]}]")
# 仿真
T = 100
x = np.array([5.0, 0.0]) # 初始位置 5
x_history = [x.copy()]
u_history = []
for k in range(T):
u = mpc.control(x)
x = A @ x + B @ u
x_history.append(x.copy())
u_history.append(u[0])
x_history = np.array(x_history)
u_history = np.array(u_history)
print(f"\\n仿真结果 (T={T*dt:.1f}s):")
print(f" 初始位置: {x_history[0, 0]:.2f}")
print(f" 最终位置: {x_history[–1, 0]:.4f}")
print(f" 最终速度: {x_history[–1, 1]:.4f}")
print(f" 最大控制量: {max(abs(u_history)):.4f}")
print(f" 调节时间: {np.where(np.abs(x_history[:, 0]) > 0.01)[0][–1] * dt:.1f}s"
if len(np.where(np.abs(x_history[:, 0]) > 0.01)[0]) > 0 else " 已收敛")
return mpc, x_history, u_history
if __name__ == "__main__":
demonstrate_mpc()
附录
A. 数学符号表
| x(t)x(t)x(t) | 状态向量 | Rn\\mathbb{R}^nRn |
| u(t)u(t)u(t) | 输入向量 | Rm\\mathbb{R}^mRm |
| y(t)y(t)y(t) | 输出向量 | Rp\\mathbb{R}^pRp |
| AAA | 状态矩阵 | Rn×n\\mathbb{R}^{n \\times n}Rn×n |
| BBB | 输入矩阵 | Rn×m\\mathbb{R}^{n \\times m}Rn×m |
| CCC | 输出矩阵 | Rp×n\\mathbb{R}^{p \\times n}Rp×n |
| DDD | 直通矩阵 | Rp×m\\mathbb{R}^{p \\times m}Rp×m |
| G(s)G(s)G(s) | 传递函数 | 有理函数 |
| KKK | 反馈增益矩阵 | Rm×n\\mathbb{R}^{m \\times n}Rm×n |
| LLL | 观测器增益矩阵 | Rn×p\\mathbb{R}^{n \\times p}Rn×p |
| QQQ | 状态权重/噪声协方差 | Rn×n\\mathbb{R}^{n \\times n}Rn×n |
| RRR | 控制权重/噪声协方差 | Rm×m\\mathbb{R}^{m \\times m}Rm×m 或 Rp×p\\mathbb{R}^{p \\times p}Rp×p |
| PPP | Riccati 方程解/误差协方差 | Rn×n\\mathbb{R}^{n \\times n}Rn×n |
B. 关键公式速查
传递函数:
G(s)=C(sI−A)−1B+DG(s) = C(sI – A)^{-1}B + DG(s)=C(sI−A)−1B+D
ZOH 离散化:
Aˉ=eAΔ,Bˉ=A−1(Aˉ−I)B\\bar{A} = e^{A\\Delta}, \\quad \\bar{B} = A^{-1}(\\bar{A} – I)BAˉ=eAΔ,Bˉ=A−1(Aˉ−I)B
能控性矩阵:
C=[BAB⋯An−1B]\\mathcal{C} = [B \\quad AB \\quad \\cdots \\quad A^{n-1}B]C=[BAB⋯An−1B]
能观性矩阵:
O=[CT(CA)T⋯(CAn−1)T]T\\mathcal{O} = [C^T \\quad (CA)^T \\quad \\cdots \\quad (CA^{n-1})^T]^TO=[CT(CA)T⋯(CAn−1)T]T
代数 Riccati 方程:
ATP+PA−PBR−1BTP+Q=0A^TP + PA – PBR^{-1}B^TP + Q = 0ATP+PA−PBR−1BTP+Q=0
LQR 最优增益:
K=R−1BTPK = R^{-1}B^TPK=R−1BTP
Kalman 增益:
L=PCTR−1L = PC^TR^{-1}L=PCTR−1
闭环特征值分离:
eig(A−BK)∪eig(A−LC)=闭环极点\\text{eig}(A – BK) \\cup \\text{eig}(A – LC) = \\text{闭环极点}eig(A−BK)∪eig(A−LC)=闭环极点
C. 参考文献
Ogata, K. (2010). Modern Control Engineering (5th ed.). Prentice Hall.
Franklin, G. F., Powell, J. D., & Emami-Naeini, A. (2014). Feedback Control of Dynamic Systems (7th ed.). Pearson.
Astrom, K. J., & Murray, R. M. (2008). Feedback Systems: An Introduction for Scientists and Engineers. Princeton University Press.
Kalman, R. E. (1960). A New Approach to Linear Filtering and Prediction Problems. Journal of Basic Engineering, 82(1), 35-45.
Bertsekas, D. P. (2012). Dynamic Programming and Optimal Control (4th ed.). Athena Scientific.
Rawlings, J. B., Mayne, D. Q., & Diehl, M. (2017). Model Predictive Control: Theory, Computation, and Design (2nd ed.). Nob Hill Publishing.
Anderson, B. D. O., & Moore, J. B. (2007). Optimal Control: Linear Quadratic Methods. Dover Publications.
Gu, A., Dao, T., Ermon, S., Rudra, A., & Ré, C. (2020). HiPPO: Recurrent Memory with Optimal Polynomial Projections. NeurIPS 2020.
Gu, A., & Dao, T. (2023). Mamba: Linear-Time Sequence Modeling with Selective State Spaces. arXiv:2312.00752.
Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction (2nd ed.). MIT Press.
本文涵盖了控制论从经典反馈到现代最优控制的完整理论体系,并探讨了控制论与机器学习(特别是状态空间模型)的深刻联系。代码均使用 NumPy/SciPy 实现,可直接运行。


