搜索
bottom↓
回复: 24

请教,stm32可以拟合成线性度很好的数据吗

[复制链接]

出1310入193汤圆

发表于 2024-1-27 20:11:05 来自手机 | 显示全部楼层 |阅读模式
10个点采集数据,控制板外接一款传感器模拟量0~10v,ad采集之后,要拟合成为线性度很好数据,坛友看看,有没有可能实现。数据

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入76汤圆

发表于 2024-1-27 20:52:00 | 显示全部楼层
线性拟合不就得了, 实际效果要自己测了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出1310入193汤圆

 楼主| 发表于 2024-1-27 22:29:56 来自手机 | 显示全部楼层
X Value        Calculated Y        Ideal Y
0.01        -0.29                0.00
1.48        1.27                0.66
2.60        2.46                1.33
3.67        3.59                2.00
4.71        4.70                2.66
5.70        5.75                3.33
6.59        6.69                4.00
7.39        7.54                4.66
8.08        8.27                5.33
8.67        8.90                6.00
9.12        9.37                6.66
9.40        9.67                7.33
9.60        9.88                8.00
9.75        10.04                8.66
9.87        10.17                9.33
9.96        10.27                10.00

按照ls公式进行运算得出值:Calculated Y       
线性度不如你的好。啥情况

出40入518汤圆

发表于 2024-1-28 00:17:18 | 显示全部楼层
11个点,分成10段线性,精度也不够吗?

出200入2554汤圆

发表于 2024-1-28 01:15:52 | 显示全部楼层
本帖最后由 t3486784401 于 2024-1-28 01:19 编辑

分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入31汤圆

发表于 2024-1-28 08:14:49 | 显示全部楼层
有点迷糊,传感器是线性的吗?拟合成线性本身不存在问题,问题在于是否适合拟合成线性。如果是我,先找100个传感器(多样本),每个传感器测10组以上数据(单个样本多次测量,减少随机误差),先看看传感器特性再进一步选择如何拟合比较合适,

出0入90汤圆

发表于 2024-1-28 09:26:20 | 显示全部楼层
用:最小二乘法

出300入477汤圆

发表于 2024-1-28 10:20:25 来自手机 | 显示全部楼层
你这根本就不是线性啊,明明像个有点弯的多项式。
除掉0那个点以外,别的点估计用个3阶就够完美的拟合了。
或者如果你知道人家内部的电路原理,也可能可以用其它样子的公式来拟合,比如带有除号,自变量在除数里(可变电阻跟别的东西并联),或者带指数的(ntc就是)

出0入300汤圆

发表于 2024-1-28 18:20:22 | 显示全部楼层
redroof 发表于 2024-1-28 10:20
你这根本就不是线性啊,明明像个有点弯的多项式。
除掉0那个点以外,别的点估计用个3阶就够完美的拟合了。
...
(引用自8楼)

不就是线性吗,我画一条直线要多直就多直

出300入477汤圆

发表于 2024-1-28 19:37:53 来自手机 | 显示全部楼层
ibmx311 发表于 2024-1-28 18:20
不就是线性吗,我画一条直线要多直就多直
(引用自9楼)

实际数据不线性啊,所以正确的做法应该是用个多项式插值。
看起来这个曲线的曲率是单调的,总是凸的,所以还算好,很可能2-3阶就足够了

出1310入193汤圆

 楼主| 发表于 2024-1-28 21:27:20 来自手机 | 显示全部楼层
stm32F1单片机进行拟合,结果总是不如意。
理想中达到二楼效果,
实际上尾端很难搞。

出1310入193汤圆

 楼主| 发表于 2024-1-28 21:28:56 来自手机 | 显示全部楼层
redroof 发表于 2024-1-28 19:37
实际数据不线性啊,所以正确的做法应该是用个多项式插值。
看起来这个曲线的曲率是单调的,总是凸的,所 ...

(引用自10楼)

多项式差值实验了,
有可能是方法不对,线性度还是很差。

出300入477汤圆

发表于 2024-1-28 21:48:19 来自手机 | 显示全部楼层
lb0857 发表于 2024-1-28 21:28
多项式差值实验了,
有可能是方法不对,线性度还是很差。

(引用自12楼)


excel可以直接做多项式拟合啊,上面有人都发了。你去掉第一个点试试,3阶很可能就够了

出20入67汤圆

发表于 2024-1-28 21:57:18 来自手机 | 显示全部楼层
t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...

(引用自5楼)


有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法

出200入2554汤圆

发表于 2024-1-28 22:07:26 | 显示全部楼层
autolog 发表于 2024-1-28 21:57
有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法
(引用自14楼)

这得看楼主自己的目的。

至少这么多层楼了,还没说明白是要 在线拟合 还是 离线拟合

出1310入193汤圆

 楼主| 发表于 2024-1-29 08:44:34 | 显示全部楼层
autolog 发表于 2024-1-28 21:57
有没有可能,楼主问的是用stm32来拟合😁
也就是用C语言写拟合算法
(引用自14楼)

主机是stm32f1  做主控
就是这芯片用C语言写拟合算法

出300入477汤圆

发表于 2024-1-29 08:58:04 来自手机 | 显示全部楼层
lb0857 发表于 2024-1-29 08:44
主机是stm32f1  做主控
就是这芯片用C语言写拟合算法

(引用自16楼)

别人问你的意思是,你人工采样10个点,然后丢到excel里算岀一条正确的拟合曲线,然后把这些曲线系数放到板子里用,这样是否可以?
或者你需要板子自己根据不同的10个已知点来计算拟合曲线的系数?

出0入0汤圆

发表于 2024-1-29 09:29:54 | 显示全部楼层
t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...
(引用自5楼)

果然是大侠,

我又学到了一招:excel做拟合公式

出0入309汤圆

发表于 2024-1-29 10:34:43 | 显示全部楼层
lb0857 发表于 2024-1-29 08:44
主机是stm32f1  做主控
就是这芯片用C语言写拟合算法
(引用自16楼)

STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要强调STM32。你需要的是C的拟合代码。

User

I have x = 1,2,3,4,5,6,7,8,9,10,11, and y = 0.01,1.1,2.77,4.3,5.68,6.87,7. 88,8.7,9.34,9. 85,10.21
I need linear regression code in C

Certainly! Here's the C code for linear regression using the given data:

c
  1. #include <stdio.h>

  2. // Function to calculate the mean of an array
  3. float calculateMean(float arr[], int n) {
  4.     float sum = 0.0;
  5.     for (int i = 0; i < n; i++) {
  6.         sum += arr[i];
  7.     }
  8.     return sum / n;
  9. }

  10. // Function to calculate the slope (m) of the line
  11. float calculateSlope(float x[], float y[], int n) {
  12.     float sumXY = 0.0, sumX = 0.0, sumY = 0.0, sumX2 = 0.0;

  13.     for (int i = 0; i < n; i++) {
  14.         sumXY += x[i] * y[i];
  15.         sumX += x[i];
  16.         sumY += y[i];
  17.         sumX2 += x[i] * x[i];
  18.     }

  19.     return (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
  20. }

  21. // Function to calculate the intercept (c) of the line
  22. float calculateIntercept(float x[], float y[], int n, float slope) {
  23.     float meanX = calculateMean(x, n);
  24.     float meanY = calculateMean(y, n);

  25.     return meanY - slope * meanX;
  26. }

  27. int main() {
  28.     // Given data
  29.     float x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
  30.     float y[] = {0.01, 1.1, 2.77, 4.3, 5.68, 6.87, 7.88, 8.7, 9.34, 9.85, 10.21};

  31.     // Number of data points
  32.     int n = sizeof(x) / sizeof(x[0]);

  33.     // Calculate slope and intercept
  34.     float slope = calculateSlope(x, y, n);
  35.     float intercept = calculateIntercept(x, y, n, slope);

  36.     // Print the equation of the line (y = mx + c)
  37.     printf("Equation of the line: y = %.2fx + %.2f\n", slope, intercept);

  38.     return 0;
  39. }
复制代码


Replace the existing x and y arrays with your given data. The program will calculate the slope and intercept of the line that best fits the data and print the equation of the line.

随便拿个在线编译器跑一下,结果是 Equation of the line: y = 1.06x + -0.30。和2楼结果一致。

出0入0汤圆

发表于 2024-1-29 10:52:02 | 显示全部楼层
https://www.bilibili.com/video/B ... a1e9cba6c97eaafcec7

出1310入193汤圆

 楼主| 发表于 2024-1-29 11:39:27 来自手机 | 显示全部楼层
iamseer 发表于 2024-1-29 10:34
STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要 ...

(引用自19楼)

谢谢啦
我稍后验证去

出0入0汤圆

发表于 2024-1-29 13:02:22 | 显示全部楼层
t3486784401 发表于 2024-1-28 01:15
分段就不说了,多项式也挺香的啊。 实测到 5 阶就看起来很像样了,R^2 有四个九:

...
(引用自5楼)

请问下大佬,离线拟合后,单片机能跑起来这五阶的公式吗

出200入2554汤圆

发表于 2024-1-29 13:17:35 | 显示全部楼层
zhangling520 发表于 2024-1-29 13:02
请问下大佬,离线拟合后,单片机能跑起来这五阶的公式吗
(引用自22楼)

就几个浮点乘法,有啥不行的。 当然你要限定计算时间、提高 fps 有可能速度不够。
十来次浮点运算,就算再慢的 51 差不多 10ms 也足够折腾了。

跑拟合(计算方程参数)运算量比这个大多了,所以一般放在 PC 上跑拟合;
在 MPU 端一般只运行简单的多项式计算。如果还要加速,甚至需要退化到查表。

出200入2554汤圆

发表于 2024-1-29 13:21:57 | 显示全部楼层
iamseer 发表于 2024-1-29 10:34
STM32和电脑跑C有什么区别?是不支持浮点?还是内存不够?还是CPU速度不行?
如果这些没区别,你没有必要 ...
(引用自19楼)

所以说楼主一直没明确,是否需要现场拟合。

比如有多个系统,需要现场识别不同系统参数,输出不同的拟合方程,这时候就要 MPU 端进行拟合;
但更多情况下是固定系统,做几套实验把拟合方程算出来就行,现场 MPU 顶多是对拟合方程应用下,这种就可以离线算。

出0入300汤圆

发表于 2024-1-29 16:16:46 来自手机 | 显示全部楼层
stm32 的算力和电脑有可比性吗,一个是百十兆的速度一个是四五G的速度,而且电脑都是多核的。电脑电源的功率已经决定一切了,厂里上个月装了几台电脑电源都是1000w的,四年前我负责装的电脑电源也是550W的,stm32才能用几个电
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 17:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表