最小二乘法的曲線擬合方法在MATLAB中的實現

2021-08-21 03:47:16 字數 1844 閱讀 3188

一、實驗內容

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

x(i)12

345f(i)

44.568

8.5w(i)21

311二、程式清單與執行結果

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);

endg(i,j)=sum(b);

endendg

% 計算d

for j=1:n+1

for k=1:m+1

b(k)=w(k)*f(k)*subs(a(j),x,k);

endd(j)=sum(b);

endd=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 =

47291/2

s =

(65*x)/54 + 277/108

擬合曲線如下所示:

三、實驗總結

在本次實驗中,

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

最小二乘法曲線擬合

設有如下實驗資料x1 2345 6789 1011 1213 141516y 46.4 88.8 9.22 9.59.7 9.86 1010.2 10.32 10.42 10.5 10.55 10.58 10.60 試用最小二乘法多次 1到5次 多項式曲線擬合以上資料。import numpy as...

最小二乘法曲線擬合

在實際工程中,我們常會遇到這種問題 已知一組點的橫縱座標,需要繪製出一條盡可能逼近這些點的曲線 或直線 以進行進一步進行加工或者分析兩個變數之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。首先,我們從曲線擬合的最簡單情況 直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線...

最小二乘法的曲線擬合

最小二乘法的曲線擬合 bool cdatadistillview leastdoublemultiplication long px,long py,long m,long n,double result,double warp for i 0 i m i z 0 b 0 1 d1 n p 0 c ...