OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2310|回复: 5

if 或 if else 语句在曲线拟合中的应用

[复制链接]

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2016-6-7 11:05:24 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 wjfhsym 于 2016-6-7 11:11 编辑

在做传感器输出电压与待测要素浓度曲线拟合时,通常会用到 ,IF ,   IF (...,return) ,IF  ELSE语句。
举例如下,一款传感器输出是电压信号,需要自己拟合出浓度曲线,,其中  Voldata是传感器输出电压,Dodata是浓度。

     例1. 功能可以实现,但满足其中一个IF 语句后,仍然会对 下面的IF进行判断,耗时。
           if(Voldata<=3200)Dodata=1;
          if((Voldata>3200)&&Voldata<=3300)Dodata=2;
         if((Voldata>3300)&&Voldata<=3400)Dodata=3;
         if((Voldata>3400)&&Voldata<=3500)Dodata=4;
         if((Voldata>3500)&&Voldata<=3600)Dodata=5;
         if((Voldata>3600)&&Voldata<=3700)Dodata=6;
         if((Voldata>3700)&&Voldata<=3800)Dodata=7;
         if((Voldata>3800)&&Voldata<=3900)Dodata=8;
        if(Voldata>3900)     Dodata=0;
            例2 功能可以实现,满足其中一个IF 语句后,立即返回
           if(Voldata<=3200) {Dodata=1;return; }
          if((Voldata>3200)&&Voldata<=3300){Dodata=2;return; }
         if((Voldata>3300)&&Voldata<=3400){Dodata=3;return; }
         if((Voldata>3400)&&Voldata<=3500){Dodata=4;return; }
         if((Voldata>3500)&&Voldata<=3600){Dodata=5;return; }
         if((Voldata>3600)&&Voldata<=3700){Dodata=6;return; }
         if((Voldata>3700)&&Voldata<=3800){Dodata=7;return;}
         if((Voldata>3800)&&Voldata<=3900){Dodata=8;return; }
         if(Voldata>3900){Dodata=0;return; }
      例3.  功能可以实现,满足其中之一IF ELSEIF 后,停止。
          if(Voldata<=3200)Dodata=1;
        else if(Voldata<=3300)Dodata=2;
        else if(Voldata<=3400)Dodata=3;
        else if(Voldata<=3500)Dodata=4;
        else if(Voldata<=3600)Dodata=5;
        else if(Voldata<=3700)Dodata=6;
        else if(Voldata<=3800)Dodata=7;
        else if(Voldata<=3900)Dodata=8;
       else Dodata=0;


  总感觉上面的都是笨方法,若数据分段太多时,就崩溃了。IF ELSE 对应嵌套 以及SWITCH 语句在这里的应用,可扩展性差,难维护。不知道各位大神有没有更好的方法。恳请分享

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-6-7 13:30:58 | 显示全部楼层
这不就是相当于取百位上的数吗。dodata = (voldata / 100) % 30
我有故事,你有酒吗
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-6-7 14:01:19 | 显示全部楼层
good,
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
 楼主| 发表于 2016-6-7 14:05:21 | 显示全部楼层
来俩不甜的 发表于 2016-6-7 13:30
这不就是相当于取百位上的数吗。dodata = (voldata / 100) % 30

不好意思,不是这样,Dodata的数据是我随便写的,为了方便。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-6-7 14:12:20 | 显示全部楼层
wjfhsym 发表于 2016-6-7 14:05
不好意思,不是这样,Dodata的数据是我随便写的,为了方便。

就这么个意思,if else不好用就想办法做数学函数
我有故事,你有酒吗
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-2-25
在线时间
3 小时
发表于 2019-2-27 01:01:36 | 显示全部楼层
可以使用线性拟合或者最小二乘法拟合,如果曲线的的线性度不高,可以采用分段线性拟合或者二次/三次拟合,实在不行也可以采用对数拟合和指数拟合
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 17:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表