MATLAB曲線擬合函數

1、多項式擬合編輯器

  • ployfit(x,y,n) :找到次數爲 n 的多項式係數,對於數據集合 {(x_i,y_i)},知足差的平方和最小
  • [P,E] = ployfit(x,y,n) :返回同上的多項式 P 和矩陣 E 。多項式係數在向量 p 中,矩陣 E 用在 ployval 函數中來計算偏差
  • 某數據的橫座標爲 x= [0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8],縱座標爲 y = [1 2 3 5 6 7 6 5 4 1],對該數據進行多項式擬合
  • 代碼
clear all
      clc
      x = [0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8];
      y = [1 2 3 5 6 7 6 5 4 1];
      p5 = polyfit(x,y,5);				 % 5 階多項式擬合 
      y5 = polyval(p5,x);
      p5 = vpa(poly2sym(p5),5)			 %顯示 5 階多項式
      p9 = polyfit(x,y,9);				 % 9 階多項式
      y9 = polyval(p9,x);
      figure;								%畫圖
      plot(x,y,'bo');
      hold on;
      plot(x,y5,'r:');
      plot(x,y9,'g--');
      legend('原始數據','5 階多項式擬合','9 階多項式擬合');
      xlabel('x');
      xlabel('y');
  • 運行程序後,獲得的 5 階多項式以下: p5 =10.041x^5 + 58.244x^4 - 124.54x^3 + 110.79x^2 - 31.838*x + 4.0393函數

  • 輸出結果以下: 優化

  • 可見,當採用 9 次擬合時,獲得的結果與原數據符合的比較好。當使用函數 polyfit() 進行擬合時,多項式的階次最大不超過 length(x) - 1命令行

2、加權最小方差(WLS)擬合原理及實例3d

  • 加權最小方差就是根據基礎數據自己各自的準確度的不一樣,在擬合的時候給每一個數據以不一樣的加權數值。這種方法比單純最小方差方法要更加符合擬合的初衷
  • 根據 WLS 數據擬合方法,自行編寫使用 WLS 方法擬合數據的 M 函數,而後使用 WLS 方法進行數據擬合
  • 在 M 文件編輯器中輸入以下代碼:
function [th,err,yi] = polyfits(x,y,N,xi,r)
      % x,y:數據點系列
      % N:多項式擬合的系統
      % r:加權係數的逆矩陣
      
      M = length(x);
      x = x(:);
      y = y(:);
      
      % 判斷調用函數的格式
      if nargin == 4
      % 當調用的格式爲 (x,y,N,r)
      	if length(xi) == M
        		r = xi;
        		xi = x;
      % 當調用的格式爲(x,y,N,xi)
       	else r = 1;
       	end;
      % 當調用格式爲(x,y,N)
      elseif nargin == 3
      	xi = x;
      	r = 1;
      end
      % 求解係數矩陣
      A(:,N+1) = ones(M,1);
      for n = N:-1:1
      	A(:,n) = A(:,n+1).*x;
      end
      if length(r) == M
      	for m =1:M
      		A(m,:) = A(m,:)/r(m);
      		y(m) = y(m)/r(m);
      	end
      end
       % 計算擬合係數
      th = (A\y)';
      ye = polyval(th,x);
      err = norm(y-ye)/norm(y);
      yi = polyval(th,xi);
  • 將上面代碼保存爲 「polyfits.m」 文件
  • 使用上面的程序代碼,對基礎數據進行 LS 多項式擬合。在 MATLAB 的命令窗口輸入下面的程序
clear all
      clc
      x = [-3:1:3]';
      y = [1.1650 0.0751 -0.6965 0.0591 0.6268 0.3516 1.6961]';
      [x,i] = sort(x);
      y = y(i);
      xi = min(x) + [0:100]/100*(max(x) - min(x));
      for i = 1:4
      	N = 2*i-1;
      	[th,err,yi] = polyfits(x,y,N,xi);
      	subplot(2,2,i)
      	plot(x,y,'o')
      	hold on
      	plot(xi,yi,'-')
      	grid on
      end
  • 獲得的擬合結果 code

  • LS 方法實際上是 WLS 方法的一種特例,至關於將每一個基礎數據的準確度都設爲 1。可是,自行編寫的 M 文件和默認的命令結果不一樣orm

3、非線性曲線擬合blog

  • 非線性曲線擬合是已知輸入向量 xdata,輸出向量 ydata,並知道輸入與輸出的函數關係爲 ydata = F(x,xdata),但不清楚係數向量 x。進行曲線擬合急求 x 使得下式成立: $\displaystyle{min_x} \frac{1}{2}|| F(x,xdata)-ydata||_2^2 = \frac{1}{2}\displaystyle{\sum_i}(F(x,xdata_i) - ydata_i)^2$
  • 在 MATLAB 中,能夠使用函數 curvefit 解決此類問題,其調用格式以下:
    • x = lsqcurvefit(fun,x0,xdata,ydata):x0 爲初始解向量,xdata,ydata 爲知足關係 ydata = F(x,xdata)的數據
    • x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub):lb、ub 爲解向量的下屆和上屆 lb <= x <= ub,若沒有指定界,則lb = [],ub = []
    • x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options):options 爲指定的優化參數
    • [x,resnorm] = lsqcurvefit(…):resnorm 是在 x 處殘差的平方和
    • [x,resnorm,residual] = lsqcurvefit(…):residual 爲在 x 處的殘差
    • [x,resnorm,residual,exitflag] =lsqcurve(…):exitflag 爲終止迭代的條件
    • [x,resnorm,residual,exitflag,output] =lsqcurve(…) :output 爲輸出的優化信息
  • 已知輸入向量 xdata 和輸出向量 ydata,且長度都是 n,使用最小二乘非線性擬合函數:ydata(i) = x(1)·xdata(i)^2+x(2)·\sin(xdata(i))+ x(3)·xdata(i)^3
  • 根據題意可知,目標函數爲:$min_x \frac{1}{2}\displaystyle{\sum_{i=1}^n}(F(x,xdata_i)-ydata_i)^2$
  • 其中:F(x,xdata) = x(1)·xdata^2+x(2)\sin(xdata)+x(3)·xdata^3
  • 初始解向量定位 x0 = [0.3,0.4,0.1]
  • 首先創建擬合函數文件 ex1024.m
function F = ex1024(x,xdata)
      F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
  • 再在命令行編寫函數擬合代碼;
clear all
      clc
      xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
      ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
      x0 = [10,10,10];
      [x,resnorm] = lsqcurvefit(@ex1024,x0,xdata,ydata)
  • 結果爲 $x = \begin{matrix}0.2269 &0.3385 &0.3022\end{matrix} , resnorm = 6.2950$,即函數在 x = 0.226九、x = 0.338五、x = 0.3022 處殘差的平方和均爲 6.295
  • 固然了,還有一鐘好用的東西叫 cftool,簡直不要太簡潔,入門操做請看:MATLAB如何快速進行曲線擬合
相關文章
相關標籤/搜索