【嵌入式算法】线性插值拟合算法

对于线性变化的物理量可以根据简单的换算得出测量值与实际物理量的关系,但是实际大多数被检测物理量与转换后的数字量之间不是严格的线性关系。比如热敏电阻的阻值与温度,锂电池的电压与剩余电量,不可能按步进1ohm的阻值或者0.01v的电压建立很大一张对应表。一般情况下会标定有限个参考点,通过软件算法拟合去估算实际值。
在这里插入图片描述
已知(x0,y0)和(x1,y1),在这两个值之间插入节点,按线性函数g(x)=ax+b,计算得出g(x)=y0+(y1-y0)*(x-x0)/( x1-x0)插值节点x0与 x1的间距越小,则f(x)与g(x)之间的误差越小。以下面的数据为例说明。
在这里插入图片描述
在这里插入图片描述

#define N  11
//参考点
int table[N][2]={
    {0, 2},
    {10, 12},
    {20, 21},
    {30, 29},
    {40, 36},
    {50, 42},
    {60, 47},
    {70, 51},
    {80, 54},
    {90, 56},
    {100, 57}
};

int conversion(int x)
{
    int i;
    int y;

    if(x<table[0][0])
    {
        return table[0][1];
    }

    if(x>table[N-1][0])
    {
        return table[N-1][1];
    }

    for(i=0;i<N;i++)
    {
        if(x<=table[i][0])//数据排序,找到x前后的插值节点
        {
            //表示x介于table[i-1][0]~table[i][0]之间
            break;
        }
    }

    y=table[i-1][1]+(table[i][1]-table[i-1][1])*(x-table[i-1][0])/(table[i][0]-table[i-1][0]);
    return y;
}

int main(void)
{
    printf("x=25,y=%d\r\n",conversion(25));
    printf("x=75,y=%d\r\n",conversion(75));
    return 0;
  }

运行后输出

x=25,y=25 

x=75,y=52

将这两值插入原曲线图,效果如下,新加入的值基本与原曲线重合:
在这里插入图片描述
线性插值拟合,可以解决参考点有限的情况下估算对应关系,参考点越多,拟合得出的新值误差越小。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值