最小二乘法的应用-C语言实现线损电压补偿
最小二乘法的应用-C语言实现线损电压补偿-一段不可精确测出的回路电阻
最小二乘法的基本原理
转载了 马同学的高等数学 的文章如何理解最小二乘法?
一段不可精确测出的回路电阻
这一段回路走2A左右的电流, 但回路上的电阻暂时无法精确测量出来;
这段回路上的线损实际上是相当可观的; 可Adc检测VBAT_SW的网络换算出来的电压加上脑补出来手动补偿线损 的电压就达不到甲方爸爸客户的误差要求;
回路电阻的实验数据
其实把数据测出来并不是最大的问题, 重点在于应用到实际工况;
线损deltaU = Ireal * Rreal; 电子负载一接, 负载调出两个档位,
这段回路的电阻值的范围差不多就出来了, 好像真的不需要费那么大的劲去搞这个最小二乘法喔;
唔, 是的, 电路设计并没有考虑线损的事情, 这个电流Ireal没有器件去测也没有Adc检测;
也就是说, 使用电子负载直接把这个回路的电阻值范围算出来, 实际也就是测出数据而已没什么卵用;
通过中间层把两个存在线性关系的可检测对象关联起来
此处应用两个线性关系的关联
- 输入侧的线损deltaU与输入电流Ireal(无Adc检测, 可通过万用表/电流钳等方式测出);
- 输入电流Ireal与负载功率InputPower(可由Adc检测的VrailA和InputCurrent计算出);
很显然, 线性关系是可以传递的
线损deltaU ==> 输入电流Ireal ==> 负载功率InputPower;
而输入电流Ireal作为一个中间变量, 实际应用并不需要把Ireal测出来,
因为线性关系可以直接变为
线损deltaU ==> 负载功率InputPower;
数据
- 明确了测试需求, 两组测试数据为
Group | X轴 | Y轴 |
---|---|---|
1 | 输入电流Ireal | 线损deltaU |
2 | 输入电流Ireal | 负载功率InputPower |
- 输出目标数据为Group3的对应关系
Group | X轴 | Y轴 |
---|---|---|
3 | 负载功率InputPower | 线损deltaU |
测试数据Group1(currentDeltaVbat.txt)
Group1 | 输入电流Ireal | 线损deltaU |
---|---|---|
0 | 100 | 10 |
1 | 300 | 30 |
2 | 500 | 40 |
3 | 800 | 70 |
4 | 1000 | 80 |
5 | 1200 | 100 |
6 | 1500 | 130 |
7 | 1800 | 150 |
8 | 2000 | 170 |
9 | 2200 | 190 |
10 | 2400 | 210 |
测试数据Group2(currentWInputPower.txt)
Group2 | 输入电流Ireal | 负载功率InputPower |
---|---|---|
0 | 403 | 3300 |
1 | 457 | 3890 |
2 | 498 | 4350 |
3 | 723 | 6820 |
4 | 632 | 5910 |
5 | 1880 | 17860 |
6 | 2022 | 19500 |
7 | 2089 | 19875 |
8 | 2112 | 20050 |
9 | 2263 | 21100 |
10 | 2400 | 22050 |
使用matlab验证
事实上, y= ax + b; 这个完全是可以使用matlab的polyfit可以直接计算出相应的系数的;
但是, 因为这里的应用是单片机, 还是需要做一定的调整, 力求数据更准确;
这里只做数据验证工作;
% currentDeltaVbat.m
% 读取currentDeltaVbat.txt, 数据保存到矩阵A;
% 第一列current数据为x轴, 第二列deltaVbat数据为y轴;
A = load('currentDeltaVbat.txt');
x = A(:, 1);
y = A(:, 2);
B = polyfit(x, y, 1)
figure(1)
plot(x, y, 'r-..');
% 使用拟合出来的系数, 重新生成数据, 对比
C = polyval(B, x);
hold
% figure(2)
plot(x, C(:, 1), 'b-..');
% EOF currentDeltaVbat.m
currentDeltaVbat原始数据与拟合数据对比
% currentWInputPower.m
% 读取currentWInputPower.txt, 数据保存到矩阵K;
% 第一列current数据为u轴, 第二列deltaVbat数据为v轴;
K = load('currentWInputPower.txt');
u = K(:, 1);
v = K(:, 2);
L = polyfit(u, v, 1)
figure(2)
plot(u, v, 'r-..');
% 使用拟合出来的系数, 重新生成数据, 对比
M = polyval(L, u);
hold
% figure(2)
plot(u, M(:, 1), 'b-..');
% EOF currentWInputPower.m
currentWInputPower原始数据与拟合数据对比
Ok, 现在原始数据也有了, 接下来进入代码篇3; C语言求出最小二乘法的系数