4

我正在研究一种方法,该方法应该决定曲线是否具有几乎恒定的斜率。

当然也有一些x,y要点。到目前为止,我所做的是将y每个数据点除以它x以获得该数据点的斜率。我把这个斜坡存储在一个List<double>

我认为到目前为止我走在正确的轨道上(如果我不是,请告诉我!)。现在是时候决定是否处理恒定曲线了,所以我最终采用了以下方法:

private bool IsConstantSlope(List<double> slopes)
{            
    var max = slopes.Max();
    var min = slopes.Min();
    var diff = max - min;

    return (diff > 0.01) ? false : true;        
}

所以我在这里检查斜率的最大值和最小值并将其与我认为根本不好的自定义阈值进行比较。

这种方法适用于完全恒定的斜线,但我想给它一些灵活性,我认为将最大值和最小值的差异与一个常数进行比较不是一个好习惯。

我会appriciate更多的想法!

4

2 回答 2

6

涉及到一些 x,y 点。到目前为止,我所做的是将每个数据点的 y 除以其 x 以获得该数据点的斜率。我将此斜坡存储在列表中

严格来说,一个没有斜率,您在这里测量的是连接您的点 (x,y) 和点 (0,0) 的线的斜率。因此,如果您对一组有序的点执行此操作,那么拥有一条线的概念并不完全正确。你甚至没有连接相邻点的一组斜线。也在你的功能中

 return (max > 0.01) || (min < -0.01);

如果你的阈值是 0.01 会更好。

如果您真正想要的是一条适合或近似点集的线,那么您首先需要对您的数据执行某种直线回归并测试这条近似线的梯度,看看它是否在您的阈值范围内。

这可能是一个有用的阅读http://en.wikipedia.org/wiki/Simple_linear_regression

或者,您可以按 x 值对点进行排序,然后计算出每对连续对之间的斜率(有效地生成折线)并将它们存储在您的列表中,然后使用您的斜率 camparison 函数。

于 2012-07-06T08:33:42.620 回答
3

我会设计一个递归算法,在整个斜坡上工作。仅考虑最小/最大斜率并不能说明整个曲线。首先,我将确定两个斜率 A 和 B 必须满足哪个要求才能确定“恒定斜率”。然后,我会考虑您列表中的第一个 (A) 和最后一个 (B) 值:这两个值是否满足要求?否:没有恒定斜率;是:将范围 (A,B) 细分为两个子范围:(A,M), (M,B) 其中 M 是列表中与 A 和 B 等距的值。然后将相同的算法应用于这两个子范围子范围。子范围的数量取决于您想要达到的精度。

于 2012-07-06T08:48:03.797 回答