微分方程、矩阵指数与状态空间离散化¶
一篇会成长的笔记。在组合导航里,微分方程是连接物理世界和卡尔曼滤波的桥梁:对方程怎么解、怎么离散化、矩阵指数怎么算、矩阵怎么求导,如果心里没数,看 \(F\) 阵、\(Q\) 阵、状态转移就像看天书。这篇按你喜欢的格式:定义 → 推导 → 物理直觉 → 课程对接 → 常见坑,把这条线彻底打通。
核心要点¶
- 惯导运动方程是一阶微分方程组(位置/速度/姿态的导数=各自的变化率)——这正是"状态空间方法"的来源。
- 线性系统 \(\dot x=Fx+Gw\) 有解析解:\(x(t)=e^{F\Delta t}x_0+\int e^{F(t-\tau)}Gw\,d\tau\)。
- 矩阵指数 \(e^{F\Delta t}\):\(F\) 自由演化 \(\Delta t\) 的状态转移矩阵,是连续↔离散的桥梁。
- 离散化:\(x_k=F_d x_{k-1}+w_k\),其中 \(F_d=e^{F\Delta t}\),\(w_k\) 协方差 $\(Q_d=\int_0^{\Delta t}e^{F(\Delta t-\tau)}GQ_cG^Te^{F^T(\Delta t-\tau)}\,d\tau \approx GQ_cG^T\Delta t\quad(\text{一阶})\)$
- 非线性系统:在估计点一阶泰勒展开 → 雅可比 \(F=\partial f/\partial x\) → 线性误差方程 \(\delta \dot x=F\delta x+Gw\) → 才谈得上卡尔曼。
- 矩阵求导:构造 \(F/H\) 阵、推导卡尔曼增益的笔头功夫(二次型、迹、链式法则)。
全局逻辑图:
物理规律(牛顿力学、运动学)
│ 写成微分方程
▼
连续状态方程:ẋ = Fx + Gw
│ 求解(矩阵指数、常数变易法)
▼
连续解:x(t) = e^{FΔt}·x(t0) + ∫e^{F(t-τ)}Gw(τ)dτ
│ 离散化(一个采样周期)
▼
离散状态方程:x_k = F_d·x_{k-1} + w_k
│ 噪声传播
▼
Q_d = ∫e^{F(Δt-τ)}GQcGᵀe^{Fᵀ(Δt-τ)}dτ
一句话:微分方程描述"怎么变",矩阵指数解决"怎么解",离散化解决"卡尔曼怎么用"。
一、微分方程基础(定义)¶
一句话:微分方程是包含未知函数及其导数的方程,用来描述"量 + 量的变化率"之间的关系。
1.1 常微分方程(ODE)vs 偏微分方程(PDE)¶
- ODE:未知函数是一元函数,如 \(\dot x(t)=f(x(t),t)\),惯导解算只用 ODE;
- PDE:未知函数是多元函数,含偏导数(如热传导/波动方程),惯导不涉及。
1.2 阶数¶
最高阶导数的阶数。
- 一阶:\(\dot x=f(x,t)\);
- 二阶:\(\ddot x=f(x,\dot x,t)\)。
为什么惯导方程都能写成"一阶":物理上位置导数=速度、速度导数=加速度、姿态导数=角速度,每一条都是一阶。二阶方程 \(\ddot p=a\) 可以降阶成一阶方程组:
这就是状态空间方法的起源:把高阶方程化成一阶方程组,用向量和矩阵表示。
其中 \(\boldsymbol x\) 是状态向量(如 \([\delta p,\delta v,\delta\phi,b_g,b_a]\)),\(\boldsymbol u\) 是输入(如比力、角速度)。
1.3 线性 vs 非线性¶
| 类型 | 形式 | 解的性质 |
|---|---|---|
| 线性 | \(\dot x=Fx+Gu\) | 可用矩阵指数解析求解,卡尔曼直接可用 |
| 非线性 | \(\dot x=f(x,u)\) | 形态任意,不能解析求解;惯导方程就是非线性 |
非线性处理办法:在标称状态处一阶泰勒展开 → 得到线性误差方程 → 再用线性方法(§五)。
二、一阶线性微分方程的解析解(推导)¶
2.1 标量齐次方程:\(\dot x=ax\)¶
解:
推导(分离变量法):
两边积分:
2.2 标量非齐次方程:\(\dot x=ax+bu(t)\)¶
解:
推导(常数变易法)——"先把输入当 0 求通解,再把常数换成函数":
假设解的形式 \(x(t)=e^{a(t-t_0)}c(t)\),求导:
代入原方程,消去左边第一项 \(ae^{a(t-t_0)}c\):
积分并代回(注意 \(\tau\) 是积分变量、\(t\) 是上限):
2.3 矩阵情形(惯导真正用的)¶
把标量换成矩阵:
解(乘号顺序不能乱,\(F\) 与 \(G\) 不可交换):
推导完全照搬常数变易法:
- 先求齐次解 \(x_h(t)=e^{F(t-t_0)}x(t_0)\)(验证:\(\dfrac{d}{dt}e^{Ft}=Fe^{Ft}\));
- 设 \(x(t)=e^{F(t-t_0)}c(t)\),求导代入,得 \(\dot c=e^{-F(t-t_0)}Gw\);
- 积分再代回,保序:\(e^{F(t-\tau)}\) 左乘 \(G\),\(w\) 在最右。
物理直觉:第一项 = 初始状态自由演化;第二项 = 输入/噪声在历史各时刻的贡献,被系统动力学"记忆"并叠加到终点。 这就是"历史每一瞬间的扰动都要乘上转移矩阵才能到达现在"的积分核。
三、矩阵指数:解法、性质与计算¶
3.1 定义¶
3.1.1 为什么这个级数"在 0 处展开"?¶
你可能会问:凭什么展开点是 \(x=0\),而不是别的?
这个级数其实是矩阵值函数 \(\Phi(x)=e^{Fx}\) 在 \(x=0\) 处的泰勒(麦克劳林)展开,把 \(x=\Delta t\) 代进去就得到 \(e^{F\Delta t}\)。选 0 不是任意的,有三个原因:
- 它是定义本身:矩阵指数就是由这条幂级数定义的(对标量 \(e^x=1+x+x^2/2!+\cdots\))。定义式天然是"在 0 处展开"的形式。
- 0 是唯一一个"答案已知"的点:当 \(x=0\)(时间没流过),任何系统都"没动",所以 \(e^{F\cdot 0}=I\)——单位阵。不管 \(F\) 长什么样,转移矩阵在零时刻恒等于 \(I\),这是所有状态转移矩阵共有的"锚点"。拿别的点 \(x=a\) 展开,你反而得先知道 \(e^{Fa}\) 才能写系数,没意义。
- 它永远收敛:对矩阵来说 \(e^{Fx}\) 是整函数(级数对一切 \(F\)、一切 \(x\) 都收敛),所以在 0 处展开既合法又最干净,再代 \(x=\Delta t\) 即可。
一句话:"在 0 展开"是因为 0 是转移矩阵唯一天然等于 \(I\) 的点,而矩阵指数本来就是按这个级数定义的。
3.2 性质(背下来)¶
| 性质 | 公式 |
|---|---|
| 单位元 | \(e^{F\cdot 0}=I\) |
| 半群 | \(e^{F(t_1+t_2)}=e^{Ft_1}e^{Ft_2}\)(同一 \(F\)) |
| 可逆 | \((e^{Ft})^{-1}=e^{-Ft}\) |
| 微分 | \(\dfrac{d}{dt}e^{Ft}=Fe^{Ft}=e^{Ft}F\)(与 \(F\) 可交换) |
| 相加(仅当可交换) | \(F_1F_2=F_2F_1\ \Rightarrow\ e^{F_1+F_2}=e^{F_1}e^{F_2}\) |
| 相加(一般情况) | \(e^{F_1+F_2}\neq e^{F_1}e^{F_2}\) ⚠️ |
矩阵不可交换是最容易踩的坑
导数篇里 \(e^{a+b}=e^ae^b\) 对标量永远成立;对矩阵只有 \(F_1,F_2\) 可交换时才成立。惯导里把姿态转矩阵与速度耦合分开处理、把 \(F\) 分块积分,处处都是因为"不能随便交换"。
3.3 计算方法(四种)¶
方法 1:泰勒展开——\(F\) 幂零或 \(\Delta t\) 很小时合适。
例:\(F=\begin{bmatrix}0&1\\0&0\end{bmatrix}\),\(F^2=0\),所以
方法 2:对角化——\(F=V\Lambda V^{-1}\),\(\Lambda=\mathrm{diag}(\lambda_1,\dots,\lambda_n)\):
方法 3:拉普拉斯变换:
方法 4:Cayley-Hamilton 定理——\(e^{F\Delta t}\) 可写成 \(I,F,F^2,\dots,F^{n-1}\) 的线性组合(系数由特征多项式定)。
3.4 数值例子:简谐振子(二维)¶
对角化/级数可得:
物理意义:位置与速度随时间振荡,矩阵指数给出振荡的相位和幅度。惯导里的舒勒振荡(84.4min)就是同款结构——只是耦合矩阵更复杂,见 09 纯惯导误差传播。
3.5 物理意义总结¶
\(e^{F\Delta t}\) 表示状态在 \(\Delta t\) 时间内在系统动力学 \(F\) 支配下的自由演化转移矩阵。对惯导:它就是"上一个采样时刻的误差状态,线性推进到这一个采样时刻"的那张矩阵——离散后的 \(F_d\)。
四、连续 → 离散:\(F_d\) 与 \(Q_d\)(课程核心推导)¶
4.1 离散状态方程¶
对连续 \(\dot x=Fx+Gw\) 在一个采样周期 \([t_{k-1},t_k]\) 上积分(\(\Delta t=t_k-t_{k-1}\)):
定义
于是离散状态方程:
4.2 离散噪声协方差 \(Q_d\)(完整推导)¶
假设:\(w(t)\) 是连续白噪声,\(\mathbb E[w(t)]=0\),\(\mathbb E[w(t)w(\tau)^T]=Q_c\,\delta(t-\tau)\),\(Q_c\) 为连续噪声强度。
\(w_{k-1}\) 的协方差:
期望穿过积分,只剩白噪声的相关函数 \(\mathbb E[w(\tau_1)w(\tau_2)^T]=Q_c\delta(\tau_1-\tau_2)\),\(\delta\) 把二重积分压成一重:
4.3 一阶近似(工程最常用)¶
若 \(\Delta t\) 很小,\(e^{F(\Delta t-\tau)}\approx I\):
这就是卡尔曼代码里 Qd = G*Qc*G'*dt 的来源。
4.4 精确计算例子:一维位置-速度(\(Q_d\) 的完整来历)¶
4.5 \(Q_d\) 的物理意义¶
- \(Q_{vv}=Q_c\Delta t\):速度方差与时间成正比(白噪声积分一次);
- \(Q_{pp}=Q_c\Delta t^3/3\):位置方差与时间的立方成正比(再积分一次)——纯惯导位置误差为什么必然发散,就写在这;
- \(Q_{pv}=Q_c\Delta t^2/2\):位置与速度因为同源噪声而相关(协方差非零)。
直觉:加速度噪声积分一次得速度、再积分一次得位置;位置和速度来自同一个噪声源,所以相关。\(Q_d\) 不是对角阵该有的样子——它们天然互相耦合。
五、非线性线性化:从 \(f(x)\) 到 \(F\)(雅可比)¶
5.1 为什么需要线性化¶
惯导方程 \(\dot x=f(x,u)\) 是非线性的,卡尔曼只认线性。方法:在标称状态 \(\hat x\) 处一阶泰勒展开:
其中雅可比矩阵
岔路口:F/G 是从哪来的?和"怎么解"是两回事 学完 §二 的常数变易法,容易误以为"要求 F、G 也得走一遍 ODE 求解"。其实常数变易法求的是"解 \(x(t)\)",不是矩阵 F、G。F、G 的来源只有一步——把物理规律写成一阶状态方程: - 线性系统 \(\dot x=Fx+Gu\):F、G 就是状态、输入前的系数矩阵,从牛顿/运动学方程直接"读"出来(经典力学写成一阶形式即可,不需要任何积分)。例如 \(\dot p=v,\ \dot v=a\) 拼成 $\(\begin{bmatrix}\dot p\\ \dot v\end{bmatrix}=\begin{bmatrix}0&1\\0&0\end{bmatrix}\begin{bmatrix}p\\ v\end{bmatrix}+\begin{bmatrix}0\\ 1\end{bmatrix}a\)$ F、G 一眼读出,根本不用解微分方程。 - 非线性系统 \(\dot x=f(x,u)\):F 不再是常数矩阵,而是在当前估计点对 \(f\) 求雅可比 \(F=\partial f/\partial x\)(见上)。
一句话:线性 → F/G 是常数系数,直接读;非线性 → F 是标称点的雅可比。常数变易法 / 矩阵指数只负责"已知 F、G 后怎么把解写出来"。
5.2 误差方程¶
定义误差 \(\delta x=x-\hat x\),则
这就是"误差状态方程"——ESKF 的全部家当(详见 11 EKF 与 ESKF)。\(F(\hat x)\) 依赖当前估计,所以是线性时变的,每个采样周期都要重新算。
5.3 惯导实例:速度方程对状态的偏导¶
速度微分方程(n 系投影):
- 对姿态误差 \(\delta\psi\) 求偏导:\(\dfrac{\partial \dot v^n}{\partial \delta\psi}=-[f^n]_\times\)(比力的反对称阵);
- 对速度误差 \(\delta v^n\) 求偏导:\(\dfrac{\partial \dot v^n}{\partial \delta v^n}=-(2\omega_{ie}^n+\omega_{en}^n)\times\)(哥氏+牵连项)。
这些正是 \(F\) 阵里的块——怎么求,见下一节矩阵求导。
六、矩阵求导速查(构造 F/H、推卡尔曼增益的笔头功夫)¶
一句话:标量微积分只管"数",组合导航里处处是"向量/矩阵对向量/矩阵求导"——工具是雅可比矩阵和微分的链式法则。
6.1 三个基本类型¶
| 求导对象 | 结果 | 说明 |
|---|---|---|
| 标量 \(c\) 对向量 \(x\) | 梯度向量 \(\dfrac{\partial c}{\partial x}\) | 各分量偏导排成列 |
| 向量 \(y\) 对向量 \(x\) | 雅可比矩阵 \(J_{ij}=\dfrac{\partial y_i}{\partial x_j}\) | 每行一个输出分量的梯度 |
| 标量 \(c\) 对矩阵 \(X\) | 某矩阵 \(\dfrac{\partial c}{\partial X}\) | 逐元偏导排成同型矩阵 |
6.2 复合法则(链式法则,雅可比乘法)¶
若 \(y=g(u)\),\(u=h(x)\),则
惯导里的典型链条:姿态误差 \(\delta\phi\) → 姿态矩阵 \(C_b^n\) → 比力投影 \(C_b^n f^b\) → 速度方程。写 \(F\) 阵 = 把这条链逐环求导再用链式乘积串起来。
6.3 二次型与线性形式(最高频,必须背)¶
| 形式 | 导数(对 \(x\)) |
|---|---|
| \(c=a^Tx=x^Ta\) | \(a\) |
| \(c=x^TAx\)(\(A\) 一般) | \((A+A^T)x\) |
| \(c=x^TAx\)(\(A\) 对称,如协方差) | \(2Ax\) |
| \(y=Ax\) | \(\partial y/\partial x=A\) |
| \(c=x^Tx=\lVert x\rVert^2\) | \(2x\) |
卡尔曼里的出现位置:
- 马氏距离 \(d^2=(z-Hx)^TS^{-1}(z-Hx)\) 对 \(x\) 求导 → 最小化就是加权最小二乘,解得 \(\hat x_{LS}\);
- 协方差传播 \(P=FPF^T+Q\) 两边都是矩阵乘法产物;
- 推导卡尔曼增益:代价 \(J=\mathrm{tr}(P_k^+)\)(或误差方差),对增益矩阵 \(K\) 求导并令导数为零——这就是增益公式 \(K=PH^T(HPH^T+R)^{-1}\) 的由来(见「最小二乘 → 卡尔曼」篇预告)。
6.4 迹技巧(对矩阵求导最实用的快捷键)¶
对"标量 = 矩阵运算的迹"的形式,用迹的循环性质把目标拎出来:
常用公式:
推导卡尔曼增益时,\(J=\mathrm{tr}(P^+)=\mathrm{tr}[(I-KH)P^-(I-KH)^T+KRK^T]\) 展开后正是这样逐项求导的。
6.5 微分法(终极武器)¶
对复杂的矩阵表达式,直接对矩阵求导容易乱;更稳的套路是先对表达式取微分(线性化),再"除以" \(dx\):
把标量表达式 \(c\) 写成 \(dc=\mathrm{tr}(A\,dX)\) 的形式,则 \(\dfrac{\partial c}{\partial X}=A^T\)。ESKF/旋转矩阵对时间求导(\(\dot C=C[\omega]_\times\))本质就是这条。
七、从物理到卡尔曼:完整链路 + 代码对应¶
7.1 完整链路¶
物理方程:
ṗ = v
v̇ = C_bⁿ f^b − (2ω_ie + ω_en)×v + gⁿ
q̇ = ½ q ⊗ [0, ω_nb^b]
│ 定义误差状态(线性化)
▼
误差方程:δẋ = F δx + Gw
│ 离散化(矩阵指数)
▼
离散误差方程:δx_k = F_d δx_{k-1} + w_k
│ 噪声传播
▼
Q_d = ∫₀^Δt e^{F(Δt-τ)} G Q_c Gᵀ e^{Fᵀ(Δt-τ)} dτ
│ 卡尔曼
▼
预测:P⁻ = F_d P⁺ F_dᵀ + Q_d
更新:K = P⁻Hᵀ(HP⁻Hᵀ + R)⁻¹
7.2 代码对应(15 态 ESKF 示意,PSINS/固件风格)¶
% —— 连续 F 阵(15 态:δp,δv,δφ,bg,ba;n 系投影)——
F = zeros(15,15);
F(1:3,4:6) = eye(3); % 位置 ← 速度
F(4:6,7:9) = -skew(fn); % 速度 ← 姿态(-比力叉乘)
F(4:6,13:15)= Cbn; % 速度 ← 加计零偏
F(7:9,10:12)= -Cbn; % 姿态 ← 陀螺零偏
F(10:12,10:12) = -1e-4*eye(3); % 陀螺零偏一阶 GM 相关时间
F(13:15,13:15) = -1e-4*eye(3); % 加计零偏一阶 GM
% —— 离散化 ——
Fd = eye(15) + F*dt + 0.5*(F*dt)^2; % 二阶近似(Δt 小可只用一阶)
Qd = G*Qc*G'*dt; % 一阶近似(详见 §四.3)
与仓库现有笔记的衔接
这一套在 08 kffk F阵离散化(line-by-line)(PSINS \(F\) 构造与离散)、06 机械编排方程(连续运动方程)、11 EKF 与 ESKF(误差状态线性化)里都是主咖。这篇给的是它们共同的地基:连续方程到底怎么变成代码里的 \(F_d\) 与 \(Q_d\)。
八、常见坑¶
- 矩阵不可交换:\(e^{F_1+F_2}\neq e^{F_1}e^{F_2}\)(除非可交换)——分块、重排、简化前先问"顺序换不换得动"。
- 一阶近似在 \(\Delta t\) 大时误差大:高频 IMU(\(\Delta t\) 小)一阶够;低频/慢采样要用二阶或精确矩阵指数。
- \(Q_d\) 直接拍:工程常见错误是直接给个对角阵。严格做法是 §四.2 的积分;至少用 \(GQ_cG^T\Delta t\) 且保留耦合项。
- \(Q_c\) 与 \(Q_d\) 单位混淆:\(Q_c\) 单位是 状态²/时间,\(Q_d\) 是 状态²,差一个 \(\Delta t\)——混了滤波器几秒内发散。
- 连续 \(F\) 与离散 \(F_d\) 混淆:\(F\) 连续、单位 1/s;\(F_d=e^{F\Delta t}\) 离散、无量纲。代码里写的多是 \(F_d\),别把 \(F\) 直接乘进预测步。
- 线性化点要取对:\(F=\partial f/\partial x\) 必须在当前估计点求值(线性时变),不是初始点。ESKF 里每周期重算 \(F\) 就是这个原因。
- 忘记链式求导的维度:雅可比乘法的内/外层维度不匹配,是写 \(F/H\) 阵最常见的编译级错误。
九、总结¶
一条主线:
三个核心公式:
| 公式 | 含义 |
|---|---|
| \(x(t)=e^{F(t-t_0)}x_0+\int e^{F(t-\tau)}Gw\,d\tau\) | 连续时间解析解 |
| \(F_d=e^{F\Delta t}\) | 离散状态转移矩阵 |
| \(Q_d=\int_0^{\Delta t}e^{F(\Delta t-\tau)}GQ_cG^Te^{F^T(\Delta t-\tau)}d\tau\) | 离散过程噪声协方差 |
一句话:微分方程描述物理规律;矩阵指数给出解析解;离散化让卡尔曼滤波能用——\(Q_d\) 是噪声穿过系统动力学传播后的结果,不是常数表里查出来的。
关联¶
- 系列内:惯性导航系列首页
- 姊妹篇:导数与微分基础(雅可比/一阶线性化的出处)· 概率统计基础(高斯/协方差传播,\(P\) 与 \(Q\) 的语法)· 随机过程与噪声建模(连续噪声 \(Q_c\) → 离散 \(Q_d\) 的物理来源)· 数学地基
- 应用篇:06 机械编排方程 · 08 kffk F阵离散化 · 09 纯惯导误差传播(舒勒振荡)· 11 EKF 与 ESKF(误差状态线性化)
- 下一篇:最小二乘 → 卡尔曼完整推导(增益 \(K\) 由矩阵求导得出)