2017-03-24 34 views
0

我正在阅读包含两列数值数据的文件。让第一列为'x',第二列为'y'。Python离散分化

'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。

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

+0

首先,你到目前为止的尝试?请发布您的代码。这真的取决于你的意思是不连续。你怎么定义它?你只是想通过眼睛来判断剧情中导数的跳跃吗? – James

+0

我还没有尝试过任何东西,因为我在SciPy和其他软件包中找到的所有区分例程都需要统一步长= h。 我的步长不一样,正如我最初所说的那样。 我只需要做一些事情来区分日期。 “为什么”并不重要。 – Mannix

+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] 

您可以根据从三点中心的距离加权每侧细化近似,但是这个如果所有你做的可能是没有必要的正在寻找不连续性。

+0

我可以将最后一行分配给变量吗?例如 对于x2,x0,y2,y0,zip(xarr [2:],xarr,yarr [2:],yarr)] dy = [(y2-y0)/(x2-x0)] – Mannix

+0

。这些值对应于xarr [1:-1]的派生估计值。 –

+0

不应该是'zip(xarr [1:],xarr,yarr [1:],yarr)'?现在,您将比较两个指数的值,而不是一个。 – Junuxx

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) 

上,消除了如果 - elif的语句的方式清理这个循环起来有什么建议?