1. 程式人生 > >曲線擬合

曲線擬合

polyfit函式基於最小二乘法,使用的基本格式為:

p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)

[p,S,mu] = polyfit(x,y,n)

p是n+1維引數向量p(1),p(2)….那麼擬合後對應的多項式即為p(1)*x^n+ p(2)*x^(n-1) +…+ p(n)*x +p(n+1)

S是規模為1×1的結構陣列,包括R(係數矩陣的QR分解的上三角陣),df(自由度),normr(擬合誤差平方和的算術平方根)。
 

f=polyval(p,x)

然後plot出x和f即可。另外需要強調一點的是,往往需要在迴歸分析的時候給出相關係數(correlationcoefficient),實際上也很簡單,我們可以使用命令:

r=corrcoef(x,y);

這樣得到的r即為相關係數矩陣,其中r(1,2)=r(2,1)為相關係數,其值在[-1,1]之間,1表示最大程度的正相關,-1表示最大程度的負相關。相關係數絕對值越靠近1,線性相關性質越好,根據資料描點畫出來的函式-自變數圖線越趨近於一條平直線,擬合的直線與描點所得圖線也更相近。
 
另外,轉載兩條使用polyfit的注意事項:
 
1.使用polyfit命令進行多項式擬合時要注意的是,向量x(其中元素作為自變數)中不重複的元素個數m,和擬合階數k需要滿足m>=k+1.簡單分析:k階擬合需要確定k+1個未知引數(如1階擬合y= ax +b需要確定a和b兩個引數),故而至少需要k+1個方程,故而需要至少k+1個不同的已知數對(x,y),由於函式中x只能對應一個y,故而需要至少k+1個不同的x。
 
2. polyfit只適合於形如y = a[k]*x^k + a[k-1]*x^(k-1) + …. + a[1]*x +a[0]的完全的一元多項式的資料擬合。


求出p之後我們需要作出擬合函式,那麼只需要使用命令:

f=polyval(p,x)

然後plot出x和f即可。另外需要強調一點的是,往往需要在迴歸分析的時候給出相關係數(correlationcoefficient),實際上也很簡單,我們可以使用命令:

r=corrcoef(x,y);

這樣得到的r即為相關係數矩陣,其中r(1,2)=r(2,1)為相關係數,其值在[-1,1]之間,1表示最大程度的正相關,-1表示最大程度的負相關。相關係數絕對值越靠近1,線性相關性質越好,根據資料描點畫出來的函式-自變數圖線越趨近於一條平直線,擬合的直線與描點所得圖線也更相近。
 


另外,轉載兩條使用polyfit的注意事項:
 
1.使用polyfit命令進行多項式擬合時要注意的是,向量x(其中元素作為自變數)中不重複的元素個數m,和擬合階數k需要滿足m>=k+1.簡單分析:k階擬合需要確定k+1個未知引數(如1階擬合y= ax +b需要確定a和b兩個引數),故而至少需要k+1個方程,故而需要至少k+1個不同的已知數對(x,y),由於函式中x只能對應一個y,故而需要至少k+1個不同的x。
 

2. polyfit只適合於形如y = a[k]*x^k + a[k-1]*x^(k-1) + …. + a[1]*x +a[0]的完全的一元多項式的資料擬合

舉例:

x=(0:0.7:5)';
x1=(0:0.05:5)';
y=sin(x);
%%%p1,p2,p3是多項式的係數
p1=polyfit(x,y,4)
p2=polyfit(x,y,7)
p3=polyfit(x,y,10)
f1=polyval(p1,x1);
f2=polyval(p2,x1);
f3=polyval(p3,x1);
subplot(131);plot(x,y,'o',x1,f1,'-');
subplot(132);plot(x,y,'o',x1,f2,'-');

subplot(133);plot(x,y,'o',x1,f3,'-');