2014-05-16 2 views
6

데이터를 넣으려고 할 때 결과가 조금 이상하고 왜 이해가 안되나요? 얻은 피팅은 평면이며 첫 번째 입력은 e = 0입니다. 어딘가에서 분열 오류를 일으킨 것 같습니다. 나는 전자를 수정할 때 유일한 일 경우 [0] = 1.0E-9커브 피팅을 사용한 이상한 결과

결과 다음입니다 : 내 예를 들어 지금까지 내가 읽은 것과없는 것 같다 예를 here에서 enter image description here

,하지만 내가 붙어있어, 제 경우에 무슨 일이 일어나고 있는지 제발 도와 주실 수 있습니까?

import numpy as np 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 

src_s = np.array((45.59,50.66664,59.74871,65.71018,72.76012,79.06256,84.13755,90.39944, 
        96.33653,101.65667,106.27968,110.76301,114.41808,117.21922,120.51836)) 
src_e = np.array((0.0,0.00126,0.00503,0.00804,0.01228,0.01685,0.02127,0.02846,0.03666, 
        0.04581,0.05620,0.06882,0.08005,0.09031,0.10327)) 
# plot source data 
plt.plot(src_e, src_s, 'o') 
# fitting function 
def sigma(e, k ,n): return k*(e**n) 
# find parameters curve fitting 
param, var = curve_fit(sigma, src_e, src_s) 
new_e = np.linspace(src_e.min(), src_e.max(), 50) 
plt.plot(new_e, sigma(new_e, *param)) 

# modify first input 
src_e[0]=1.0e-9 
# relaunch parameters curve fitting 
param, var = curve_fit(sigma, src_e, src_s) 
new_e = np.linspace(src_e.min(), src_e.max(), 50) 
plt.plot(new_e, sigma(new_e, *param)) 

plt.show() 

미리 도움을 주셔서 감사합니다.

+0

하십시오이 설명하는 "결과는 약간 이상한 이유를 이해하지 않습니다"나는 당신을 위해 이미지를 추가 –

+1

. SO에 오신 것을 환영합니다! ;) –

+0

내 친구 고마워;) 맥주 가져 가라. – Jyb

답변

2

문제의 근원은 나쁜 초기 매개 변수입니다 (실제로 시작 매개 변수는 curve_fit에 제공되지 않음).

대상 기능을 쉽게 선형화 할 수 있습니다. 그러고 나서 선형 회귀를 수행하여 curve_fit에 대한 초기 추측 매개 변수 집합을 얻습니다 (p0= 전달). 얻어진 맞는 더 (이하 잔기를 갖는)되고 1e-9로의 제 1 값을 바꿀 필요가 없다 :

In [38]: 

src_e[0]=1.0e-9 
# relaunch parameters curve fitting 
param, var = curve_fit(sigma, src_e, src_s) 
new_e = np.linspace(src_e.min(), src_e.max(), 50) 
src_e[0]=0 
plt.plot(new_e, sigma(new_e, *param)) 
plt.plot(src_e, src_s, 'ro') 
plt.savefig('1.png') 
print 'Residue is:', ((sigma(src_e, *param)-src_s)**2).sum() 
Residue is: 2168.65307587 

enter image description here

In [39]: 

import scipy.stats as ss 
src_e[0]=0 
V=ss.linregress(np.log(src_e)[1:], np.log(src_s)[1:]) #avoid log(0) 
param, var = curve_fit(sigma, src_e, src_s, p0=(np.exp(V[1]), V[0])) 
new_e = np.linspace(src_e.min(), src_e.max(), 50) 
plt.plot(new_e, sigma(new_e, *param)) 
plt.plot(src_e, src_s, 'ro') 
plt.savefig('1.png') 
print 'Residue is:', ((sigma(src_e, *param)-src_s)**2).sum() 
Residue is: 2128.85364181 

enter image description here

+0

도움을 주셔서 감사합니다. 귀하의 접근 방식을 기억할 것입니다. 피팅이 커브의 시작 부분에서 시각적으로 더 좋을 것 같고, 내 경우에있어서 가장 중요한 행동입니다. – Jyb

0

제 포인트 수 없다 커브에 있어야하므로 커브 수식을 변경해야합니다.

import numpy as np 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 

src_s = np.array((45.59,50.66664,59.74871,65.71018,72.76012,79.06256,84.13755,90.39944, 
        96.33653,101.65667,106.27968,110.76301,114.41808,117.21922,120.51836)) 
src_e = np.array((0.0,0.00126,0.00503,0.00804,0.01228,0.01685,0.02127,0.02846,0.03666, 
        0.04581,0.05620,0.06882,0.08005,0.09031,0.10327)) 
# plot source data 
plt.plot(src_e, src_s, 'o') 

def sigma(e, k ,n, offset): return k*((e+offset)**n) 
# find parameters curve fitting 
param, var = curve_fit(sigma, src_e, src_s) 
new_e = np.linspace(src_e.min(), src_e.max(), 50) 
plt.plot(new_e, sigma(new_e, *param)) 

여기 출력 :

enter image description here

+0

팁을 주셔서 감사합니다. 오프셋은 실제로 대상 함수에 대한 추가 매개 변수 일 수 있습니다 하지만 실험 결과에 따라 달라집니다. 여기서는 옵셋이 가장 적합하고 제로 분할 오류가 발생하지 않는 것으로 보입니다. – Jyb