返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[STM32] 在 单片机上做插值算法——拉格朗日插值

[复制链接]
8424|17
 楼主| 一路向北lm 发表于 2021-1-21 18:24 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2021-1-21 18:39 编辑

#申请原创# 第一步,学你所学,不懂也得懂,最枯燥的数学公式来了     

数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。拉格朗日插值法最早被英国数学家爱德华·华林于1779年发现,不久后(1783年)由莱昂哈德·欧拉再次发现。1795年,拉格朗日在其著作《师范学校数学基础教程》中发表了这个插值方法,从此他的名字就和这个方法联系在一起。








第二步,构造拉格朗日插值算法函数,并使用C/C++ 语言实现

  1. //预先定义插值节点的个数为1000个,根据控制台输入的个数num从而确定插值节点的个数
  2. const int N=1000;
  3. // 拉格朗日插值算法
  4. float lglr(float x[], float y[],int n,float t)
  5. {
  6.      float yResult=0.0;
  7.      //LValue[N]存放的是每次求解的插值基函数的通项
  8.      float LValue[N];
  9.      //循环变量k,m
  10.      int k,m;
  11.      //插值基函数中的上下累乘temp1,temp2
  12.      float temp1,temp2;
  13.      for(k=0;k<n;k++)
  14.      {
  15.          temp1=1.0;
  16.          temp2=1.0;
  17.          for(m=0;m<n;m++)
  18.          {
  19.              if(m==k)
  20.              {
  21.                  continue;
  22.              }
  23.              temp1 *= (t-x[m]);
  24.              temp2 *= (x[k]-x[m]);
  25.          }
  26.          LValue[k]=temp1/temp2;
  27.      }
  28.      for(int i=0;i<n;i++)
  29.      {
  30.          yResult += y[i]*LValue[i];
  31.      }
  32.      return yResult;
  33. }
第三步,测试线性插值效果
1.给写入的算法送入斜线的3个点,来预测此区间的其它点,发现预测出的线性值很好,线性度很饱满。

2.同样是给写入的算法送入正弦曲线3个点,来预测此区间的其它点,发现预测出的正弦曲线不太理想,相关度很差。


3.增加给写入的算法送入正弦曲线的点数到10个点,来预测此区间的其它点,发现预测出的正弦曲线已达到要求,相关度很好。

4.下面是使用matlab在绘制的图像,分别是线性3点、正弦3、5、10的和原始值对比的图像。


第四步,移植到单片机使用串口输出测试插值效果,效果还可以哦!



第四步  进阶完善,有点不甘心,使用Qt 搭了一个界面,做了一下可视化,你别说效果还可以,Qt 界面代码 放到了 gitee
有兴趣的来一起完善  https://gitee.com/lumengcode/my-qt/tree/master/MathTool/MathTool



插值题外话:
关于插值算法:可以继续完善  牛顿插值、三次样条插值等,都很好玩!
@21小跑堂   @21小跑堂    @21小跑堂  


本帖子中包含更多资源

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

×

打赏榜单

21小跑堂 打赏了 10.00 元 2021-01-22
理由:恭喜通过原创文章审核!请多多加油哦!

雪山飞狐D 发表于 2021-1-21 23:45 | 显示全部楼层
可以,MARK,关注
 楼主| 一路向北lm 发表于 2021-1-22 09:45 | 显示全部楼层

感谢支持
xjl85 发表于 2021-1-22 10:04 | 显示全部楼层
学习了,这个做运动控制算法的时候会用到吧
 楼主| 一路向北lm 发表于 2021-1-22 10:20 | 显示全部楼层
xjl85 发表于 2021-1-22 10:04
学习了,这个做运动控制算法的时候会用到吧

很多地方会用  路径算法经常用
coody 发表于 2021-1-22 17:23 | 显示全部楼层
我DIY示波器,用的抛物线插值。
 楼主| 一路向北lm 发表于 2021-1-22 20:30 | 显示全部楼层
coody 发表于 2021-1-22 17:23
我DIY示波器,用的抛物线插值。

可以分享一下哈
crazyren 发表于 2021-1-26 18:00 | 显示全部楼层
楼主试试, 采样点加上一定噪声后会咋样
William1994 发表于 2021-2-1 12:28 | 显示全部楼层
crazyren 发表于 2021-1-26 18:00
楼主试试, 采样点加上一定噪声后会咋样

插值点数越多,抗噪性越差。
dw772 发表于 2021-8-24 23:11 | 显示全部楼层
不错,谢谢分享
xad74 发表于 2021-9-2 08:05 | 显示全部楼层
很好,仔细研究一下
linred 发表于 2021-9-27 01:06 | 显示全部楼层
学习i了,谢谢分享
52mcu 发表于 2021-9-27 20:54 | 显示全部楼层
Qt是用 QChart 绘制的曲线吗?
ifxz0123 发表于 2021-9-29 10:16 | 显示全部楼层
coody 发表于 2021-1-22 17:23
我DIY示波器,用的抛物线插值。

可怜的我,DIY的示波器都没插值,简单粗暴的把相邻的两个点直线连接起来
arima 发表于 2021-10-24 23:01 | 显示全部楼层
期待牛顿插值、三次样条插值续集。。。



qin552011373 发表于 2021-11-3 15:44 | 显示全部楼层
不错不错
ewfrg 发表于 2023-9-5 10:12 | 显示全部楼层
厉害学习了
zwsam 发表于 2024-1-27 09:23 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部