在matlab中經常需要對數據進行曲線擬合,如最常見的多項式擬合,一般可以通過cftool調用曲線擬合工具(curve fit tool),通過圖形界面可以很方便的進行曲線擬合,但是有些時候也會遇到不方便用圖形工具。因此這里簡單的記下兩種常用的擬合方法。
1 多項式擬合(polyfit和polyval)
polyfit可以對數據進行擬合(自定義用幾次多項式),返回相應的參數,然后用polyval生成擬合后的數據點,下面的例子中我們對拋物線y=3x2+6x+5進行擬合。
x = -5:0.1:5; y = 3*x.^2+6*x + 5 + randn(size(x)); p = polyfit(x,y,2); yy = polyval(p,x); plot(x,y,'.'); hold on; plot(x,yy,'r','LineWidth',2)
polyfit(x,y,2)中x表示自變量,y表示因變量,2表示用二次曲線(拋物線)進行擬合,得到的p其實是對應的參數估計值,yy為擬合數據點。另外在實驗中還加了一個隨機噪聲。結果如圖:
2 高斯函數的曲線擬合
高斯曲線也是很常要擬合的曲線,這里介紹一種直接用代碼使用cftool擬合工具的方法,這種方法可以對許多自定義的函數進行擬合(例如用來做多項式擬合,但是這種方法要麻煩很多,遠沒有前一種方法多項式擬合方便)。下面的是一個簡單的例子,其中還可以進行更復雜的設置,具體請help fit和fittype.
f = fittype('a*exp(-((x-b)/c)^2)'); x = -10:0.2:10; y = 5*exp(-((x)/4).^2)+randn(size(x))*0.1; plot(x,y,'.') [cfun,gof] = fit(x(:),y(:),f); yy = cfun.a*exp(-((x-cfun.b)/cfun.c).^2); hold on;plot(x,yy,'r','LineWidth',2);
結果如下圖:
此外,高斯曲線的擬合也可以通過轉化為多項式擬合的方法實現,先將被擬合數據y取對數,然后用多項式擬合求出對應的參數。代碼如下:
x = -10:0.2:10; y = 5*exp(-((x)/4).^2); lny = log(y); p = polyfit(x,lny,2); gauss.c = sqrt(-1/p(1)); gauss.b = -p(2)/2/p(1); gauss.a = exp(p(3)-p(1)*gauss.b^2); yy = gauss.a*exp(-((x-gauss.b)/gauss.c).^2); plot(x,y,'.'); hold on; plot(x,yy,'r','LineWidth',2)
結果如圖所示,但是這種方法似乎只在沒有噪聲干擾時效果較好,如果存在噪聲的干擾的話,那么這個估計不是最佳的(因為對數運算使不同區間的噪聲影響不同),右圖為加了噪聲之后的情況.