野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1308|回复: 2

预测数据A在一小时内贴近采集数据B的算法

[复制链接]
发表于 2023-7-27 22:17:39 | 显示全部楼层 |阅读模式
预测数据A;检测的数据B;定时器延时1分钟执行;
static bool flag = true;  /*flag是为了保证斜率不变的*/
static float middle = 0.0;



     if( A != B )
     {
          if( flag )
            {
                middle = 0.0;
               middle = ( B- A ) / 60.0f;  /* 由于定时器每1分钟执行一次,将两者之间的差值分成60份,即在1小时将A调整至B */
                flag = false;
            }
            A += middle;
        }
        if( B <= ( A * 1.1f)  &&  B >= ( A * 0.9f))  /* A与B相临近时,把标志位设置为true,为了防止数据突变时,flag为false时middle不能改变 */
        {
            flag = true;
        }


此方法不稳定:程序一开始假如 B > A 时, if( flag )成立,middle是正值,flag = false;A += middle,A逐渐向B靠近。万一检测数据有干扰波动,B < A了,由于flag 为false,无法改变middle,导致A += middle后A越来越大。请问有什么可以改进的方法吗?谢谢!!
回复

使用道具 举报

发表于 2023-7-28 11:27:38 | 显示全部楼层
  1. static bool flag = true;  
  2. static float middle = 0.0;  
  3. static time_t lastUpdate = 0;  
  4.   
  5. // ...  
  6.   
  7. if (A != B) {  
  8.     if (difftime(time(NULL), lastUpdate) >= 60) {  
  9.         if (flag) {  
  10.             middle = (B - A) / 60.0f;  
  11.             flag = false;  
  12.         }  
  13.         A += middle;  
  14.         lastUpdate = time(NULL);  
  15.     }  
  16. }  
  17.   
  18. if (B <= (A * 1.1f) && B >= (A * 0.9f)) {  
  19.     flag = true;  
  20. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-28 13:44:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 21:20 , Processed in 0.031408 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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