PID 预测

信息处理 算法 C# 非线性 机器学习
2022-01-18 11:24:41

首先,我只想说我是一名程序员,不是复杂算法方面的专家,可能无法应用复杂的伪代码或解决方案的其他描述。我已经在其中一个编程 SE 论坛上问过类似的问题,希望能找到代码示例,但没有人有解决方案。

我有一个每秒大约 10 个快照的数据流。我编写了一个(C#)控制器,它获取这些数据并根据与预期结果的距离调整一些数据收集参数。目前,我只是对我的数据进行线性缩放操作,这样我离预期结果越远,它纠正的越多。问题是传入的数据流延迟了 0.5 到 2 秒(我可以在运行时计算)。由于这种延迟,它正在纠正前一段时间的结果,并且不断地过度纠正,甚至有时纠正错误的方向。我正在寻找一种算法来执行以下操作:

  • 实施一个校正算法(我更喜欢 PID),它将尝试
    磨练最佳值
  • 根据修正历史和结果,提前预测一定时间(或数据集数量);这些值不会完全是线性的,但它们可能会接近

在可以实现这一目标的算法方面,我有哪些选择?正如我之前所说,我是一名程序员,因此我将不胜感激代码示例;我不擅长将复杂的伪代码转换为有效的实现。

编辑: 为了解决评论中的一些问题......

  • 我确实在我的问题中做了一个小抽象。实际发生的是我得到一个数据流,根据该数据计算 3 个(单独的)数字,并尝试分别优化它们;他们每个人都有自己的输出参数。我从这个算法中需要的是能够对单个数字进行操作并对其进行优化。我会给它历史和结果,它会修改它自己的输出参数。然后我可以为每个参数使用算法 3 次。
  • 费率确实略有变化(通常速度很慢),但如果需要,我应该能够计算出变化。但是我不需要足够精确的数字来要求可变的预测时间;我可以选择任意数量的快照来提前预测,它应该让我足够接近我的结果。
  • 这是一个物理过程,噪音很大,而且通常不是很准确。我正在获取我的数据流并进行大量估计和跟踪之类的事情,因此经常存在异常值。有许多因素使基本模型相对容易,但任何更准确的东西都将完全关闭。基本上,我无法真正将其建模到有用的程度。请注意,该算法必须控制的输出值是“漂移”或变化率。目前我只是缩放值,以便输入距离理想值越远,输出越高(非常简单)。
  • 您是否要求我提供我的数据样本?我应该可以在某个时候做到,但我可能需要几天的时间才能获得机会。为了测试它,我(现在仍然)计划将算法放入带有滑块和噪声发生器的测试程序中,看看会发生什么。
1个回答

这只是一个开始,因为我不确定我是否完全理解这个问题。

这是我认为正在发生的事情的情节。蓝色曲线是你的数量的“真相”,红色曲线是它的延迟、嘈杂、测量版本。

这看起来像你的问题吗?如果不是,应该如何改变它以使其看起来更像它?

在此处输入图像描述

我怀疑修改后的卡尔曼滤波器(卡尔曼预测器)可以为您提供一些信息,但我想先了解您的数据是什么样的。

另一个问题:你怎么知道“真相”和你的测量之间有延迟?我试图了解我们必须使用哪些数字来纠正时间延迟。


用于生成图形的 Scilab 代码。

// Q 12924
N = 1000;
process_noise = rand(1,N,'norm');
mid = filter(ones(1,20)/20,1,process_noise);
alpha = 0.99;
truth = filter(1-alpha,[1 -alpha], mid);

clf;
plot(truth);

max_delay = 50;
true_delay = floor(rand(1,1,'uniform')*max_delay);

sigma = 0.01;
measurement_noise = rand(1,N,'norm')*sigma;

measurements = truth(max(1,[1:N]-true_delay)) + measurement_noise;

plot(measurements,'r:')