![](/img/trans.png)
[英]Not able to do database changes properly iteratively in C# Entity Framework
[英]Iteratively Smoothing Changes in Position
我有一个实体,它的运动中有噪音。 该实体正直奔目标实体,我试图估计它达到目标需要多长时间。
我试图通过查看其位置历史来估计实体的速度。
我有一个History<Tuple<double,Vector2D>
,它有最后 N 个位置以及我在什么时候获得该位置。 这些位置通常以 1 秒的间隔非常一致地出现。
我尝试了一些自制公式,其中 xtk[n] 是 [n] 秒前的分量(x 或 y):
private double GetFirstOrderVelocity(double xtk, double xtk1, double h)
{
return (xtk - xtk1)/h;
}
private double GetSecondOrderVelocity(double xtk, double xtk2, double h)
{
return (xtk - xtk2) / (h*2);
}
private double GetThirdOrderVelocity(double xtk, double xtk1, double xtk2, double xtk3, double h)
{
return (xtk + xtk1 - xtk2 - xtk3) / (h * 4);
}
private double GetFourthOrderVelocity(double xtk, double xtk1, double xtk3, double xtk4, double h)
{
return (xtk + (2 * xtk1) - (2 * xtk3) - xtk4) / (h * 8);
}
其中h
始终为 1,因为它们以 1 秒的间隔出现。
四阶有帮助,但我想知道是否有更好和更通用的方法来估计先前位置的速度? 迭代的东西,所以如果我需要更强的平滑,我只需要增加一个计数器,这可能会使用更多的历史,并且会为了平滑而权衡响应。 现在的问题是,如果某物正朝着目标前进,那么定位时间非常跳跃且合乎逻辑,有了足够的样本,我们就可以开始相当准确地估计到达目标的时间。
迭代。 保留两个具有不同衰减率的指数衰减平均值,然后通过比较它们进行投影。
这个想法是这样的。 如果0 < k < 1
则可以通过以下方式计算衰减平均值:
average = (1-k)*prev_average + k*observation
你应该做你自己的数字实验,以确保我没有犯一个愚蠢的错误。 但是如果你的路径是线性的,这个平均值将收敛到很像最近1/k
观察的平均值,这代表了你对1/(2*k*T)
秒前位置的最佳猜测。 因此,如果您有其中的 2 个,那么您将有 2 个平滑的测量值,它应该在何处。 从那些你可以预测平均速度,从那个位置你可以估计到达时间。0
您将不得不使用它来找到两个适用于您的数据集的常量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.