一、實驗内容
已知一組實驗資料如下表,求它的拟合曲線。
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
拟合曲線如下所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcRTSq1UMrpXTz0keYdHMywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3PwEjN1IDM3ETMwcDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
三、實驗總結
在本次實驗中,我将編寫的算法的功能擴大,使之不僅僅限于能夠完成進行五個離散點、一次方的最小二乘拟合,而是能夠完成任意多離散點、任意次的最小二乘拟合,離散點集、權值由控制台手動創立一個矩陣來輸入,而所求的拟合次方也能在控制台輸入,達到了普遍适用的目的。