最小二乘法曲線擬合以及Matlab實現
在實際工程中,我們常會遇到這種問題:已知一組點的橫縱座標,需要繪製出一條儘可能逼近這些點的曲線(或直線),以進行進一步進行加工或者分析兩個變量之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。
目錄
- 最小二乘法直線擬合原理
- 曲線擬合
- Matlab實現代碼
最小二乘法直線線擬合原理
首先,我們從曲線擬合的最簡單情況——直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線 爲其擬合方程,係數 爲待求解項,已知:
。
用矩陣形式表達爲: ,其中:
要求解A,可在方程兩邊同時左乘 的逆矩陣,如果它是一個方陣且非奇異的話。
但是,一般情況下 連方陣都不是,所以我們在此需要用 構造一個方陣,即方程兩邊同時左乘 的轉置矩陣,得到方程: 。
此時,方程的係數矩陣 爲方陣,所以兩邊同時左乘新系數矩陣 的逆矩陣,便可求得係數向量A ,即: 。
方程 右邊各部分均已知,所以可直接求解得到擬合直線的方程係數向量A。
曲線線擬合
當樣本點的分佈不爲直線時,我們可用多項式曲線擬合,即擬合曲線方程爲n階多項式
。
用矩陣形式表示爲: ,其中:
待求解項爲係數向量 。
曲線擬合方程 的求解方法與上面直線的求解方法一樣,也是在方程 兩邊同左乘 的轉置矩陣得到: ,
再同時在新方程兩邊同時左乘 的逆矩陣,得到:
上式左邊各部分均已知,所以可直接求解得擬合曲線方程的係數向量A。
Matlab實現代碼
%by [email protected]
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~,k]=size(x);
for n=1:9
X0=zeros(n+1,k);
for k0=1:k %構造矩陣X0
for n0=1:n+1
X0(n0,k0)=x(k0)^(n+1-n0);
end
end
X=X0';
ANSS=(X'*X)\X'*y';
for i=1:n+1 %answer矩陣存儲每次求得的方程係數,按列存儲
answer(i,n)=ANSS(i);
end
x0=0:0.01:17;
y0=ANSS(1)*x0.^n ;%根據求得的係數初始化並構造多項式方程
for num=2:1:n+1
y0=y0+ANSS(num)*x0.^(n+1-num);
end
subplot(3,3,n)
plot(x,y,'*')
hold on
plot(x0,y0)
end
suptitle('不同次數方程曲線擬合結果,從1到9階')
運行結果
擬合曲線結果:
可以看出看來,當多項式的階數過小是,曲線並不能很好地反映出樣本點的分佈情況;但階數過高時,會出現過擬合的情況。
係數矩陣answer:
Matlab自帶函數——polyfit
在matlab中,也有現成的曲線擬合函數polyfit,其也是基於最小二乘原理實現的,具體用法爲:ans=polyfit(x,y,n). 其中x,y爲待擬合點的座標向量,n爲多項式的階數。
下面代碼是用polyfit函數來做曲線擬合:
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
[~,k]=size(x);
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
for n=1:9
ANSS=polyfit(x,y,n); %用polyfit擬合曲線
for i=1:n+1 %answer矩陣存儲每次求得的方程係數,按列存儲
answer(i,n)=ANSS(i);
end
x0=0:0.01:17;
y0=ANSS(1)*x0.^n ; %根據求得的係數初始化並構造多項式方程
for num=2:1:n+1
y0=y0+ANSS(num)*x0.^(n+1-num);
end
subplot(3,3,n)
plot(x,y,'*')
hold on
plot(x0,y0)
end
suptitle('不同次數方程曲線擬合結果,從1到9階')
####運行結果:
用polyfit擬合的結果與第一份代碼運行的結果基本一樣
申明
本文爲本人原創,轉載請註明出處!