如何在C#中计算变量随时间的变化率?

时间:2016-12-04 17:07:47

标签: c# variables rate

我需要实现一个适应变量变化率的算法。假设我有一个整数HumidityPercent和一个外部传感器实时提供数据。 我发现了几种检测我的var是否发生变化的方法:

private float HumChange 
    {
        get { return HumidityPercent; }
        set 
        {
            HumidityPercent = value;
            if (HumidityPercent != 100)
            {
                // Do what?
            }           
        }
    }

我有一个计时器(秒表)来计算通过的毫秒数。事情是:我如何调用新变量中的更改来存储毫秒和新值?

 private double newHum = (HumidityPercent, timer.TotalMilliseconds);

但在那之后我怎么能区分?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果您需要变化率,那么您需要做三件事:

  1. 原始值。
  2. 新值。
  3. 这些值之间的时差。
  4. 如果你有一个计时器在运行,那么第一次点火时它需要做的就是储存湿度。

    下次触发时,需要将“当前”值移动到“上一个”值,更新“当前”值并进行变化率计算。

    因此,如果你将你的值作为可以为空的双打,你可以测试你是否有以前的值:

    private double? previous;
    private double current;
    private double rateOfChange;
    
    private void TimerTick(....)
    {
        if (previous == null)
        {
            current = GetHumidity();
        }
        else
        {
            previous = current;
            current = GetHumidity();
            rateOfChange = (current - previous) / time;
        }
    }
    

答案 1 :(得分:1)

经过彻底的搜索(以及我身边的大量学习)后,我建立了@ChrisF代码,并制作了一个高效优雅的狙击手。

    public void InitTimer()
    {
        timer = new System.Timers.Timer();
        timer.Enabled = true;
        timer.Elapsed += timer_Tick;
        timer.Interval = 200;
    }

    public void timer_Tick(object sender, System.Timers.ElapsedEventArgs e) 
    {
        timer.Enabled = false;
        System.Threading.Interlocked.Increment(ref current);
        if (current == 0)
        {
            current = HumidityPercent;
        }
        else
        {
            previous = current;
            current = HumidityPercent;
            RateOfChange = (current-previous)/5;
            Thread.Sleep(200);
        }
        timer.Enabled = true;
    }

注意到我必须调用一次InitTimer方法,所以我使用了:

    if (firstrun == true)
    {
        InitTimer();
        firstrun = false;
    }   

另请注意,我已将tick放在stop-start事件中,放入Thread.Sleep并添加了非常方便有效的System.Threading.Interlocked.Increment(ref current)。

谢谢大家的贡献!