天天看點

最小二乘法的曲線拟合方法在MATLAB中的實作

一、實驗内容

已知一組實驗資料如下表,求它的拟合曲線。

 x(i) 1 2 3 4 5
 f(i) 4 4.5 6 8 8.5
 w(i) 2 1 3 1 1

二、程式清單與運作結果 

M檔案代碼如下:

function S=mypolyfit(X,F,W,m,n)
% mypolyfit輸出通過最小二乘法求得的拟合曲線并繪圖驗證
% 例如:
% X=[1 2 3 4 5];
% F=[4 4.5 6 8 8.5];
% W=[2 1 3 1 1];
% S=mypolyfit(X,F,W,4,1)
% 
% G =
% 
%     [  8, 22]
%     [ 22, 74]
% 
% 
% d =
% 
%     47
%     291/2
% 
% 
% S =
% 
%     (65*x)/54 + 277/108
 
% 判斷輸入參數是否足夠
if nargin~=5
    error('請輸入最小二乘的用矩陣表示的離散點集、權值與點的個數和拟合次方')
end
 
% 判斷離散點集和權值的個數是否充分
C=[X',F',W'];
[r c]=size(C);
number=r*c;
if number~=3*(m+1)
    error('離散點集和權值的個數不充分')
end

% 生成線性無關函數族
syms x;
for i=1:n+1
    A(i)=x^(i-1);
end
 
% 計算G
for j=1:n+1
    for i=1:n+1
        for k=1:m+1
            B(k)=W(k)*subs(A(i),x,k)*subs(A(j),x,k);
        end
        G(i,j)=sum(B);
    end
end
G
 
% 計算d
for j=1:n+1
    for k=1:m+1
        B(k)=W(k)*F(k)*subs(A(j),x,k);
    end
    d(j)=sum(B);
end
d=d'
 
% 求出拟合曲線的系數
G=G^-1;
C=G*d;
S=0;
for i=1:n+1
    S=S+C(i)*x^(i-1);
end
 
% 畫圖
scatter(X,F,'+');
hold on;
ezplot(S,[0,6]);
xlabel('x')
ylabel('y')
title('拟合曲線')

end
           

運作結果如下:

>> S=mypolyfit(X,F,W,4,1)
 
G =
 
[  8, 22]
[ 22, 74]
 
 
d =
 
    47
 291/2
 
 
S =
 
(65*x)/54 + 277/108
           

拟合曲線如下所示:

最小二乘法的曲線拟合方法在MATLAB中的實作

三、實驗總結

在本次實驗中,我将編寫的算法的功能擴大,使之不僅僅限于能夠完成進行五個離散點、一次方的最小二乘拟合,而是能夠完成任意多離散點、任意次的最小二乘拟合,離散點集、權值由控制台手動創立一個矩陣來輸入,而所求的拟合次方也能在控制台輸入,達到了普遍适用的目的。

繼續閱讀