2016-10-24 5 views
4

두 개의 numpy 데이터 배열을 사용하여 파이썬에서 두 번째 파생물을 가져 오려고합니다. 나는 현재 다음 f(x) = y파이썬에서 두 번째 파생어 - scipy/numpy/pandas

import numpy as np 

x = np.array([ 120. , 121.5, 122. , 122.5, 123. , 123.5, 124. , 124.5, 
     125. , 125.5, 126. , 126.5, 127. , 127.5, 128. , 128.5, 
     129. , 129.5, 130. , 130.5, 131. , 131.5, 132. , 132.5, 
     133. , 133.5, 134. , 134.5, 135. , 135.5, 136. , 136.5, 
     137. , 137.5, 138. , 138.5, 139. , 139.5, 140. , 140.5, 
     141. , 141.5, 142. , 142.5, 143. , 143.5, 144. , 144.5, 
     145. , 145.5, 146. , 146.5, 147. ]) 

y = np.array([ 1.25750000e+01, 1.10750000e+01, 1.05750000e+01, 
     1.00750000e+01, 9.57500000e+00, 9.07500000e+00, 
     8.57500000e+00, 8.07500000e+00, 7.57500000e+00, 
     7.07500000e+00, 6.57500000e+00, 6.07500000e+00, 
     5.57500000e+00, 5.07500000e+00, 4.57500000e+00, 
     4.07500000e+00, 3.57500000e+00, 3.07500000e+00, 
     2.60500000e+00, 2.14500000e+00, 1.71000000e+00, 
     1.30500000e+00, 9.55000000e-01, 6.65000000e-01, 
     4.35000000e-01, 2.70000000e-01, 1.55000000e-01, 
     9.00000000e-02, 5.00000000e-02, 2.50000000e-02, 
     1.50000000e-02, 1.00000000e-02, 1.00000000e-02, 
     1.00000000e-02, 1.00000000e-02, 1.00000000e-02, 
     1.00000000e-02, 1.00000000e-02, 5.00000000e-03, 
     5.00000000e-03, 5.00000000e-03, 5.00000000e-03, 
     5.00000000e-03, 5.00000000e-03, 5.00000000e-03, 
     5.00000000e-03, 5.00000000e-03, 5.00000000e-03, 
     5.00000000e-03, 5.00000000e-03, 5.00000000e-03, 
     5.00000000e-03, 5.00000000e-03]) 

, 나는 d^2 y/dx^2를 원하는 :

예를 들어, 문제의 배열은 다음과 같이.

수치 적으로 함수를 보간하고 분석적으로 미분을 취하거나 을 사용할 수 있음을 알고 있습니다. 어느 쪽이든 다른 쪽이 더 빠르고 더 정확하다고 생각되면 데이터를 사용할 충분한 데이터가 있다고 생각합니다.

나는 np.interp()scipy.interpolate을 보았습니다.) 스플라인을 사용하지만 그 시점에서 파생물을 얻는 방법을 모릅니다.

모든 안내에 감사드립니다.

+0

당신이 [np.diff]를 살펴 있었나요 (https://docs.scipy.org/doc/numpy/reference/generated/numpy.diff.html)? – mkhanoyan

+0

내 관심사는 데이터 포인트가 균등하지 않다는 점입니다. – Jared

답변

9

scipy의 1-D Splines 기능을 사용하여 데이터를 보간 할 수 있습니다. 계산 된 스플라인에는 파생 상품 계산을위한 편리한 derivative 메소드가 있습니다. UnivariateSpline를 사용하여 예제의 데이터의 경우

다음 적합

import matplotlib.pyplot as plt 
from scipy.interpolate import UnivariateSpline 

y_spl = UnivariateSpline(x,y,s=0,k=4) 

plt.semilogy(x,y,'ro',label = 'data') 
x_range = np.linspace(x[0],x[-1],1000) 
plt.semilogy(x_range,y_spl(x_range)) 

enter image description here

착용감이 적어도 시각, 합리적으로 좋은 것 같다 제공합니다. UnivariateSpline에서 사용하는 매개 변수로 실험 해 볼 수 있습니다.

스플라인 피팅의 두 번째 파생 단순히

y_spl_2d = y_spl.derivative(n=2) 

plt.plot(x_range,y_spl_2d(x_range)) 

enter image description here

결과물로 얻을 수 것은 다소 부 자연스러운 표시 (여기서 데이터는 어떤 물리적 처리에 대응). 스플라인 맞춤 매개 변수를 변경하거나 데이터를 개선하거나 (예 : 더 많은 샘플 제공, 노이즈가 적은 측정 수행) 데이터를 모델링하고 곡선 맞춤을 수행 할 수 있습니다 (예 : sicpy의 curve_fit 사용)

유한 차이로
+0

이 데이터는 확률 밀도 함수를 나타냅니다. 이 곡선을 정규화하고 몇 가지 규칙 (음수 값 없음)을 적용하는 가장 좋은 방법은 무엇입니까? – Jared

+1

일반 보간 방법을 사용하는 접근 방식은 제한 사항을 부과하는 데있어 제한적인 옵션을 가지고 있기 때문에 이에 대한 표준 답변은 없다고 생각합니다.원칙적으로 제약 최적화 문제를 처음부터 공식화하고 해결해야합니다. 'y_spl.integral (x [0], x [-1])'이 약 80이고, pdf에 유효한 값이 아니기 때문에 데이터를 정규화하는 것으로 시작할 수 있습니다. – Stelios

2

, 각 Y의 1 차 도함수가 어레이를 통해 X의 값이 주어진다 의미 :

dy=np.diff(y,1) 
dx=np.diff(x,1) 
yfirst=dy/dx 

그리고 X의 해당 값은 같다 : 옵션

xfirst=0.5*(x[:-1]+x[1:]) 

두 번째 순서, 할 일 다시 전자 동일한 프로세스 :

dyfirst=np.diff(yfirst,1) 
dxfirst=np.diff(xfirst,1) 
ysecond=dyfirst/dxfirst 

xsecond=0.5*(xfirst[:-1]+xfirst[1:]) 
관련 문제