2017-07-26 76 views
1

所以我不知道該怎麼做,而且我也不確定是否有一些數學現在完全忘記了,但我很茫然。總之,我有使用SciPy的和numpy的一些相當簡單的初始代碼,我想適合的指數曲線它:找到指數曲線擬合的初步猜測

from scipy.optimize import curve_fit 
import numpy as np 

# sample data 
x = np.array([7620., 7730., 7901., 8139., 8370., 8448., 8737., 8824., 9089., 9233., 9321., 9509., 9568., 9642., 9756., 9915., 10601., 10942.]) 
y = np.array([0.01228478, 0.01280466, 0.01363498, 0.01493918, 0.01530108, 0.01569484, 0.01628133, 0.01547824, 0.0171548, 0.01743745, 0.01776848, 0.01773898, 0.01839569, 0.01823377, 0.01843686, 0.01875542, 0.01881426, 0.01977975]) 

# define type of function to search 
def model_func(x, a, k, b): 
    return a * np.exp(-k*x) + b 

# curve fit 
p0 = (2.e-6,300,1) 
opt, pcov = curve_fit(model_func, x, y, p0) 
a, k, b = opt 
# test result 
x2 = np.linspace(7228, 11000, 3000) 
y2 = model_func(x2, a, k, b) 
fig, ax = plt.subplots() 
ax.plot(x2, y2, color='r', label='Fit. func: $f(x) = %.3f e^{%.3f x} %+.3f$' % (a,k,b)) 
ax.plot(x, y, 'bo', label='data with noise') 
ax.legend(loc='best') 
plt.show() 

我的問題是嘗試,因爲我可能我想不通的初始參數p0-我嘗試了一系列的價值觀,但坦率地說,我不知道我在做什麼,所以我沒有在這裏找到解決方案。有人可以建議如何去做?謝謝!

+0

供參考:@MNewville有一些適合指數的有用建議:https://stackoverflow.com/questions/45312404/new-error-in-old-code-in-numpy-exp/45314363#45314363 –

+0

看着你的數據,你應該從'a'的負值開始。對'k'來說可能不是那麼大,但我想Levenberg-Marquardt會爲你解決這個問題。 –

+0

請注意,由於添加常量「b」,在日誌空間中工作不適用於您的模型。 –

回答

0

對我而言,這個數據比指數曲線更接近於一個曲線,你確定你的模型是正確的嗎?

關於最初的猜測,我想你沒有對功能的進一步認識,如果是這樣使用它:

當x - > \ INF的溫控功能接近灣所以我會用一個大約0.025的猜測。 對於其他兩個變量,利用xy一個子樣本,解決方程明確:

a * np.exp(-k*x[0]) + 0.025 = y[0] 
a * np.exp(-k*x[-1]) + 0.025 = y[-1] 

解決這給:

a = (y[0]-0.025)/np.exp(-k*x[0]) 
e^(-k*(x[-1]-x[0])=(y[-1]-0.025)/(y[0]-0.025) # and then take logarithm 

k = -np.log((y[-1]-0.025)/(y[0]-0.025))/(x[-1]-x[0]) 
a = (y[0]-0.025)/np.exp(-k*x[0]) 

k=0.00026798747972760543a=-0.80114087848462689

此法可一般地使用,丟棄儘可能多的點以精確求解方程,然後使用這些值來開始最佳值

+0

我認爲數據看起來像一個飽和函數,它是確切地說,當「a」是負數時模型描述的是什麼。線性模型不適合。 (當然,它只有兩個參數而不是三個,所以預計擬合會更差,但附加參數會減少χ2足以證明它的有效性。) –

+0

單獨依靠初始猜測的第一個和最後一個數據點不是最強大的方法,因爲它們可能是異常值。在日誌空間中使用線性迴歸來確定參數會更有用。 –

+0

我同意採取第一個和最後一個不健壯,但它並不一定是,因爲curvefit將解決問題。 如果curvefit在這個猜測中找不到解決方案,您仍然可以採用其他兩個樣本或製作更復雜的方法,如採取所有樣本對並取平均值。但是,第一個和最後一個(或基本上任意兩個)將「最有可能」幫助您找到最初的猜測。 –