你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验之谈】基于STM32在单片机上做插值算法——拉格朗日插值的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-12 14:00

第一步,学你所学,不懂也得懂,最枯燥的数学公式来了     $ k2 x; f2 l3 E6 O. F! M

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

/ c3 ]: J2 a/ x+ B  r4 i  I8 J+ |1 v7 ]& m8 w6 T
) X( ]; D& _# b) b6 ^0 v
3 U. }/ m) w. x8 u. l: Q0 k

7 w2 @% {7 d5 Q" \4 ?* W' C1 C ) [8 @" g  Y% E9 V
第二步,构造拉格朗日插值算法函数,并使用C/C++ 语言实现

' J! K& a" E) `/ \- n1 |

  1. //预先定义插值节点的个数为1000个,根据控制台输入的个数num从而确定插值节点的个数% }( R6 j; H9 b: K
  2. & u7 v  F; M* E7 ]
  3. const int N=1000;6 b7 D0 O1 I7 m% k2 Y
  4. + o* M8 M" c) {+ F# c
  5. // 拉格朗日插值算法
    - ]5 }* x2 g6 r3 U$ G+ \
  6. 0 e4 I8 x' f7 a
  7. float lglr(float x[], float y[],int n,float t)( L% O3 t  g3 I

  8. ! A7 W# Y; t3 Y0 r& g  b. D/ E3 @
  9. {
    7 y  G: z0 @; r" {, E0 I: n

  10. 9 i5 n8 w7 c! L# I
  11.      float yResult=0.0;9 N  p0 ^& f% d
  12. - m/ X, s3 Q5 l! g7 b" f: ?. X
  13.      //LValue[N]存放的是每次求解的插值基函数的通项* x" T% B! x' z
  14. % P9 {5 c8 u6 f) m
  15.      float LValue[N];, B$ O! J6 K8 w3 r7 q

  16. : V% D/ u) M9 Y) |$ g
  17.      //循环变量k,m9 _+ j+ S. ~  t$ |1 h- [) P: q
  18. 4 g+ i0 b" j& T) A; z
  19.      int k,m;5 h( ]+ J" S$ `$ k
  20. % o9 h8 ]* }# f0 P6 R, Q8 p8 l
  21.      //插值基函数中的上下累乘temp1,temp2, T4 a' g+ a2 K8 v# B6 s
  22.   G' d6 i* f: i4 N
  23.      float temp1,temp2;; x" D& t& j& b5 V5 g) W

  24. 0 X# c+ U& w4 {4 N# k
  25.      for(k=0;k<n;k++)* K' T) [1 `+ t" h6 A  a/ O
  26. 5 k5 }1 |% h$ ^+ d6 w# h! _( x1 {/ F
  27.      {$ h9 d5 \7 d5 f8 W) L3 ^
  28. / f& a6 H3 S7 r: u$ m
  29.          temp1=1.0;
    ; U: j' P' C: V# X2 M

  30. & D/ m/ ?8 h0 \4 F* X
  31.          temp2=1.0;; [" E3 ^- m* V" u. A

  32. + }  h) j3 H) L, e7 W' d: t, A9 I
  33.          for(m=0;m<n;m++)
    5 N) r. K& \) T
  34. 3 m, O9 I! t3 j! X
  35.          {& ]3 O* L' j1 b

  36. % g1 `2 y; s2 F8 n- ^0 [, }; o7 z5 v
  37.              if(m==k)3 L) Q( `0 |+ d: p0 K/ Y* W8 H
  38. , N- A8 o( \. J6 v9 X
  39.              {
    8 a7 h1 X" Q/ m) L1 i

  40. " E( H$ j5 S8 @2 j
  41.                  continue;
    ' L3 w- z7 z9 f) `
  42. $ L2 q% s3 L4 {" }# _
  43.              }, q% Q$ S: i7 v9 a
  44. $ B) J9 D$ s3 v0 \
  45.              temp1 *= (t-x[m]);8 ~2 c+ e! T. U) `1 V0 t

  46. $ Q* Z- [" V. ?) l, O
  47.              temp2 *= (x[k]-x[m]);
    & Z9 w0 n' g! A8 N# T  F# g
  48. : ~: a* D$ U( ~0 j" j
  49.          }% m5 A  I8 ~' M7 \, I

  50. ( p* s$ ]( U$ J& ~
  51.          LValue[k]=temp1/temp2;$ A# O1 j) y" U3 r
  52. % C% z' q; z( @6 c; M! o8 j3 t
  53.      }5 {9 i% H* D7 _0 [5 G6 w8 y+ x* U
  54. % C* a3 V0 \2 F- j8 D: k0 G( ?3 ]
  55.      for(int i=0;i<n;i++)
    - d/ ?8 P8 Y( W' e

  56. ; j2 a* P3 M+ w: `+ l! ^  b( o
  57.      {4 f$ O% S0 @& j, O
  58. 1 C6 x' f. U5 z# z3 ~( b
  59.          yResult += y*LValue;  t# e: t% W6 d2 |& l: ]2 @# k
  60. # n. g1 D9 f, p% _5 m) O/ V
  61.      }
    , a+ P1 ?9 I. l7 E/ e- ?5 b
  62.   A* r1 w3 H" q3 r1 f
  63.      return yResult;! M9 d& ]  r. h5 f2 b  e; ?. C/ F
  64. 7 n4 ~0 V" L9 W5 n! J# U( d
  65. }; P8 r& r1 L% G6 H1 {

  66. ) h6 Z( A6 b8 q$ I1 F) H5 c- g
复制代码


' j; p- `& p6 p4 K2 M& }2 D, W

第三步,测试线性插值效果

1.给写入的算法送入斜线的3个点,来预测此区间的其它点,发现预测出的线性值很好,线性度很饱满。


* k+ Z4 v% y3 R0 ^2.同样是给写入的算法送入正弦曲线3个点,来预测此区间的其它点,发现预测出的正弦曲线不太理想,相关度很差。
+ _. \: l$ [* z8 E) F1 a* @: f8 A- d: O7 ]4 _' p
* n, W5 m0 z, M9 e" L& o& Y. n
3.增加给写入的算法送入正弦曲线的点数到10个点,来预测此区间的其它点,发现预测出的正弦曲线已达到要求,相关度很好。
! X+ b1 w" k8 k+ `
/ I- X. c; l- ^0 w4.下面是使用matlab在绘制的图像,分别是线性3点、正弦3、5、10的和原始值对比的图像。8 s- p# M, ?+ l4 ^
; e6 k5 h7 [7 \: W2 b" G$ |
) c! B# w9 H6 {. `
第四步,移植到单片机使用串口输出测试插值效果,效果还可以哦!
' x( u! ^6 l7 E
; M2 j0 }. L: ?, S! M
7 }$ G8 N+ i: x$ [; _3 `
2 \) ^7 v8 }3 L+ h' U第四步  进阶完善,有点不甘心,使用Qt 搭了一个界面,做了一下可视化,你别说效果还可以,Qt 界面代码 放到了 gitee) `6 `9 P' t# u' H; O2 B& _
有兴趣的来一起完善  % p  s# C7 Y* h& h/ u% m7 Y2 J- e

, E7 D( m2 k+ M2 `
' ]" O+ y: y! a1 Y
9 }7 V* ]! w& d1 Y2 I  Y插值题外话:
) [  b: l# x) D  f) Y关于插值算法:可以继续完善  牛顿插值、三次样条插值等,都很好玩!
2 \& E# T; D) {1 s+ ~% {---------------------( L2 l  ]; _, U$ ^, x; p- P# D9 o
作者:一路向北lm

赞 收藏 1 评论0 发布时间:2022-12-12 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版