线性插值_c语言实现

2023-11-04

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

线性插值

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

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

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

设y=f(x) 在x0 和x1上值分别为,y0,y1,求多项式:
y = φ 1 ( x ) = a 0 + a 1 x y=\varphi _1\left( x \right) =a_0+a_1x y=φ1(x)=a0+a1x
满足:
φ 1 ( x 0 ) = y 0 , φ 1 ( x 1 ) = y 1 \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 ) = y 0 + y 1 − y 0 x 1 − x 0 ( x − x 0 ) 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+x1x0y1y0(xx0)

在这里插入图片描述

这样就能直接得到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" {
#endif

struct 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 interpolation
    x0 = 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


被抛弃的写随笔公众号改写技术文章了,感兴趣的可以关注公众号:王崇卫
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线性插值_c语言实现 的相关文章

  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • Qt 插槽是否与其他代码并行运行?

    在此函数示例中 void MyClass myFunction emit MySignal1 emit MySignal2 如果我有slot1倾听MySignal1 and slot2倾听MySignal2 1 Is slot1总是会在之前
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • Qt - 获取互联网上托管的网页的源代码(HTML 代码)

    我想获取网页的源代码 HTML 例如StackOverflow的主页 这是我到目前为止编写的代码 QNetworkAccessManager manager QNetworkReply response manager get QNetwo
  • 如何为 Windows 构建静态 Qt 库并将其与 Qt Creator 一起使用

    我已经下载了以下 Qt 源 http download qt nokia com qt source qt everywhere opensource src 4 7 3 zip http download qt nokia com qt
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk

随机推荐

  • 看懂低压降稳压器(LDO)一篇就够了

    电源管理是电子系统中的的一个基本模块 智能手机 电脑和我们所熟知的绝大多数电子产品都需要这个模块去实现本身的功能 随着人们对电子产品便携性的追求 计算能力的增长 以及传感器的多样化 电源管理设计有了更高的要求 为了满足新的电源设计上的更高的
  • ctfshow php特性

    web89 要求使用get方式传递数据 intval函数如果数组里有值 就输出1 构造payload num 0 web90 这里使用了 intval num 0 函数调用 其中第二个参数为 0 表示使用合适的进制进行转换 intval 函
  • 巴比特

    摘要 元宇宙变得越来越重要 因为它为企业提供了一种与来自世界各地的用户进行交流和协作的新途径 从小企业到大公司 每个品牌都可以踏入虚拟世界 并从中获益 那么一般的企业如何将业务转移到元宇宙呢 这7个步骤了解一下 热点资讯 Meta 宣布大幅
  • 偏微分方程(Partial Differential Equation II)

    数学物理方法 正交曲面坐标系下的分离变量 球函数 勒让德方程的解 勒让德函数 连带勒让德函数 球谐函数 柱函数 贝塞尔方程的解 贝塞尔函数 球贝塞尔方程 偏微分方程 Partial Differential Equation I 偏微分方程
  • php网页如何适应手机端,PC网页的移动端适配兼容性应该如何实现自动适配

    概念 移动时代的今天 现如今随着智能手机的不断发展 移动端搜索的比例也在不断增加 而传统的PC站点在手机端的用户体验度很差 这容易导致大量用户的流失 所以做一个对应的手机站是非常有必要的前端代码的编写永远逃不过 兼容 二词 从前PC时代 因
  • 第四届“泰迪杯”数据分析技能赛通知

    各有关单位 为推广我国高校数据分析实践教学 培养学生数据分析的应用和创新能力 增加校企交流合作和信息共享 提升我国高校的教学质量和企业的竞争能力 由泰迪杯数据分析技能赛组织委员会主办 广东泰迪智能科技股份有限公司承办 广东省工业与应用数学学
  • cgminer 2.2.4 参数详解!

    日期 2012 02 13 分类 Cgminer 版权声明 转载时请以超链接形式标明文章原始出处和作者信息及本声明 http bitcoin blogbus com logs 192244223 html cgminer2 2 4已经发布
  • 用Cookie添加登录界面的记住密码功能

    在网上看到很多关于cookie记录登录密码的功能 但是大部分都是jsp界面 最近刚好有个项目用到了cookie功能 所以编写了这个介绍 补全一下 1 第一步 首先需要在登录界面中写一个form表单 这个不用多说
  • kubernetes理论概念详情(K8S)

    1 优势 2 四组基本概念 3 核心组件 4 其他概念 5 基本命令
  • frp安全内网穿透,安全远程windows,暴露服务

    目录 概述 公网服务器端 内网Windows客户端 外网Windows客户端 附加 暴露多台内网Windows客户端 附加 暴露服务 总结 概述 frp 是一个专注于内网穿透的高性能的反向代理应用 支持 TCP UDP HTTP HTTPS
  • pip在线安装selenium

    最近发布了selenium3 0 但是会有很多莫名其妙的报错 原来可执行的代码也报错了 所以要重新安装回2 0 一 2 7 10之后的python安装包自带了Pip和setuptools 如果你没有安装可以去官网单独下载然后安装 a 下载地
  • js取值方式

    1 根据class id 取 input 标签的value 值 jQuery className val idName val javaScript document getElementById idName value 2 根据clas
  • GPRS本质论

    GPRS DTU最基本的用法是 在DTU中放入一张开通GPRS功能的SIM卡 DTU上电后先注册到GPRS网络 然后通过GPRS网络和数据处理中心建立连接 这条连接涉及了无线网络运营商 因特网宽 带供应商 用户公司的网络情况 以及用户的电脑
  • 使用ELK收集网络设备日志的案例

    简介 随着机房内的服务器和网络设备增加 日志管理和查询就成了让系统管理员头疼的事 系统管理员遇到的常见问题如下 1 日常维护过程中不可能登录到每一台服务器和设备上去查看日志 2 网络设备上的存储空间有限 不可能存储日期太长的日志 而系统出现
  • 解决github下载慢的问题可以提速【1M/s】

    1 问题描述 在github上下载项目时 下载速度经常都是20k s的速度下载 项目过大时还经常会显示网络出错导致下载失败 2 原因 我想对于经常使用git的人来讲 很可能已经知道了 对于新手刚接触git的人来讲 可能你只知道github
  • 分享!一文简析RASP技术

    众所周知 log4j 2 x安全事件引起了轩然大波 对于信息安全从业者来讲可以称之为 家喻户晓 与之同时引起大家关注的是RASP Runtime application self protection 技术 该技术在2014年Gartner
  • 强化学习奖励函数的归一化

    将每个奖励分量进行归一化 然后再分配权重
  • 9月17日服务器维护,2020年09月17日维护公告

    亲爱的玩家 为了保证服务器的稳定和服务质量 大话西游2免费版 将于2020年09月17日早上8 00停机 进行每周例行的维护工作 维护时间为早上08 00至09 30 同时 本次停机还将发布最新的客户端补丁 patch2 0 824 如果在
  • 从零开始学习JavaScript:轻松掌握编程语言的核心技能③

    从零开始学习JavaScript 轻松掌握编程语言的核心技能 一 JavaScript条件语句 1 1 if Else 语句 1 2 if else if else 语句 1 3 switch 语句 1 4 for 循环 1 5 while
  • 线性插值_c语言实现

    这是个很简单的数学工具 有的问题可能就只需要简单的数学工具就能解决 线性插值 线性插值法 是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法 线性插值相比其他插值方式 如抛物线插值 具有简单 方便的特点 线性插值可以