MINC/工具/emma/emma-擬合
外觀
在許多情況下,需要將非線性函式擬合到測量資料,MATLAB 提供了一個非常靈活的平臺來執行此分析。本文件提供了一個對標準雙室血流模型進行最小二乘擬合的示例
其中 K1 是血管流向組織的速率常數,k2 是組織流向血管的速率常數,A(t) 是大腦中的活性,Ca(t) 是血液中的活性。
MATLABleastsq函式隨最佳化工具箱提供,是解決此問題的明顯選擇,因為它對多維問題執行非線性最小二乘擬合。請參閱 MATLAB 文件,以詳細瞭解leastsq函式的工作原理以及它接受哪些選項。出於我們的目的,將使用它的預設容差和擬合算法(Levenberg-Marquardt)。
在 MATLAB 中執行曲線擬合有幾個步驟
- 建立一個返回函式值的函式。在這個例子中,我們需要一個返回 A(t) 計算值的函式,基於給定的 K1 和 k2,以及測量的 Ca(t) 曲線。在 MATLAB 中,這非常簡單
function sim = simrat (vars, times, Ca) expfun = exp(-vars(2)*times); conv = nconv(Ca, expfun, times(2)-times(1)); conv = conv (1:length(times)); sim = vars(1)*conv;
這個簡短的函式在給定擬合變量(在本例中,K1=vars(1), 和 k2=vars(2)), 一個時間向量,以及一個 Ca 值向量的情況下,返回 A(t) 的值。第一行計算方程的指數部分,第二行計算卷積,第三行將卷積剪下到我們感興趣的長度,第四行設定返回值(K1 乘以卷積)。
- 建立一個返回殘差值的函式(實際上,可以將此函式與前面的函式合併)。以下函式從前面的函式獲取函式值,並返回殘差
function error = fitrat (vars, ts_even, plasma_even, brain_even)
sim = simrat (vars, ts_even, plasma_even);
error = brain_even - sim;
- 呼叫leastsq, 傳遞返回殘差的函式名稱
[final, options, f, j] = leastsq ('fitrat', [K1 k2], [], [], ...
ts_even, plasma_even, brain_even);
leastsq將呼叫函式 fitrat 獲取殘差,並按順序傳遞 [K1 k2](將在 vars 中接收)、ts_even、plasma_even 和 brain_even。該leastsq函式在 final 中傳遞迴最終引數(解),選項向量(給出諸如迭代次數等資訊),以及解處的殘差和雅可比矩陣。
- 透過呼叫 MATLAB 獲取 95% 的置信區間confint函式(也來自最佳化工具箱)。
[conf, var] = confint (final, f, j);
此函式接受最小二乘問題的解(final)、解處的殘差(f)和解處的雅可比矩陣(j)。它返回 95% 的置信區間和方差(有關詳細資訊,請參閱 MATLAB 最佳化工具箱文件,或在 MATLAB 中鍵入help confint)。