Matlab是一個很強大的數據處理軟體,是人們進行數據分析的得力助手。一般我們做社會調研或科學研究時,會得到很多實驗數據。當需要研究兩個或多個變量之間的關係時,經常要用到曲線擬合。曲線擬合不僅能給出擬合後的關係式,還能用圖形直觀的展現出變量之間的關係。下面小編介紹一下自己常用的擬合方法並分享案例程序。
對於比較簡單的數據擬合,小編推薦直接用Excel,Origin或者Matlab的cftool工具箱,這個比較簡單,就不多介紹了,接下來主要分享對於複雜一些的的數據的擬合辦法。
1,已知函數的形式,要求函數係數,直接fittype走起.
示例:已知兩組數據x=[0 0.4 1.2 2 2.8 3.6 4.4 5.2 6 7.2 8 9.2 10.4 11.6 12.4 13.6 14.415]';
y=[10.85 0.29 -0.27 -0.53 -0.4 -0.12 0.17 0.28 0.15 -0.03 -0.15 -0.071 0.059 0.080.032 -0.015 -0.02]';和數據符合的公式:
我們可以通過以下程序來擬合出a,w 和t的值(首先在命令窗口輸入x,y):
symst
f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
cfun=fit(x,y,f)%顯示擬合函數,數據必須為列向量形式
xi=0:0.1:20;
yi=cfun(xi);
figure
plot(x,y,'r*',xi,yi,'b-');
title('擬合函數圖形');
得到的結果如下:
cfun =
General model:
cfun(t) =a*cos(k*t)*exp(w*t)
Coefficients(with 95% confidence bounds):
a = 0.9987 (0.9836, 1.014)
k = 1.001 (0.9958, 1.006)
w = -0.2066 (-0.2131, -0.2002)
2,線性多元,常用regress.
示例:m=[234 237 239 280 290]
x=[3.133.15 3.18 3.19 3.23]
y=[87.589.6 94.5 99.5 104.6]
做m=ax+by+c的二元擬合.
我們可以通過以下程序來擬合出a,b 和c的值:
m=[234237 239 280 290];
x=[3.133.15 3.18 3.19 3.23];
y=[87.589.6 94.5 99.5 104.6];
t=[ones(size(x,2),1),x',y'];%這裡的size(x,2)代表求x向量的列數,注意一定要在前面加上一列全為1,t=[x1,x2,x3]若x1,x2,x3行數相等則表示著將這幾行橫著拼起來
b=regress(m',t)%原來m是行向量,轉化為列向量
得到的結果如下:
b =
2.8346
-1.0960
0.0095
其中b(1),b(2),b(2)分別對應c,a,b的值。如果想得出直觀的圖形,可以在以上程序下接:
[x,y]=meshgrid([-10:0.1:10]);
z=b(1)+x.*b(2)+y.*b(3);
surf(x,y,z);
得到如下圖:
3,如果非線性(最好還是一元),常用polyfit.
示例:x=[0 0.3000 0.6000 0.9000 1.2000 1.5000 1.8000 2.1000 2.4000 2.7000 3.0000]
y=[2.0000 2.3780 3.9440 7.3460 13.2320 22.2500 35.0480 52.2740 74.5760 102.6020 137.0000]
對其進行多項式擬合。
首先,如果知道其階數,例如3階,我們可以直接
y1=polyfit(x,y,3),回車
我們會看到下面結果:
y1 =
4.0000 3.0000 0.0000 2.0000
如果不知道階數,可以先求階數,具體實現代碼如下:
fori=1:5
y2=polyfit(x,y,i);
Y=polyval(y2,x);%計算擬合函數在x處的值。
if sum((Y-y).^2)<0.1
c=i
break;
end
end
運行以上程序,結果如下:
c=3
掃碼關注「碩博路人生路」 發送"matlab"獲取matlab安裝包
既有技術(Ansys/Solidworks/CAD/ Comsol/ Viso/Matlab等等)的交流,又有經驗(論文寫作/SCI投稿/碩博求學經歷/創業/出國留學/求職招聘等等)的分享,還有人生的思考。期待加入碩博路的大家庭,讓我們共度人生路。