这是个很简单的数学工具。有的问题可能就只需要简单的数学工具就能解决。

线性插值

线性插值法:是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。

线性插值相比其他插值方式,如抛物线插值,具有简单、方便的特点。

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

设y=f(x) 在x0 和x1上值分别为,y0,y1,求多项式:
y=φ1(x)=a0+a1xy=\varphi _1\left( x \right) =a_0+a_1x y=φ1​(x)=a0​+a1​x
满足:
φ1(x0)=y0,φ1(x1)=y1\varphi _1\left( x_0 \right) =y_0,\varphi _1\left( x_1 \right) =y_1 φ1​(x0​)=y0​,φ1​(x1​)=y1​
得到
y=φ1(x)=y0+y1−y0x1−x0(x−x0)y=\varphi _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。

线性插值举例

  1. ntc电阻测温度
    ntc的温度曲线近似成一个数学表达式,但是需要用到math.h中的,占资源,计算慢。可以用线性插值的方法,比如只需要0-100度。保存一百个数据,以及对应的adc的值,之后根据测的adc进行插值。

  2. 速度规划
    知道目标速度,加速度,根据这次速度反馈,设定下次速度给定。

  3. 分段pid
    已知对应速度阈值的序列,以及对应pid的序列。根据速度反馈,或者速度给定,进行插值计算,让pid的更平滑。

  4. 图像里的线性插值,双线性插值,三线性插值。处理二维三维的图像

还很多。

程序设计

  1. 传入曲线的xy的表格
  2. 利用二分法查找区间
  3. 利用公式理计算区间内x的值

程序.h:

/**************************************************************** @Copyright(C)    2020-2021, wangchongwei* @FileName:       linear_interp.h* @Author:         wangchongwei* @Version:        0.1.1* @LastDate:       2021.8.14************************************************************/
#ifndef _LINEAR_INTERP_H_
#define _LINEAR_INTERP_H_
#include <stdint.h>#ifdef __cplusplus
extern "C" {#endifstruct LinearInterp
{// 初始化曲线void (*Init)(struct LinearInterp *self,float *arr_x, float *arr_y,uint32_t size);    // 调用计算float (*Cal)(struct LinearInterp *self, float val);float out;struct {float *arr_x;float *arr_y;int32_t size;}pvt;
};void LinearInterp_Create(struct LinearInterp *self);#ifdef __cplusplus
}
#endif#endif
/**************************************************************** @Copyright(C)    2020-2021, wangchongwei* @FileName:       linear_interp.c* @Author:         wangchongwei* @Version:        0.1.1* @LastDate:       2021.8.14************************************************************/#include "linear_Interp.h"
#include "string.h"static void _Init(struct LinearInterp *self,float *arr_x, float *arr_y,uint32_t size)
{self->pvt.arr_x = arr_x;self->pvt.arr_y = arr_y;self->pvt.size = size;
}static float _Cal(struct LinearInterp *self, float val)
{int32_t left = 0, mid = 0;int32_t right = self->pvt.size - 1;float x0,y0,x1,y1;// 二分法while (left <= right){mid = (left+right)/2;if (val<self->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:mid-1; // 中间二分查找出现的情况}// 3.Linear interpolationx0 = self->pvt.arr_x[mid];y0 = self->pvt.arr_y[mid];x1 = self->pvt.arr_x[mid+1];y1 = self->pvt.arr_y[mid+1];self->out = y0+(((y1-y0)*(val - x0))/(x1-x0));return self->out;
}void LinearInterp_Create(struct LinearInterp *self)
{memset(self , 0 , sizeof(struct LinearInterp));self->Init = _Init;self->Cal = _Cal;
}

测试:

    float arr_x[5] = {1,5,8,13,17};float arr_y[5] = {4,45,10,40,20};float res;LinearInterp_Create(&line_interp);line_interp.Init(&line_interp, arr_x,arr_y,5);res = line_interp.Cal(&line_interp,6);qDebug()<<"插值结果:"<<res;
插值结果: 33.3333

我按1的步长,从-10-30的区间进行插值,画图:

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

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

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


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

线性插值_c语言实现相关推荐

  1. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

  2. c语言精品课程网站论文免费下载,【毕业论文_c语言程序设计精品课程网站的研究与实现6喜欢就下吧材料】...

    毕业论文_c语言程序设计精品课程网站的研究与实现(6)(喜欢就下吧) <毕业论文_<c语言程序设计>精品课程网站的研究与实现.doc>由会员分享,可免费在线阅读全文,更多与&l ...

  3. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt

    第1章_C语言概述(vc环境如何运行c语言程序)[精选] C语言程序设计 授课对象:电子商务06 时间安排: 理论课(1-9周): 星期一 5-6节 9407D 星期三 5-6节 9410D 实验课( ...

  4. c语言两种排序方法的组合,排列和组合算法的实现方法_C语言经典案例

    排列和组合算法是考查递归的常见算法,这两种算法能用递归简洁地实现. 本人在经过多次摸索和思考之后,总结如下,以供参考. 程序代码如下: #include #include char array[] = ...

  5. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  6. c语言编程基础课件,第7章_C语言图形编程基础课件

    第7章_C语言图形编程基础课件 狭义的组织变革是指组织根据外部环境的变化和内部情况的变化及时地改变自己的内在组织结构,以适应客观发展的需要. 狭义的组织变革是指组织根据外部环境的变化和内部情况的变化及 ...

  7. 006-高级语言程序设计C 第六章,高级语言程序设计_C语言(第六章 数组.ppt

    <高级语言程序设计_C语言(第六章 数组.ppt>由会员分享,可在线阅读,更多相关<高级语言程序设计_C语言(第六章 数组.ppt(30页珍藏版)>请在人人文库网上搜索. 1. ...

  8. Easystructure教程_C语言源代码自动生成流程图

    目录 Easystructure教程_C语言源代码自动生成流程图 1. 简介 2. 下载 3. 安装 4. 使用 5. 其他软件推荐 5.1 Mermaid 5.2 Code2flow ** Easy ...

  9. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  10. 上海电机学院c语言,上海电机学院第1章_C语言概述.ppt

    上海电机学院第1章_C语言概述 第一章 本章要点 C语言的特点 C程序的结构 在计算机上运行C程序的方法 主要内容 1.1 计算机与程序.程序设计语言1.2 C语言出现的历史背景 1.3 C语言的特点 ...

最新文章

  1. bash: dotnet: 未找到命令..._Docker 常用命令(.NET Core示例)
  2. Lintcode 655解题思路和c++代码
  3. Java代码注释规约
  4. 2019暑假第三周总结
  5. 实战:网店活动付邮试用全攻略
  6. Newtonsoft.json中 linq to json 和序列化哪个快?
  7. 二叉树三种遍历方式的非递归实现
  8. bootstrap-table全选当前页所有数据checkAll
  9. 外国谷歌服务器练中国无线,易观:中国无线搜索市场百度谷歌份额超50%
  10. springMVC设置静态资源过滤器,过滤js、css、images等静态资源
  11. POJ-2034 Anti-prime Sequences dfs
  12. 富士康跳楼事件续集,主管扬言现场把人处理掉,并表示拒不处理善后
  13. SQLServer 查询建表语句
  14. IntelliJ IDEA自带接口测试工具
  15. Linux多线程服务端编程学习(四)finger服务的实现
  16. 2D轮转图选角色换衣服
  17. 微信公众号开发本地环境搭建
  18. 电子科技大学 图论期末复习 公式索引
  19. linux sendmail
  20. 09 年,台式机显卡功耗表

热门文章

  1. OSChina 周四乱弹 —— 帅帅帅,飞一般的感觉~
  2. excel计算机求和函数,多条件求和、多条件计数、多条件查找……多了去了!
  3. Win10 ipv4无网络访问权限的解决办法
  4. 数学模板-BSGSEXBSGS
  5. 编程中怎么理解抽象的概念
  6. 【java批量图片压缩处理】
  7. android 获取经纬度的三种方法,Android中如何获取经纬度
  8. JAVA中的getBytes方法
  9. matlab 最小割集(需手动分析排除)
  10. python爬虫基础爬取用户头像实战