【问题标题】:Finding average settling value after step response在阶跃响应后找到平均稳定值
【发布时间】:2011-07-02 18:53:18
【问题描述】:

我正在从生物监测系统收集数据。他们需要知道对系统进行更改后的平台平均值,如下所示。

这是大约 4 分钟的数据,如图所示,事件和稳态响应之间存在相当大的滞后时间。

这些值并不总是这个级别。他们希望我找到稳态响应开始的位置并在此期间平均这些值。我的老板是一名生物学家,他说可能存在超调和随机波动……而且我可能需要使用 z 变换。不幸的是,他没有比这更具体。

作为一名程序员,我感觉自己很胜任,但不确定找到这些值的最有效方法是什么。

我们将不胜感激任何算法、见解或方法。谢谢。

【问题讨论】:

标签: algorithm numpy signal-processing


【解决方案1】:

您实际上可以通过分析一阶导数来获得良好的开端。如果一阶导数接近于零,则考虑过程稳定。但请注意,这不是“灵丹妙药”类型的解决方案,会出现一些令人讨厌的极端案例。

总之基于以上,一个简单的演示如下:

import numpy as np

# create first some artificial observations
obs= np.array([[0, 1, 1.5, 3.5, 4, 4.5, 7, 9.2, 10.5, 15],
               [1, 2, 6, 6.01, 5.5, 4, 4.7, 3.3, 3.7, 3.65]])
x= np.linspace(obs[0][0], obs[0][-1], 1e2)
y= np.interp(x, obs[0], obs[1])
# and add some noise to it
y+= 1e-3* np.random.randn(y.shape[0])

# now find steady state based on first derivative< abs(trh), but
# smooth the signal first by convolving it with suitable kernel
y_s= np.convolve(y, [.2, .6, .2])
d, trh= np.diff(y_s), .015
stable= (np.abs(d)< trh)[:-1]

# and inspect visually
from pylab import grid, plot, show
plot(x, y), plot(x, y_s[1: -1])
plot(x[stable], np.ones(stable.sum()), 's')
grid(True), show()

输出如下(红点表示假定的稳态过程):

【讨论】:

    【解决方案2】:

    一种简单的方法可能是计算和跟踪移动平均值(即平均最后 N 个样本)。当平均值变化小于阈值时,您可以假设它是稳态。

    诀窍在于适当地选择 N 和阈值。您可能能够猜测出合理的值,或者您可以使用多个事件的数据来训练系统。

    这看起来是一个有趣的项目——祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多