點擊箭頭處「藍色字」,關注我們哦!!
此示例說明如何使用非線性函數對數據進行擬合。在本示例中,非線性函數是標準指數衰減曲線
其中,y(t) 是時間 t 時的響應,A 和 λ 是要擬合的參數。對曲線進行擬合是指找出能夠使誤差平方和最小化的參數 A 和 λ
其中,時間為 ti,響應為 yi,i=1,…,n。誤差平方和為目標函數。
通常,您要通過測量獲得數據。在此示例中,請基於 A=40 和 λ=0.5 且帶正態分布偽隨機誤差的模型創建人工數據。
rng default % for reproducibility
tdata=0:0.1:10;
ydata=40*exp(-0.5*tdata)+randn(size(tdata));
編寫一個函數,該函數可接受參數 A 和 lambda 以及數據 tdata 和 ydata,並返回模型 y(t) 的誤差平方和。將要優化的所有變量(A 和 lambda)置入單個向量變量 (x)。
type sseval
function sse = sseval(x,tdata,ydata)
A = x(1);
lambda = x(2);
sse = sum((ydata - A*exp(-lambda*tdata)).^2);
將此目標函數保存為 MATLAB® 路徑上名為 sseval.m 的文件。
fminsearch 求解器適用於一個變量 x 的函數。但 sseval 函數包含三個變量。額外變量 tdata 和 ydata 不是要優化的變量,而是用於優化的數據。將 fminsearch 的目標函數定義為僅含有一個變量 x 的函數:
fun = @(x)sseval(x,tdata,ydata);
從隨機正參數集 x0 開始,使用 fminsearch 求使得目標函數值最小的參數。
x0 = rand(2,1);
bestx = fminsearch(fun,x0)
bestx = 2×1
40.6877
0.4984
結果 bestx 與生成數據的參數 A = 40 和 lambda = 0.5 相當接近。
檢查擬合質量要檢查擬合質量,請繪製數據和生成的擬合響應曲線。根據返回的模型參數創建響應曲線。
A = bestx(1);
lambda = bestx(2);
yfit = A*exp(-lambda*tdata);
plot(tdata,ydata,'*');
hold onplot(tdata,yfit,'r');
xlabel('tdata')
ylabel('Response Data and Curve')
title('Data and Best Fitting Exponential Curve')
legend('Data','Fitted Curve')
hold off