分享一下使用非線性函數對數據進行擬合。非線性函數假定是標準指數衰減曲線,
y(t)=Aexp(−λt)
其中,y(t) 是時間 t 時的響應,A 和 λ 是要擬合的參數。對曲線進行擬合是指找出能夠使誤差平方和最小化的參數 A 和 λ,誤差平方和為目標函數
創建樣本數據本文基於 A=40 和 λ=0.5 且帶正態分布偽隨機誤差的模型創建人工數據。
編寫目標函數編寫一個函數,該函數可接受參數 A 和 lambda 以及數據 tdata 和 ydata,並返回模型 y(t) 的誤差平方和。將要優化的所有變量(A 和 lambda)置入單個向量變量 (x)。將目標函數保存為 func.m 的文件。
function sse = func(x,tdata,ydata)A = x(1);lambda = x(2);sse = sum((ydata - A*exp(-lambda*tdata)).^2);fminsearch 求解器適用於一個變量 x 的函數。但 func函數包含三個變量。額外變量 tdata 和 ydata 不是要優化的變量,而是用於優化的數據。將 fminsearch 的目標函數定義為僅含有一個變量 x 的函數:
fun = @(x)func(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')title('原始數據和擬合數據')legend('原始數據','擬合數據')hold off