微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

保持最大值

如何解决保持最大值

我需要编写一个具有两个输入 (x,Tau)函数。假设向量是一个简单的 x=sin(t)。该函数必须检测局部最大值。如果发现局部最大值,它应该从那里随着 exp(-t/Tau) 恶化,直到 sin(x) 再次变大。从那里,x 应该被跟随直到下一个局部最大值。这是一种低通滤波器,但我无法在 Octave 中正确编码。

这是手绘的示例图片

Sample picture

解决方法

这个问题更多的是数学而不是计算。当您的第一条曲线是平滑函数时,以下解决方案将起作用,但我不确定如果您的输入是一组高度分散的实验测量值,它的效果如何。在这种情况下,您可能需要更复杂的东西。

我假设您想让衰减曲线偏离基础曲线,而不是在最大值处,而是在稍微超过最大值的点上,其中基础曲线的向下斜率首先超过时间常数为 tau 的指数衰减的斜率。这似乎是一种更实际的情况。在字面上的最大值处切换到指数衰减可能/会导致衰减曲线实际上与基础曲线相交。

如果您的“正弦”函数是 x(t),并且衰减常数是 tau,那么您需要为图中的红色曲线添加一个新符号。称其为 y(t)。用数字向量表示时间轴 t = [t(1),t(2),...,t(n)] 和向量 x = [x(1 ),x(2),x(n)] 并设置 y(1) = x(1),则向量 y 的第 (i > 1) 个成员由 max(x(i),y(i-1) exp(-(t(i) - t(i-1))/tau)).

在 Octave 中实现它很简单:

clear

t = linspace(0,6*pi,1000); %Or whatever
x = sin(t); %Could be any function

function y = decay(x,t,tau)
    y = zeros(1,length(t));
    y(1) = x(1);
    for i = 2:length(t)
        y(i) = max(x(i),y(i-1)*exp(-(t(i)-t(i-1))/tau));
    endfor
endfunction

tau = 10;
y = decay(x,tau);

clf

hold on
plot(t,x)
plot(t,y)
hold off

如果您想定期使用上述函数,最好添加检查以确保传递的参数数量正确,x 和 t 的长度相同,并且 tau 是标量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。