標籤:

APPs(005)旋轉,跳躍,我要擬合線

FAQs:

  • 所有代碼Matlab 2017a環境測試通過,大部分內容是2014b以後版本都能用,向前不確保兼容。
  • 最近收到很多答題邀請,像我這麼高冷,是只會回答簡單的問題的(因為我也不會辣么專業的問題,求放過)。
  • 雖然我有很多修飾的函數,可以出圖很漂亮,可是為了讓大家直接複製粘貼就能運行代碼,丑就丑點吧,工程師,夠用就好。
  • 基本更新時間,每周五。歡迎規範轉載。歡迎投稿此專欄。

測試感測器這個系列,終於到了數學部分。如果不記得這個弱智的故事

請回到此專欄編號(002)看下,單獨看此篇也不影響。

cftool的GUI交互操作很好用,但我是來秀操作的。

% 界面互動式操作簡明教程,運行以下命令doc cftooldoc Interactive Curve and Surface Fitting

1,fittype半家桶(還有很多類型)

數據擬合在實驗數據分析,模型參數求取等方面有很多需求,是最常見的Matlab運算需求之一,因此列到Maltab入門裡,而不是統計學部分里。

如果你要擬合一個三次多項式:

ft1 = fittype(poly3) %定義一個三次多項式的,poly3是擬合方程的name

ft1 = Linear model Poly3: ft1(p1,p2,p3,p4,x) = p1*x^3 + p2*x^2 + p3*x + p4

下面的names應該是列出來比較全的帶參數擬合名稱了,當然還有很多其它函數,我這可是個正經的入門教程。(實在是輸入Equation 打瘋了,如果有錯誤,請留言)

 egin{array} {ll} underline{Names} & underline{Equations}\ poly1 & Y = p1*x+p2\ poly2 & Y = p1*x^2+p2*x+p3\ poly3 & Y = p1*x^3+p2*x^2+...+p4\ ... & ...\ poly9 & Y = p1*x^9+p2*x^8+...+p10\ \ poly21 & Z = p00 + p10*x + p01*y + p20*x^2 + p11*x*y\ poly13 & Z = p00 + p10*x + p01*y + p11*x*y + p02*y^2 + p12*x*y^2 + p03*y^3\ poly55 & Z = p00 + p10*x + p01*y +...+ p14*x*y^4 + p05*y^5\ &\ weibull & Y = a*b*x^{(b-1)}*e^{(-a*x^b)}\ &\ fourier1 & Y = a0+a1*cos(x*p)+b1*sin(x*p)\ fourier2 & Y = a0+a1*cos(x*p)+b1*sin(x*p)... +a2*cos(2*x*p)+b2*sin(2*x*p)\ fourier3 & Y = a0+a1*cos(x*p)+b1*sin(x*p)... +a3*cos(3*x*p)+b3*sin(3*x*p)\ ...& ...\ fourier8 & Y = a0+a1*cos(x*p)+b1*sin(x*p)... +a8*cos(8*x*p)+b8*sin(8*x*p)\ &\ gauss1 & Y = a1*e^{-((x-b1)/c1)^2}\ gauss2 & Y = a1*e^{-((x-b1)/c1)^2}+a2*... e^{-((x-b2)/c2)^2}\ gauss3 & Y = a1*e^{-((x-b1)/c1)^2}+... +a3*e^{-((x-b3)/c3)^2}\ ...& ...\ gauss8 & Y = a1*e^{-((x-b1)/c1)^2} +... +a8*e^{-((x-b8)/c8)^2}\ &\ power1 & Y = a*x^b\ power2 & Y = a*x^b+c\ &\ rat02 & Y = (p1)/(x^2+q1*x+q2)\ rat21 & Y = (p1*x^2+p2*x+p3)/(x+q1)\ rat55 & Y = (p1*x^5+...+p6)/(x^5+...+q5)\ &\ sin1 & Y = a1*sin(b1*x+c1)\ sin2 & Y = a1*sin(b1*x+c1)+a2*sin... (b2*x+c2)\ sin3 & Y = a1*sin(b1*x+c1)+... +a3*sin(b3*x+c3)\ ...&...\ sin8 & Y = a1*sin(b1*x+c1)+... +a8*sin(b8*x+c8)\ &\ end{array}

% 當然也可以自定義函數ft2 = fittype({x,cos(x),1})

ft2 = Linear model: ft2(a,b,c,x) = a*x + b*cos(x) + c

2,fit走你

load census; % 系統帶的一組數據,直接load就好[f,gof]=fit(cdate,pop,poly2)figure();plot(f,cdate,pop)figure();plot(f,cdate,pop,residuals)legend(residuals)

f = Linear model Poly2: f(x) = p1*x^2 + p2*x + p3 Coefficients (with 95% confidence bounds): p1 = 0.006541 (0.006124, 0.006958) p2 = -23.51 (-25.09, -21.93) p3 = 2.113e+04 (1.964e+04, 2.262e+04)gof = struct with fields: sse: 1.590292991767393e+02 rsquare: 0.998712965772010 dfe: 18 adjrsquare: 0.998569961968899 rmse: 2.972366240114836

3,沒有最好的數據擬合,只有最合適的數學模型。

census數據,用二次多項式擬合,也可以用三、四次多項式、指數函數擬合,可以試試。

load census;f2 = fit(cdate,pop,poly3)f3 = fit(cdate,pop,poly4)figure;plot(f2,cdate,pop);legend(data,poly3)figure;plot(f3,cdate,pop);legend(data,poly4)

但是看看高階的係數是不是離奇的小,可是看圖又沒啥區別,而且還提示badly。

如果研究的物理問題都沒有那麼高的階次,又何必辛苦尋找,所以數據研究還是要回到研究目標本身去。

f2 = Linear model Poly3: f2(x) = p1*x^3 + p2*x^2 + p3*x + p4 Coefficients (with 95% confidence bounds): p1 = 3.855e-06 (-4.078e-06, 1.179e-05) p2 = -0.01532 (-0.06031, 0.02967) p3 = 17.78 (-67.2, 102.8) p4 = -4852 (-5.834e+04, 4.863e+04)f3 = Linear model Poly4: f3(x) = p1*x^4 + p2*x^3 + p3*x^2 + p4*x + p5 Coefficients (with 95% confidence bounds): p1 = 4.754e-08 (-1.086e-07, 2.037e-07) p2 = -0.0003556 (-0.001536, 0.0008251) p3 = 1.003 (-2.343, 4.349) p4 = -1264 (-5477, 2948) p5 = 6.002e+05 (-1.388e+06, 2.588e+06)

4, 更多閱讀內容

doc fitoptions

這只是冰山的一角啊,少年,還有一整個軍火庫,啊不,一整個工具箱在等你啊。

我的目標是,瞬間爆炸。(MD,竟然不押韻,差評。)

推薦閱讀:

為什麼數學軟體要用自己的語言?
MATLAB編輯器如何自動給代碼操作符前後加空格?
為什麼說 MATLAB 快?
XML和MATLAB交互的基本操作[1]:讀取XML

TAG:MATLAB |