应用最小二乘法C语言实现线损电压补偿--应用场景2

最小二乘法的应用-C语言实现线损电压补偿-一段不可精确测出的回路电阻

最小二乘法的基本原理

转载了 马同学的高等数学 的文章如何理解最小二乘法?

一段不可精确测出的回路电阻

这一段回路走2A左右的电流, 但回路上的电阻暂时无法精确测量出来;
这段回路上的线损实际上是相当可观的; 可Adc检测VBAT_SW的网络换算出来的电压加上 脑补出来 手动补偿线损 的电压就达不到 甲方爸爸 客户的误差要求;

回路电阻测不准

回路电阻的实验数据

其实把数据测出来并不是最大的问题, 重点在于应用到实际工况;

线损deltaU = Ireal * Rreal; 电子负载一接, 负载调出两个档位,
这段回路的电阻值的范围差不多就出来了, 好像真的不需要费那么大的劲去搞这个最小二乘法喔;

唔, 是的, 电路设计并没有考虑线损的事情, 这个电流Ireal没有器件去测也没有Adc检测;
也就是说, 使用电子负载直接把这个回路的电阻值范围算出来, 实际也就是测出数据而已 没什么卵用 ;

通过中间层把两个存在线性关系的可检测对象关联起来

此处应用两个线性关系的关联

  1. 输入侧的线损deltaU与输入电流Ireal(无Adc检测, 可通过万用表/电流钳等方式测出);
  2. 输入电流Ireal与负载功率InputPower(可由Adc检测的VrailA和InputCurrent计算出);

很显然, 线性关系是可以传递的

线损deltaU ==>  输入电流Ireal ==>  负载功率InputPower;

而输入电流Ireal作为一个中间变量, 实际应用并不需要把Ireal测出来,
因为线性关系可以直接变为

线损deltaU ==> 负载功率InputPower;

在这里插入图片描述

数据

  1. 明确了测试需求, 两组测试数据为
Group X轴 Y轴
1 输入电流Ireal 线损deltaU
2 输入电流Ireal 负载功率InputPower
  1. 输出目标数据为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原始数据与拟合数据对比
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原始数据与拟合数据对比
currentWInputPower原始数据与拟合数据对比

Ok, 现在原始数据也有了, 接下来进入代码篇3; C语言求出最小二乘法的系数

求出最小二乘法的系数

代码篇3

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读