2016-06-03 2 views
0

파생 프로그램을 작성하려면 프로그램을 작성하십시오. InterpolatedUnivariateSpline은 f (x + h)를 계산하는 데 사용됩니다. 빨간색 선은 코사인의 미분, 녹색 선은 코사인 consine, 파란색 선은 -sine 함수입니다. 빨간색과 파란색 선이 일치합니다. 그것은 다음에서 잘 작동합니다.파이썬에서 데이터 파생물 얻기

from scipy.interpolate import InterpolatedUnivariateSpline 
import numpy as np 
import matplotlib.pyplot as plt 

pi = np.pi 
x = np.arange(0,5*pi,0.2*pi) 
y = np.cos(x) 
f2 = InterpolatedUnivariateSpline(x, y) 
#Get dervative 
der = [] 
for i in range(len(y)): 

    h = 1e-4 
    der.append((f2(x[i]+h)-f2(x[i]-h))/(2*h)) 
der = np.array(der) 

plt.plot(x, der, 'r', x, y, 'g', x, -np.sin(x),'b') 
plt.show() 

Result

하지만 몇 가지 문제가 발생합니다. 내 프로젝트에서 변수 x (주파수)는 10^7에서 2.2812375 * 10^9까지 다양하며 그 단계는 22487500이므로 배열 x를 변경합니다. 그 결과, 다음과 같은 결과가 나타납니다.

Result2

유도체 그것은 -sine 기능 아니다 선과 거의 0에 가깝다. 어떻게 해결할 수 있습니까?

+0

''InterpolatedUnivariateSpline'''는 [''derivitive'''] 갖는다 (http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.InterpolatedUnivariateSpline.derivative. html # scipy.interpolate.InterpolatedUnivariateSpline.derivative) 메소드. 당신이 그것을 사용하지 않는 이유가 있습니까? – wwii

+0

[중요성 상실] (https://en.wikipedia.org/wiki/Loss_of_significance)처럼 보입니다. 'x'를'1e7'과 같이 나눌 수도 있고,'h'를'1e5'의 크기 주위로 늘릴 수도 있습니다. 또한'x'가 충분히 높은 해상도를 가지고 있다면, 함수를 수치 적으로 구별하는 것이 더 간단합니다.'dy = np.diff (y)/np.diff (x)'가 될 것입니다. 이렇게하면'h '설정에 대해 걱정할 필요가 없습니다. –

+0

안녕하세요. wwii, 나는 또한 InterpolatedUnivariateSpline에서 derivitive를 시도합니다. 아래에서 같은 결과를 얻습니다. – radiosan

답변

1

당신은 loss of significance 문제가 있습니다. 작은 부동 소수점에 큰 부동 소수점 숫자를 추가 할 때 작은 비트의 정밀도는 64 비트의 정보 만 저장할 수 있으므로 부분적으로 손실됩니다.

이 문제를 해결하려면 추가/곱하기/나누기의 눈금이 너무 다름이 아닌지 확인해야합니다. 하나의 간단한 해결책은 x1e9으로 나누거나 h1e9으로 곱하는 것입니다. 이렇게하면 본질적으로 예제에서와 같은 정밀도를 얻게됩니다.

또한 x의 해상도가 충분히 높으면 함수를 숫자로 구별하는 간단한 방법은 der = np.diff(y)/np.diff(x)이됩니다. 이렇게하면 h 설정에 대해 걱정할 필요가 없습니다. 그러나이 경우 dyy보다 짧고 실제로는 dy[i]은`(x [i] + x [i + 1])/2에서의 미분의 근사치입니다. 따라서 그릴 계획은 다음과 같습니다.

der = np.diff(y)/np.diff(x) 
x2 = (x[:-1] + x[1:])/2 
plt.plot(x2, der, 'r', x, y, 'g', x, -np.sin(x),'b') 
+0

h에 1e9를 곱하려고 시도하지만 중요도 상실을 해결할 수는 없습니다. – radiosan