采用单片机等微处理器采集一些“线性”传感器数据时,注意这里的线性是指相似于线性变化,比如NTC热敏电阻、PT100铂电阻、PH复合电极传感器,这些传感器的变化特性类似于二维坐标轴上的一条斜线。如下图可以看出数据点基本在一条斜线的附近,那么我们的目的是通过单片机运行程序来求出这条斜线所对应的函数表达式。

图中Y1、Y2、Y3、Y4、Y5 可看作为热敏电阻数值所代表的温度值大小,那么f(x) 代表斜虚线所表示的函数关系式。为了求出这个具体的函数关系式,这里我们引入最小二乘法,其基本的理论是 所有点与曲线的偏差之和最小,由于偏差存在负值,所以采用差值的平方和最小时作为曲线拟合的条件。关于最小二乘法的原理可参考:https://www.zhihu.com/question/37031188

我们对曲线进行观察,或是通过将实验测得的数据画二维坐标图表观测(例如 热敏电阻阻值为【10k,11k,13k,15k】   分别对应的温度为 【25度、26度、27度、30度】,单纯举例,并非真值),即可明显看出曲线符合比例函数关系,所以我们可以设置曲线的关系式为 f(x)=ax+b;要知道最小二乘法适用的函数类型具有多种,这里是根据我们实际使用情况的一种举例。

设上图的i,x,y 分别为:

通过上面式子,虽然我们通过人工计算可以得出a和b的值,进而可得出函数关系式。但是对于交给单片机来计算的话,仍然不够直观,那么通过将以上算式化简即可得出如下求解a值和b值的算式,看起来已经相当直观明了,并且可以着手编程实现。(关于推导简化的原理过程可参考:https://haokan.baidu.com/v?pd=wisenatural&vid=4883001823775224)


#include <stdio.h>
#include <math.h>float a=0.0,b=0.0;   //所求系数
float y[3]={4,7,10}; //因变量数组float x[3]={3.071,2.535,2.0666}; //自变量数组//最小二乘法 获取a,b
//x[]: 自变量数组  y[]: 因变量数组  num: 数组元素个数,两组必须一致  a:系数 b:系数
void leastSquareLinearFit(float x[], float y[], const int num, float &a, float &b)
{float mxy=0.0,xx=0.0,yy=0.0,x2=0.0,x22=0.0;int i;    for(i=0;i<num;i++){mxy=num*x[i]*y[i]+mxy;xx=1.0*x[i]+xx;yy=1.0*y[i]+yy;x2=1.0*x[i]*x[i]*num+x2;x22=1.0*x[i]+x22;}b=1.0*(mxy-xx*yy)/(x2-x22*x22);a=1.0*yy/num-b*xx/num;printf("Y=%0.3fx+%0.3f\n",b,a);    }
int main(){leastSquareLinearFit(x,y,3,a,b);return 0;}

以上为利用最小二乘法求出函数a,b值的完整C语言代码,以上数组x,y分别表示PH传感器电极电压和所对应PH值的关系。这里我们可以通过在线C编译器来打印出运算结果a,b值。

在线C编译器地址:http://www.dooccn.com/c/

编译结果如下图:

至此,采用最小二乘法求曲线拟合方程式的验证完毕,另外在有些时候,我们并不需要单片机等处理器来计算曲线方程式时,我们可以利用将得到的数组填入excel表格,利用excel的曲线拟合功能,同样可以得出曲线拟合函数方程式,如下图。(excel曲线拟合可参考:https://jingyan.baidu.com/article/c275f6bad5e03fe33d756712.html)

可看到采用excel曲线拟合功能得到的函数a值和b值和采用C语言最小二乘法的计算结果是一致的,EXCEL中的R平方值是趋势线拟合程度的指标,它的数值大小可以反映趋势线的估计值与对应的实际数据之间的拟合程度,拟合程度越高,趋势线的可靠性就越高。

R平方值是取值范围在0~1之间的数值,当趋势线的 R 平方值等于 1 或接近 1 时,其可靠性最高,反之则可靠性较低。R平方值也称为决定系数。

最小二乘法求拟合曲线函数的C语言实际应用相关推荐

  1. python分段函数输入x的值求y的值_C语言编程题 有一分段函数如下,要求用scanf函数输入整数x的值,求y值并在屏幕上输出。有分段函数如下,编程实现输入整...

    C语言编程题 有一分段函数如下,要求用scanf函数输入整数x的值,求y值并在屏幕上输出. 有分段函数如下,编程实现输入整 www.zhiqu.org 时间: 2020-11-22 #include ...

  2. R语言求拟合函数图形的交点坐标

    R语言求拟合函数图形的交点坐标 通过二分类无限逼近的方法获得的 代码如下: 1)四个曲线的数据结构 v_ac=log(vir_1) op_log=log(opp) test1=data.frame(v ...

  3. python计算分段函数输出x+2的值怎么写_c语言求分段函数分段函数求解:输入 x ,计算并输出 y 的值:y=x+100 ( 当 x < 20) y= x ( 当...

    题目: c语言求分段函数 分段函数求解:输入 x ,计算并输出 y 的值: y=x+100 ( 当 x < 20) y= x ( 当 2 0 ≤ x ≤ 100) y=x-100 ( 当 x & ...

  4. 7:C语言之求分段函数的值

    #include <stdio.h>//定义main函数 int main() {//请在此添加'求分段函数的值'的代码/*****************Begin*********** ...

  5. python怎么根据点来拟合曲线_2019_nCoV_利用python根据已知点求拟合曲线及简单预测(无实际意义)...

    前言 本文仅做根据已知点求拟合曲线的几种方法的python实现,无任何实际意义 数据来源(另一篇博文) 利用Python爬取新冠肺炎疫情实时数据,Pyecharts画2019-nCoV疫情地图 参考 ...

  6. python函数拟合不规则曲线_python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案...

    第一种是进行多项式拟合,数学上可以证明,任意函数都可以表示为多项式形式.具体示例如下. ###拟合年龄 import numpy as np import matplotlib.pyplot as p ...

  7. C/C++ 余弦函数 cos - C语言零基础入门教程

    目录 一.cos 函数简介 二.cos 函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 零基础 C/C++ 学习路线推荐 : C ...

  8. 如何用递归思想 求n的阶乘 C语言

    如何用递归思想 求n的阶乘 C语言 首先,我讲一下什么是递归? 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函 ...

  9. 最小二乘法直线拟合c语言代码,最小二乘法拟合一条直线(C语言代码)

    最小二乘法拟合一条直线(C语言代码) #include #define N 9 //N为要拟合的数据的个数 float X[9] = {1,1.477,1.778,2,2.176,2.301,2.39 ...

最新文章

  1. Zabbix 2.4.4升级到Zabbix 3.2.6
  2. java void eat_java匿名内部类
  3. IDFA的值什么时候会发生改变
  4. 【通俗易懂】RPA是什么?
  5. Mybatis源码:MapperProxy 代理模式
  6. 动手学PaddlePaddle(3):猫脸识别
  7. hibernate4 could not initialize proxy - no Session
  8. 机器学习笔记-LightGBM
  9. 待熟悉的工具或API清单列表
  10. 如何在Mac上控制对日历的访问?
  11. ViPER4Android驱动平台,viper4android驱动
  12. 一级计算机excel打不开,Excel打不开,教您怎么解决Excel打不开
  13. ImageNet-1k分类数据集中英对照表 验证集类别解析
  14. 思科网络安全 第七章测验答案
  15. 二分查找理论(三种问题类型、两种算法形式)
  16. 分布式id php,PHP生成类MongoId的分布式主键
  17. 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解
  18. 替补者的旅行(巨长,慎入)
  19. PCB焊接温度和方法
  20. 数值转换成人民币大写的一个类

热门文章

  1. 别再傻傻的用CentOS 8的版本了,快升级成CentOS 8 Steam (升级教程)
  2. springboot视频API解析
  3. VUE项目当中调用微信sdk
  4. 应用哈希值更改图片hash
  5. 三种常见的区块链共识机制优缺点
  6. Java中char,short,int,long占几个字节和多少位
  7. Java Lambda简化Comparator接口匿名内部类写法
  8. oracle狎鸥亭_孙承用 个人主页 - 韩国MODS (摩兹)整形 - 美佳网
  9. Django-配置媒体资源-设置路由分发规则(下)
  10. 关于mptcp环境的搭建