matlab 曲線擬合小記


 

在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為擬合數據點。另外在實驗中還加了一個隨機噪聲。結果如圖:

image

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);

結果如下圖:

image

此外,高斯曲線的擬合也可以通過轉化為多項式擬合的方法實現,先將被擬合數據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)

結果如圖所示,但是這種方法似乎只在沒有噪聲干擾時效果較好,如果存在噪聲的干擾的話,那么這個估計不是最佳的(因為對數運算使不同區間的噪聲影響不同),右圖為加了噪聲之后的情況.

image                image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM