3. 数学基础(二):线性代数基础与状态空间模型
各位同学,欢迎来到第三讲。上一讲我们聊了概率论,今天咱们把目光转向线性代数和状态空间模型。说实话,在雷达数据处理这个行当里,线性代数就是我们的“普通话”。你想想看,目标的位置、速度、加速度,哪个不是用向量和矩阵来表示的?
我个人习惯,在讲理论之前,先给大家一个全景图。这一章的核心就三块:矩阵运算、特征值分解、以及状态空间模型。这三者环环相扣,矩阵运算是工具,特征值分解是分析工具,而状态空间模型则是我们描述目标运动的核心框架。
3.1 矩阵运算:雷达数据处理的“基本操作”
先说说矩阵乘法。我记得刚入行时,带我的老工程师跟我说:“小张,矩阵乘法要是搞不明白,后面卡尔曼滤波你肯定晕。” 我当时还不信,后来真做项目了才发现——确实如此。
在雷达数据处理中,我们经常要处理这样的场景:一个目标的状态向量 x 包含位置和速度,比如 x = [x, y, vx, vy]^T。那么经过时间 Δt 后,它的新状态怎么算?
说白了,就是用状态转移矩阵 F 去乘当前状态:
# 匀速运动模型的状态转移矩阵
F = [[1, 0, Δt, 0],
[0, 1, 0, Δt],
[0, 0, 1, 0],
[0, 0, 0, 1]]
# 新状态 = F * 旧状态
x_new = F @ x_old # @ 是矩阵乘法运算符
关键点:矩阵乘法不满足交换律!A @ B 和 B @ A 通常不一样。我在项目中见过有人写反了顺序,结果滤波结果完全发散。嗯,调试了整整两天才找到问题。
再来说说逆矩阵。为什么需要它?因为我们要做“反推”。比如已知观测值 z,想反推状态 x,就需要用到观测矩阵 H 的逆。但注意,H 通常不是方阵,所以要用伪逆。
实用技巧:在实际代码中,尽量用 np.linalg.solve() 而不是显式计算逆矩阵。数值稳定性更好,速度也更快。这是我踩过坑之后学到的教训。
3.2 特征值分解:看懂系统的“本质”
特征值分解,听起来高大上,其实核心思想很简单:把一个矩阵拆解成“方向”和“伸缩”两部分。
为什么会这样?你想想看,一个矩阵作用于一个向量,本质上就是对这个向量进行旋转和缩放。而特征向量就是那些“只被缩放、不被旋转”的特殊方向。
在雷达数据处理中,特征值分解最常见的应用是协方差矩阵分析。比如,我们有一个目标跟踪的不确定性椭圆,它的主轴方向就是协方差矩阵的特征向量,轴长就是特征值的平方根。
import numpy as np
# 假设协方差矩阵 P
P = np.array([[4.0, 1.5],
[1.5, 1.0]])
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(P)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
# 特征值越大,对应方向的不确定性越大
注意:协方差矩阵必须是半正定的,也就是说所有特征值 ≥ 0。我曾经在项目中遇到过一个bug,因为数值误差导致特征值出现微小的负数,结果画出来的误差椭圆完全变形。解决办法是加一个很小的正数到对角线上,比如 1e-6。
特征值分解还有一个重要应用——降维。当我们的状态向量维度很高时(比如同时跟踪多个目标),可以用PCA(主成分分析)来提取主要特征。说白了,就是只保留特征值最大的几个方向,丢掉那些“噪声”方向。
3.3 状态空间模型:描述目标运动的“标准语言”
好了,前面铺垫了这么多,终于到核心了。状态空间模型,说白了就是两句话:
- 状态方程:目标怎么运动? x_{k+1} = F * x_k + w_k
- 观测方程:我们怎么看到目标? z_k = H * x_k + v_k
其中 w_k 是过程噪声,v_k 是观测噪声。这两个噪声的协方差矩阵,分别记为 Q 和 R。
我个人习惯,在讲状态空间模型时,一定要强调“模型假设”。比如匀速模型假设目标速度不变,匀加速模型假设加速度不变。你想想看,如果目标突然转弯,你还用匀速模型去跟踪,那结果肯定一塌糊涂。
| 模型类型 | 状态向量 | 状态转移矩阵 F | 适用场景 |
|---|---|---|---|
| 匀速模型 (CV) | [x, vx]^T | [[1, Δt], [0, 1]] | 直线匀速运动 |
| 匀加速模型 (CA) | [x, vx, ax]^T | [[1, Δt, 0.5Δt²], [0, 1, Δt], [0, 0, 1]] | 机动目标 |
| 匀速转弯模型 (CT) | [x, y, vx, vy, ω]^T | 含三角函数项 | 转弯机动 |
避坑指南:我曾经在项目中遇到过一个情况——用匀速模型跟踪一个正在转弯的飞机。结果滤波结果完全跟不上,误差越来越大。后来换成匀加速模型,效果好了很多。但更优的方案是用交互式多模型(IMM),这个我们后面章节会详细讲。
最后,说说状态空间模型和卡尔曼滤波的关系。卡尔曼滤波,本质上就是在状态空间模型的基础上,做最优估计。它分两步:预测(用状态方程)和更新(用观测方程)。
# 卡尔曼滤波的预测步骤(简化版)
x_pred = F @ x_est # 预测状态
P_pred = F @ P_est @ F.T + Q # 预测协方差
# 卡尔曼滤波的更新步骤(简化版)
K = P_pred @ H.T @ inv(H @ P_pred @ H.T + R) # 卡尔曼增益
x_est = x_pred + K @ (z - H @ x_pred) # 更新状态
P_est = (I - K @ H) @ P_pred # 更新协方差
你看,这里面全是矩阵运算。所以我说,线性代数是雷达数据处理的“普通话”,一点不夸张。
学习建议:如果你觉得矩阵运算不熟练,我建议你手算一遍 2×2 矩阵的乘法、求逆、特征值分解。别嫌麻烦,手算一遍比看十遍代码都管用。我自己就是这么过来的。
好了,这一章的内容就到这里。记住,矩阵运算是工具,特征值分解是分析工具,状态空间模型是框架。三者结合起来,你就能用数学语言精确描述目标的运动规律。下一章我们会把这些知识串起来,讲一讲数据关联的核心算法。