在 单片机上做插值算法——拉格朗日插值
本帖最后由 一路向北lm 于 2021-1-21 18:39 编辑#申请原创# 第一步,学你所学,不懂也得懂,最枯燥的数学公式来了
在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。拉格朗日插值法最早被英国数学家爱德华·华林于1779年发现,不久后(1783年)由莱昂哈德·欧拉再次发现。1795年,拉格朗日在其著作《师范学校数学基础教程》中发表了这个插值方法,从此他的名字就和这个方法联系在一起。
static/image/hrline/1.gif
第二步,构造拉格朗日插值算法函数,并使用C/C++ 语言实现
//预先定义插值节点的个数为1000个,根据控制台输入的个数num从而确定插值节点的个数
const int N=1000;
// 拉格朗日插值算法
float lglr(float x[], float y[],int n,float t)
{
float yResult=0.0;
//LValue存放的是每次求解的插值基函数的通项
float LValue;
//循环变量k,m
int k,m;
//插值基函数中的上下累乘temp1,temp2
float temp1,temp2;
for(k=0;k<n;k++)
{
temp1=1.0;
temp2=1.0;
for(m=0;m<n;m++)
{
if(m==k)
{
continue;
}
temp1 *= (t-x);
temp2 *= (x-x);
}
LValue=temp1/temp2;
}
for(int i=0;i<n;i++)
{
yResult += y*LValue;
}
return yResult;
}
第三步,测试线性插值效果
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小跑堂
可以,MARK,关注 雪山飞狐D 发表于 2021-1-21 23:45
可以,MARK,关注
感谢支持 学习了,这个做运动控制算法的时候会用到吧 xjl85 发表于 2021-1-22 10:04
学习了,这个做运动控制算法的时候会用到吧
很多地方会用路径算法经常用 我DIY示波器,用的抛物线插值。 coody 发表于 2021-1-22 17:23
我DIY示波器,用的抛物线插值。
{:biggrin:} 可以分享一下哈 楼主试试, 采样点加上一定噪声后会咋样 crazyren 发表于 2021-1-26 18:00
楼主试试, 采样点加上一定噪声后会咋样
插值点数越多,抗噪性越差。 不错,谢谢分享 很好,仔细研究一下 学习i了,谢谢分享 Qt是用 QChart 绘制的曲线吗? coody 发表于 2021-1-22 17:23
我DIY示波器,用的抛物线插值。
可怜的我,DIY的示波器都没插值,简单粗暴的把相邻的两个点直线连接起来 期待牛顿插值、三次样条插值续集。。。
不错不错 厉害学习了
页:
[1]