簡體   English   中英

與最小二乘 Python 的指數擬合

[英]Exponential fit with the least squares Python

我有一個非常具體的任務,我需要找到指數函數的斜率。

我有兩個陣列,一個表示 400 到 750 nm 之間的波長范圍,另一個表示吸收光譜。 x = 波長,y = 吸收。

我的 fit 函數應該是這樣的:

y_mod = np.float(a_440) * np.exp(-S*(x - 440.))

其中S是斜率,在圖像中等於 0.016,這應該在我應該得到的 S 值范圍內(+/- 0.003)。 a_440是 440 nm 處的參考吸收,x 是波長。

建模與原始圖:

在此處輸入圖片說明

我想知道如何定義我的函數以獲得它的指數擬合不是對數變換量),而無需事先猜測 S 值是什么

到目前為止我所嘗試的是以這種方式定義函數:

def func(x, a, b):
    return a * np.exp(-b * (x-440))

它提供了非常漂亮的匹配

安裝 vs 原裝

我不確定的是這種方法是否正確還是我應該以不同的方式做? 如何使用最小二乘法或 y 方法中的絕對差異進行最小化以消除上層的影響?

是否還可以向數據添加隨機噪聲並重新計算擬合?

您的情況與 scipy 的curve_fit 文檔中描述的情況curve_fit

您遇到的問題是您的函數定義只接受一個參數,而它應該接收三個參數: x (評估函數的自變量),加上a_440S

清理了一下,功能應該是這樣的。

def func(x, A, S): 
    return A*np.exp(-S*(x-440.))

您可能會遇到有關協方差矩陣的警告。 您可以通過參數p0curve_fit提供一個合適的起點並提供一個列表來解決這個問題。 例如在這種情況下p0=[1,0.01]並且在擬合調用中它看起來像下面這樣

curve_fit(func, x, y, p0=[1,0.01])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM