Python离散区分

时间:2017-03-24 22:33:06

标签: python differentiation

我正在阅读一个包含两列数字数据的文件。设第一列为'x',第二列为'y'。

'x'中的数据不是均匀间隔的。也就是说,它是这样的:

2.4 2.6 2.7 3.0 3.2 3.5 ...

数据显然有限。它有一个初始值和一个最终值。

我需要在这些数据中找到“不连续性”。我想这样做是为了区分数据:dy / dx

我已经完成了搜索,但我发现的所有差异化答案都涉及分析函数,例如y = x ** 2 + 1

我的数据是离散的,不适合分析功能。我需要在这个数据的每个'x'值上找到导数,记住'x'不是均匀间隔。

所以,假设我已经从我的数据文件中读取数据,并将它们存储在变量'x'和'y'中。

现在我想要dy / dx,我想绘制dy / dx vs x。

我能做什么“导入”这个衍生物?或者我将不得不自己编写算法?

2 个答案:

答案 0 :(得分:0)

我会自己写the algorithm。没有内置导入可以做到这一点。这里有一些代码用作起点:

>>> xarr = [2.4, 2.6, 2.7, 3.0, 3.2, 3.5, 3.8, 4.1, 5.3]
>>> yarr = [10, 12, 18, 20, 22, 27, 30, 32, 36]
>>> [(y2-y0)/(x2-x0) for x2, x0, y2, y0 in zip(xarr[2:], xarr, yarr[2:], yarr)]
[26.666666666666643, 20.000000000000004, 8.0, 
 14.0, 13.333333333333341, 8.333333333333337, 4.0]

您可以根据距离三个点中心的距离对每一侧进行加权来细化近似值,但如果你所做的只是寻找不连续性,这可能是不必要的。

答案 1 :(得分:0)

我写了一个简单的算法,将我的数组分成3个点的较小数组。然后通过这三个点拟合二阶函数,取其导数,并计算中间点的值。对于终点,我只使用两个值。

有点乱。我知道有更有效的方法来完成循环。这是我做的:

dydx=[]

for i in range(len(x)):
    if i==0:
        dx=x[i:i+2]
        dy=y[i:i+2]
        order=1
    elif i==len(x)-1:
        dx=x[i-1:i+1]
        dy=y[i-1:i+1]
        order=1
    else:
        dx=x[i-1:i+2]
        dy=y[i-1:i+2]
        order=2
    z=np.polyfit(dx,dy,len(dx)-1)
    f=np.poly1d(z)
    df=np.polyder(f)
    dydx.append(float(df(x[i])))
dydx=np.array(dydx)

有关清除此循环的任何建议都以消除if-elif语句的方式进行了吗?