2. 补偿算法数学基础:线性回归、多项式拟合、最小二乘法、插值法
各位同学,欢迎来到压力传感器温度补偿的核心环节。
说实话,传感器原始数据就像个“刺头”——温度一变,它就乱跳。你直接拿它去算压力,误差能大到让你怀疑人生。所以,我们需要一套数学工具来“驯服”它。
这一章,我就带你把这些工具的原理摸透。别怕数学,我会用项目里的例子给你讲明白。
2.1 线性回归:最简单的补偿模型
线性回归,说白了就是找一条直线,让它尽可能穿过所有数据点。为什么先讲它?因为很多传感器的温度特性,在窄温度范围内就是线性的。
我记得有一次做一款工业压力变送器,-10℃到50℃范围内,零位漂移几乎就是一条直线。这时候用线性回归,又快又准。
核心思想:找到 y = ax + b 中的 a 和 b,让所有点到这条直线的“距离平方和”最小。
公式长这样:
a = (n∑xy - ∑x∑y) / (n∑x² - (∑x)²)
b = (∑y - a∑x) / n
嗯,看着有点晕?我当年也晕。但你想想看,在代码里实现就几行的事:
// 线性回归计算斜率a和截距b
float linear_regression(float *x, float *y, int n) {
float sum_x = 0, sum_y = 0, sum_xy = 0, sum_x2 = 0;
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
}
float a = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x);
float b = (sum_y - a * sum_x) / n;
return a; // 返回斜率,截距b可以单独用
}
我的经验:用线性回归前,先画个散点图看看。如果点明显弯了,就别硬套直线,否则补偿完比不补偿还差。
2.2 多项式拟合:对付非线性漂移
但现实往往不完美。温度范围一宽,比如-40℃到85℃,零位和灵敏度漂移就变成曲线了。这时候线性回归就不够用了。
怎么办?用多项式拟合。说白了,就是用一条曲线去贴合数据点。
二次多项式长这样:
y = a₀ + a₁x + a₂x²
三次多项式:
y = a₀ + a₁x + a₂x² + a₃x³
我个人的习惯是:能用二次就别用三次。为什么?因为次数越高,计算量越大,而且容易“过拟合”——就是曲线在数据点上抖得厉害,中间反而跑偏了。
避坑指南:我曾经在一个项目里用了五次多项式,结果在-20℃附近补偿值突然跳变,查了两天才发现是过拟合。后来老老实实改回二次,问题解决。
多项式系数的计算,一般用最小二乘法来解。我们接着看。
2.3 最小二乘法:拟合的“裁判员”
最小二乘法不是一种具体的拟合方法,它是所有拟合方法的“裁判员”。它的判据很简单:让所有数据点的误差平方和最小。
为什么是平方?不是绝对值?
嗯,这里有个小门道。平方放大了大误差的惩罚力度,让拟合曲线更“照顾”那些偏离大的点。绝对值的话,大误差和小误差的惩罚差不多,拟合效果反而不好。
对于多项式拟合,最小二乘法会形成一个方程组:
| 数据点数 | 拟合阶数 | 方程组规模 |
|---|---|---|
| 10 | 2次 | 3个方程 |
| 20 | 3次 | 4个方程 |
| 50 | 4次 | 5个方程 |
你看,数据点再多,方程组规模只跟阶数有关。这就是最小二乘法的魅力——用少量参数描述大量数据。
实际应用:在STM32上做二次多项式补偿,整个计算只需要几十微秒,完全不影响实时性。
2.4 插值法:查表补偿的利器
有时候,我们不想算复杂的多项式。尤其是MCU资源紧张的时候,多项式计算里的浮点乘法挺费时间的。
这时候,插值法就派上用场了。说白了就是:先测一批温度点的补偿值,存成表格。实际工作时,根据当前温度,在表格里“插”出对应的补偿值。
最常用的是线性插值:
y = y₁ + (x - x₁) * (y₂ - y₁) / (x₂ - x₁)
举个例子,温度在25℃时补偿值是0.5,在50℃时补偿值是1.2。那37.5℃的补偿值就是:
y = 0.5 + (37.5 - 25) * (1.2 - 0.5) / (50 - 25) = 0.85
我的建议:插值法的精度取决于表格的密度。温度点间隔5℃以内,线性插值就够用。如果间隔超过10℃,建议用三次样条插值,但计算量会大一些。
插值法最大的好处是:不需要拟合,不需要计算系数。你只需要把标定数据存好,运行时查表就行。我在一个低功耗项目中就这么干,省掉了浮点运算单元,成本降了不少。
2.5 知识体系总览
说了这么多,我把这四种方法的关系画了张图,方便你理解:
这张图把四种方法的关系和适用场景都串起来了。你写代码前,先对着这张图想想:我的温度范围有多宽?MCU算力够不够?精度要求多高?想清楚了再选方法。
总结一下:线性回归是基础,多项式拟合对付非线性,最小二乘法是背后的数学原理,插值法适合资源受限的场景。这四种工具,你至少得熟练掌握两种,才能在项目中游刃有余。