检查列表中具有阈值的双精度是否相等

时间:2012-07-06 08:25:37

标签: c# math

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

当然有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;        
}

所以我在这里检查斜率的最大值和最小值,并将其与我相信的自定义阈值进行比较并不是很好。

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

我会提出更多想法!

2 个答案:

答案 0 :(得分: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值排序点,然后计算每个连续对之间的斜率(有效生成折线)并将其存储在列表中然后使用斜率比较函数

答案 1 :(得分:3)

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