2017-03-24 72 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的語句的方式清理這個循環起來有什麼建議?