在實際的應用中,我們經常會遇到一些曲線擬合得需求,儘管,實際上點對之間可能是沒有絕對意義上的函數關係的,但是爲了更好地量化表示和計算,我們往往期望於從原始的數據集中儘可能地挖掘出來可能的函數關係,今天我遇上了一個問題就是如何去擬合指數函數+對數函數這種組合型函數曲線,簡單看一下具體的實現內容:
def logExpFunc():
'''
【指數+對數】混合函數擬合
'''
x=np.linspace(1,2,15)
y=[21.5,23.1,25.9,30,32.6,38,41.9,47.2,55,61,69,80,90,105,117.6]
popt,pcov=curve_fit(lambda t,a,b,c,d,e: a+b*np.log(c*t)+d*np.exp(e*t),x,y)
print('popt: ',popt)
plt.figure()
a,b,c,d,e=popt
y_pre = a+b*np.log(c*x)+d*np.exp(e*x)
plt.plot(x, y, 'ko', label="Original Data")
plt.plot(x, y_pre, 'r-', label="Fitting Curve")
plt.legend()
plt.show()
這裏我的函數原型爲:
y = 4+2*np.exp(2*x)+3*np.log(2*x)
y爲指數函數和對數函數的組合形式,其中,一共有5個參數。
結果如下所示:
popt: [ 5.19163529 -1.73152698 1.57951688 2.44883023 1.92488973]
從結果輸出的5個參數上來看,a、b、c、d和e跟我們自己預設的函數原型中的參數是不一致的,但是不影響我們擬合得到所需要的曲線,這樣的參數不一定會是唯一的,可能跟我們函數曲線擬合的時候所使用到的點數據過少有關係吧,畢竟函數本身還是比較複雜的。