2017-03-24 1 views
0

두 개의 숫자 데이터 열이있는 파일을 읽습니다. 첫 번째 열을 'x', 두 번째 열을 'y'라고합시다.파이썬 이산 미분

'x'의 데이터가 일정하게 간격을 두지 않았습니다. 즉, 이런 식입니다 :

2.6 2.7 3.0 3.2 3.5

2.4 ...

데이터는 분명히 유한. 그것은 초기 값과 최종 값을가집니다.

이 데이터에서 "discontinuities"를 찾아야합니다. 내 차별화 된 데이터이 작업을 수행 할 수 : 나는 검색을 한 적이 있지만, 모든 분화 답변은 내가 분석 기능을 포함 발견/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

마지막 줄을 변수에 지정할 수 있습니까? 예 : zip (xarr [2 :], xarr, yarr [2 :], yarr)의 x2, x0, y2, y0에 대한 dy = [(y2-y0)/(x2-x0)] – Mannix

+0

.값은''xarr [1 : -1]''에 대한 미분 추정에 해당합니다. –

+0

'zip (xarr [1 :], xarr, yarr [1 :], yarr)'이 아니어야합니까? 지금 당장은 하나가 아닌 두 개의 인덱스로 값을 비교하고 있습니다. – Junuxx

0

내 배열을 3 포인트의 작은 배열로 나누는 간단한 알고리즘을 작성했습니다. 그런 다음이 세 점을 통해 2 차 함수를 채우고 미분을 취한 다음 중간 점에서 값을 계산합니다. 종점에는 두 가지 값만 사용합니다.

조금 지저분합니다. 그리고 루프를 수행하는 더 효율적인 방법이 있다는 것을 알고 있습니다. 다음은 내가 한 일입니다.

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 문을 제거하는 방법으로이 루프를 정리할 때 제안 사항이 있습니까?