4. 标定数学模型:线性回归、最小二乘法、多项式拟合、卡尔曼滤波基础
各位同学,咱们今天聊聊标定里最核心的数学工具。说实话,很多刚入行的工程师一看到数学公式就头疼,觉得离实际工作很远。但我要告诉你,这些模型就是你手里的扳手和螺丝刀,是吃饭的家伙。
我最早做传感器标定时,也踩过不少坑。有一次给一个压力传感器做标定,数据点画出来明明是一条直线,我愣是用了个高阶多项式去拟合,结果过拟合得一塌糊涂,现场测试直接翻车。从那以后,我养成了一个习惯:先看数据,再选模型。
4.1 线性回归:最朴素的标定模型
线性回归,说白了就是找一条直线,让它尽可能穿过所有数据点。你想想看,传感器输出和物理量之间,很多时候就是这种简单关系。
数学上,我们假设:
y = a * x + b
其中 x 是传感器原始读数,y 是真实物理量。a 是增益,b 是偏置。
我在项目中遇到过最典型的例子:一个温度传感器,ADC 读数和实际温度就是完美的线性关系。这时候用线性回归,又快又准。
核心要点:线性回归的前提是数据本身具有线性趋势。别上来就套模型,先画个散点图看看。
4.2 最小二乘法:让误差最小化
线性回归怎么算?最常用的就是最小二乘法。它的思想很简单:让所有数据点到直线的垂直距离的平方和最小。
公式长这样:
a = (n * Σ(xy) - Σx * Σy) / (n * Σ(x²) - (Σx)²)
b = (Σy - a * Σx) / n
嗯,这里要注意,这个公式只适用于一元线性回归。如果你有多个输入变量,那就得用矩阵形式了。
我曾经犯过一个低级错误:用最小二乘法时,忘了检查数据中是否有异常点。结果一个跳变的噪声点,把整条拟合直线都带偏了。所以我现在每次做拟合前,都会先做一次粗大误差剔除。
实战技巧:在嵌入式平台上实现最小二乘法时,建议用递推形式,避免一次性加载所有数据。这样内存占用小,也适合实时标定。
4.3 多项式拟合:处理非线性关系
现实世界没那么理想。很多传感器的响应曲线是非线性的,比如热电偶、光电传感器。这时候就需要多项式拟合了。
一般形式:
y = a₀ + a₁*x + a₂*x² + ... + aₙ*xⁿ
我建议,多项式阶数不要超过 3 阶。为什么?因为高阶多项式容易过拟合,而且计算量在嵌入式平台上吃不消。我记得有一次给一个气体传感器做标定,用了 5 阶多项式,结果在端点处剧烈振荡,完全没法用。
| 阶数 | 适用场景 | 注意事项 |
|---|---|---|
| 1 阶(线性) | 线性传感器,如 PT100 | 最简单,最稳定 |
| 2 阶(二次) | 轻微非线性,如 NTC 热敏电阻 | 大多数场景够用 |
| 3 阶(三次) | 明显非线性,如热电偶 | 注意端点效应 |
| ≥4 阶 | 极少使用 | 容易过拟合,慎用 |
警告:多项式拟合时,一定要做交叉验证。把数据分成训练集和验证集,看看模型在未知数据上的表现。否则你拟合出来的可能只是噪声。
4.4 卡尔曼滤波基础:动态标定的利器
前面讲的都是静态标定,也就是传感器在稳定环境下的一次性校准。但实际工作中,传感器会随着时间漂移,或者环境在变化。这时候就需要卡尔曼滤波了。
卡尔曼滤波的核心思想:用上一时刻的状态估计值,结合当前时刻的测量值,得到最优估计。它就像一个聪明的裁判,既相信模型预测,也相信传感器读数,然后取一个加权平均。
基本公式(离散形式):
预测阶段:
x̂ₖ|ₖ₋₁ = A * x̂ₖ₋₁|ₖ₋₁ + B * uₖ
Pₖ|ₖ₋₁ = A * Pₖ₋₁|ₖ₋₁ * Aᵀ + Q
更新阶段:
Kₖ = Pₖ|ₖ₋₁ * Hᵀ * (H * Pₖ|ₖ₋₁ * Hᵀ + R)⁻¹
x̂ₖ|ₖ = x̂ₖ|ₖ₋₁ + Kₖ * (zₖ - H * x̂ₖ|ₖ₋₁)
Pₖ|ₖ = (I - Kₖ * H) * Pₖ|ₖ₋₁
别被这些矩阵吓到。在实际的传感器标定中,我们经常把它简化成一维形式。比如标定一个温度传感器的零点漂移:
// 一维卡尔曼滤波示例
float kalman_filter(float z, float &x, float &P) {
// 预测
float x_pred = x;
float P_pred = P + Q;
// 更新
float K = P_pred / (P_pred + R);
x = x_pred + K * (z - x_pred);
P = (1 - K) * P_pred;
return x;
}
我个人习惯,在嵌入式系统里用卡尔曼滤波时,Q 和 R 这两个参数一定要现场调试。Q 代表模型的不确定性,R 代表测量噪声。调参没有捷径,就是拿着实际数据反复试。
关键认知:卡尔曼滤波不是用来替代线性回归或多项式拟合的。它们是不同层面的工具。线性回归做静态标定,卡尔曼滤波做动态跟踪。两者结合,才是完整的标定方案。
4.5 如何选择标定模型?
说了这么多,到底怎么选?我总结了一个简单的决策流程:
- 先看数据分布:画散点图,判断是线性还是非线性
- 线性就用最小二乘法:简单、稳定、可解释性强
- 非线性就用低阶多项式:从 2 阶开始试,不行再上 3 阶
- 需要动态跟踪就用卡尔曼滤波:特别是传感器有漂移或环境变化时
- 永远做验证:用独立的数据集测试模型效果
我记得有一次给一个工业压力传感器做标定,数据点呈现出明显的二次曲线。我直接用 2 阶多项式拟合,效果非常好。但后来发现,传感器在高温下会额外产生一个偏移。这时候我在多项式基础上,又加了一个卡尔曼滤波器来跟踪温度变化。两个模型配合使用,问题就解决了。
我的建议:别追求复杂的模型。在嵌入式系统里,计算资源和存储空间都有限。能用 1 阶就别用 2 阶,能用 2 阶就别用 3 阶。简单模型往往更鲁棒。
好了,这一章的内容就到这里。下一章我们会讲标定数据的采集策略,包括如何设计标定实验、如何选择标定点、如何处理异常数据。这些都是实战中非常关键的内容。