來源:https://ww2.mathworks.cn/help/matlab/ref/polyfit.html?searchHighlight=polyfit&s_tid=doc_srchtitle#bue6sxq-1-n
polyfit
說明
示例
將多項式與三角函數擬合
在區間 [0,4*pi]
中沿正弦曲線生成 10 個等間距的點。
x = linspace(0,4*pi,10); y = sin(x);
使用 polyfit
將一個 7 次多項式與這些點擬合。
p = polyfit(x,y,7);
在更精細的網格上計算多項式並繪制結果圖。
x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on plot(x1,y1) hold off
將多項式與點集擬合
創建一個由區間 [0,1]
中的 5 個等間距點組成的向量,並計算這些點處的 y(x)=(1+x)−1。
x = linspace(0,1,5); y = 1./(1+x);
將 4 次多項式與 5 個點擬合。通常,對於 n
個點,可以擬合 n-1
次多項式以便完全通過這些點。
p = polyfit(x,y,4);
在由 0 和 2 之間的點組成的更精細網格上計算原始函數和多項式擬合。
x1 = linspace(0,2); y1 = 1./(1+x1); f1 = polyval(p,x1);
在更大的區間 [0,2]
中繪制函數值和多項式擬合,其中包含用於獲取以圓形突出顯示的多項式擬合的點。多項式擬合在原始 [0,1]
區間中的效果較好,但在該區間外部很快與擬合函數出現差異。
figure
plot(x,y,'o')
hold on plot(x1,y1) plot(x1,f1,'r--') legend('y','y1','f1')
對誤差函數進行多項式擬合
首先生成 x
點的向量,在區間 [0,2.5]
內等間距分布;然后計算這些點處的 erf(x)
。
x = (0:0.1:2.5)'; y = erf(x);
確定 6 次逼近多項式的系數。
p = polyfit(x,y,6)
p = 1×7
0.0084 -0.0983 0.4217 -0.7435 0.1471 1.1064 0.0004
為了查看擬合情況如何,在各數據點處計算多項式,並生成說明數據、擬合和誤差的一個表。
f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
X Y Fit FitError
___ _______ __________ ___________
0 0 0.00044117 -0.00044117
0.1 0.11246 0.11185 0.00060836
0.2 0.2227 0.22231 0.00039189
0.3 0.32863 0.32872 -9.7429e-05
0.4 0.42839 0.4288 -0.00040661
0.5 0.5205 0.52093 -0.00042568
0.6 0.60386 0.60408 -0.00022824
0.7 0.6778 0.67775 4.6383e-05
0.8 0.7421 0.74183 0.00026992
0.9 0.79691 0.79654 0.00036515
1 0.8427 0.84238 0.0003164
1.1 0.88021 0.88005 0.00015948
1.2 0.91031 0.91035 -3.9919e-05
1.3 0.93401 0.93422 -0.000211
1.4 0.95229 0.95258 -0.00029933
1.5 0.96611 0.96639 -0.00028097
⋮
在該區間中,插值與實際值非常符合。創建一個繪圖,以顯示在該區間以外,外插值與實際數據值如何快速偏離。
x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on plot(x1,y1,'-') plot(x1,f1,'r--') axis([0 5 0 2]) hold off
使用中心化和縮放改善數值屬性
創建一個由 1750 - 2000 年的人口數據組成的表,並繪制數據點。
year = (1750:25:2000)'; pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]'; T = table(year, pop)
T=11×2 table
year pop
____ _________
1750 7.91e+08
1775 8.56e+08
1800 9.78e+08
1825 1.05e+09
1850 1.262e+09
1875 1.544e+09
1900 1.65e+09
1925 2.532e+09
1950 6.122e+09
1975 8.17e+09
2000 1.156e+10
plot(year,pop,'o')
使用帶三個輸入的 polyfit
擬合一個使用中心化和縮放的 5 次多項式,這將改善問題的數值屬性。polyfit
將 year
中的數據以 0 為進行中心化,並縮放為具有標准差 1,這可避免在擬合計算中出現病態的 Vandermonde 矩陣。
[p,~,mu] = polyfit(T.year, T.pop, 5);
使用帶四個輸入的 polyval
,根據縮放后的年份 (year-mu(1))/mu(2)
計算 p
。繪制結果對原始年份的圖。
f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off
簡單線性回歸
將一個簡單線性回歸模型與一組離散二維數據點擬合。
創建幾個由樣本數據點 (x,y) 組成的向量。對數據進行一次多項式擬合。
x = 1:50;
y = -0.3*x + 2*randn(1,50);
p = polyfit(x,y,1);
計算在 x
中的點處擬合的多項式 p
。用這些數據繪制得到的線性回歸模型。
f = polyval(p,x);
plot(x,y,'o',x,f,'-') legend('data','linear fit')
具有誤差估計值的線性回歸
將一個線性模型擬合到一組數據點並繪制結果,其中包含預測區間為 95% 的估計值。
創建幾個由樣本數據點 (x,y) 組成的向量。使用 polyfit
對數據進行一次多項式擬合。指定兩個輸出以返回線性擬合的系數以及誤差估計結構體。
x = 1:100;
y = -0.3*x + 2*randn(1,100);
[p,S] = polyfit(x,y,1);
計算以 p
為系數的一次多項式在 x
中各點處的擬合值。將誤差估計結構體指定為第三個輸入,以便 polyval
計算標准誤差的估計值。標准誤差估計值在 delta
中返回。
[y_fit,delta] = polyval(p,x,S);
繪制原始數據、線性擬合和 95% 預測區間 y±2Δ。
plot(x,y,'bo')
hold on plot(x,y_fit,'r-') plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--') title('Linear Fit of Data with 95% Prediction Interval') legend('Data','Linear Fit','95% Prediction Interval')
輸入參數
x
- 查詢點
向量
查詢點,指定為一個向量。x
中的點對應於 y
中包含的擬合函數值。如果 x
不是向量,則 polyfit
將其轉換為列向量 x(:)
。
x
具有重復(或接近重復)的點或者如果 x
可能需要中心化和縮放時的警告消息結果。
數據類型: single
| double
復數支持: 是
y
- 查詢點位置的擬合值
向量
查詢點位置的擬合值,指定為向量。y
中的值對應於 x
中包含的查詢點。如果 y
不是向量,則 polyfit
將其轉換為列向量 y(:)
。
數據類型: single
| double
復數支持: 是
n
- 多項式擬合的次數
正整數標量
多項式擬合的次數,指定為正整數標量。n
指定 p
中最左側系數的多項式冪。
輸出參數
p
- 最小二乘擬合多項式系數
向量
最小二乘擬合多項式系數,以向量的形式返回。p
的長度為 n+1
,包含按降冪排列的多項式系數,最高冪為 n
。如果 x
或 y
包含 NaN
值且 n < length(x)
,則 p
的所有元素均為 NaN
。
使用 polyval
計算 p
在查詢點處的解。
S
- 誤差估計結構體
結構體
誤差估計結構體。此可選輸出結構體主要用作 polyval
函數的輸入,以獲取誤差估計值。S
包含以下字段:
字段 | 說明 |
---|---|
R |
Vandermonde 矩陣 x 的 QR 分解的三角因子 |
df |
自由度 |
normr |
殘差的范數 |
如果 y
中的數據是隨機的,則 p
的估計協方差矩陣是 (Rinv*Rinv')*normr^2/df
,其中 Rinv
是 R
的逆矩陣。
如果 y
中數據的誤差呈獨立正態分布,並具有常量方差,則 [y,delta] = polyval(...)
可生成至少包含 50% 的預測值的誤差邊界。即 y
± delta
至少包含 50% 對 x
處的未來觀測值的預測值。
mu
- 中心化值和縮放值
二元素向量
中心化值和縮放值,以二元素向量形式返回。mu(1)
為 mean(x)
,mu(2)
為 std(x)
。這些值以單位標准差將 x
中的查詢點的中心置於零值處。
使用 mu
作為 polyval
的第四個輸入以計算 p
在縮放點 (x - mu(1))/mu(2)
處的解。
局限性
-
在涉及很多點的問題中,使用
polyfit
增加多項式擬合的次數並不總能得到較好的擬合。高次多項式可以在數據點之間振動,導致與數據之間的擬合較差。在這些情況下,可使用低次多項式擬合(點之間傾向於更平滑)或不同的方法,具體取決於該問題。 -
多項式在本質上是無邊界的振盪函數。所以,它們並不非常適合外插有界的數據或單調(遞增或遞減)的數據。
算法
polyfit
使用 x
構造具有 n+1
列和 m = length(x)
行的 Vandermonde 矩陣 V
並生成線性方程組
xn1xn2⋮xnmxn−11xn−12⋮xn−1m⋯⋯⋱⋯11⋮1p1p2⋮pn+1=y1