2014-05-16 24 views
6

Verilerimi sığdırmaya çalıştığımda, sonuçlar biraz garip ve neden anlamıyorum. Elde edilen bağlantı düzdür ve ilk giriş e = 0'dır. Bir yerde bir bölünme hatası ortaya çıktı. Ben e değiştirdiğinizde tek çalışan vaka [0] = 1.0e-9Eğri uydurma kullanarak Scipy garip sonuçlar

sonuç şudur geçerli: benim örnek şimdiye kadar okuduğum kadarıyla olmadığını görünüyor örnek here itibaren enter image description here

ama ben takılıyorum, bu yüzden davada neyin yanlış gittiğine dair bana yardımcı olabilir misiniz?

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() 

Yardımlarınız için şimdiden teşekkür ederiz.

+0

Lütfen açıklamak "sonuçlar biraz tuhaf ve neden anlamıyorum" Senin için görüntüyü eklendi –

+1

. SO'ya hoş geldiniz! ;) –

+0

Teşekkür ederim arkadaşım;) Bir bira al! – Jyb

cevap

2

Sorun kökü, parametrelerin hatalı bir başlangıç ​​tahminidir (aslında curve_fit için başlangıç ​​parametresi belirtilmemiş).

Hedef işlev kolayca doğrusallaştırılabilir. Bunu yapalım, daha sonra curve_fit için iyi bir başlangıç ​​tahmin parametrelerini almak için lineer bir regresyon yapın (p0= ile gönderin). Elde edilen uygun daha iyi (daha az kalıntıya sahip olan) ve 1e-9 olduğu ilk değerini değiştirmek için gerek yoktur:

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

Yardımlarınız için teşekkürler, yaklaşımınızı hatırlayacağım ama uydurma eğrinin başlangıcında görsel olarak daha iyi olduğu için bir sonraki cevapla çalışın ve benim durumumdaki en önemli davranış bu. – Jyb

0

ilk nokta edemez Eğri üzerinde olun, bu nedenle eğri formülünü değiştirmeniz gerekir:

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)) 

burada çıktısı:

enter image description here

+0

İpucu için çok teşekkürler, ofset hedef fonksiyon için gerçekten ek bir parametre olabilir ama deneysel sonuçlara bağlıdır: Burada, ofset en iyi uyumu sağlar ve sıfır bölünme hatasını önler. – Jyb