用python实现拉格朗日插值,python线性插值函数

  用python实现拉格朗日插值,python线性插值函数

  这是一个非常简单的数学工具。有些问题可能只用简单的数学工具就能解决。

  线性插值法线性插值法是一种通过使用连接两个已知量的直线来确定两个已知量之间未知量的值的方法。

  与抛物线插值等其他插值方法相比,线性插值简单方便。

  线性插值可以用来近似代替原函数,也可以用来计算在得到查找表的过程中不在查找表中的值。它是实现精确快速查找表的一种非常好的方法。

  将x0和x1中y=f(x)的值分别设为y0和y1,求多项式:

  y=1(x)=A0 a1 xy=(var phi _ 1)left)x)right)a _ 0a _ 1xy=1)x)=a0a1x

  满意:

  1(x0),1 ) x1 )=y1(varphi_1)左)x_0(右),y_0,)varphi_1)左)x_1)右

  得到

  y=1(x )=y0y1y0

  x 1 x 0(x x 0)y=\ var phi _ 1 \ left(x \ right)=y _ 0 \ frac { y _ 1-y _ 0 } { x _ 1-x _ 0 } \ left(x-x _ 0 \ right)y=1(x)=y0 x1 x0 y1 y0(x x0)

  所以可以直接得到Y。我们需要满足x在x0和x1之间。假设x不在x0和x1之间,公式也满足,这叫线性外推。

  其实是一元线性方程,y=kx b,我们需要计算的只是斜率k和截距b,通过这个一元线性方程,计算出区间内x对应的y。

  线性插值示例ntc电阻温度测量

  ntc的温度曲线近似于一个数学表达式,但需要在math.h中使用,占用资源,计算速度慢。可以使用线性插值,例如仅0-100度。保存一百个数据和对应的adc值,然后根据测得的adc进行插值。

  速度规划

  知道目标速度和加速度,根据这个速度反馈设定下一个速度。

  分段pid

  对应于速度阈值的序列和对应于pid的序列是已知的。根据速度反馈,或给定速度,进行插补计算,使pid更加平滑。

  图像中的线性插值、双线性插值和三线性插值。处理二维和三维图像

  还是很多。

  编程输入曲线的xy表,用二分法求区间,用公式计算区间中x的值。程序。h:

  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @版权所有2020-2021年,王崇伟* @文件名:linear _ interp.h * @作者:王崇伟* @版本:0 .1 .1 * @最后日期:2021 .8 .14 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */# if ndef _ LINEAR _ INTERP _ H _ # define _ LINEAR _ INTERP _ H _ # include初始化曲线void(* Init)(struct linear interp * self,float *arr_x,float *arr_y,uint 32 _ t size); //调用计算float(* Cal)(struct linear interp * self,float val);飘出;struct { float * arr _ x;float * arr _ y;int32_t大小;} pvt }void线性interp _ Create(struct linear interp * self);# ifdef _ _ cplusplus } # endif # endif/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * @版权所有(三)2020-2021年,王聪伟* @文件名:linear _ interp.c * @作者:wangc丛微* @版本:0。1 .1 * @ LastDate:2021。8 .14 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * .包括 linear _ interp。h self-PVT . arr _ y=arr _ y;自我PVT。size=size;} static float _ Cal(struct linear interp * self,float val){ int32_t left=0,mid=0;int 32 _ t right=self-PVT . size-1;浮点数x0,y0,x1,y1;//二分法while(left=right){ mid=(left right)/2;if(valself-PVT . arr _ x[mid])right=mid-1;else if(self-PVT . arr _ x[mid]val)left=mid 1;else break} //头尾检测if(mid==(self-PVT . size-1)){ mid=mid-1;} else if(mid==0){ mid=0;} else { mid=(self-PVT . arr _ x[mid]=val)?mid:中1;//中间二分查找出现的情况} //3.线性插值x0=self-PVT . arr _ x[mid];y0=自我PVT . arr _ y[mid];x1=自PVT . arr _ x[mid 1];y1=self-PVT . arr _ y[mid 1];自出=y0((y1-y0)*(val-x0))/(x1-x0));返回自出;} void linear interp _ Create(struct linear interp * self){ memset(self,0,sizeof(struct linear interp));自我初始化=_初始化;self-Cal=_ Cal;} 测试:

  float arr_x[5]={1,5,8,13,17 };float arr_y[5]={4,45,10,40,20 };浮动资源;线性interp _ Create(line _ interp);line_interp .Init(line_interp,arr_x,arr_y,5);res=line_interp .Cal(line_interp,6);qDebug()插值结果: res插值结果: 33.3333 我按一的步长,从-10-30的区间进行插值,画图:

  代码肯定还有很多优化的地方,计算时间,内存,效率。都应该考虑,但是在考虑都通用的情况下,必然会舍去一些。

  比如优化:提前计算出每个区间的斜率和截距。查找到后,只需要做一次乘法和加法。

  博客地址:

  https://gitee.com/wang_chong_wei/qt_wave.git

  被抛弃的写随笔公众号改写技术文章了,感兴趣的可以关注公众号:mldxt

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: