matlab中polyfit


來源:https://ww2.mathworks.cn/help/matlab/ref/polyfit.html?searchHighlight=polyfit&s_tid=doc_srchtitle#bue6sxq-1-n

polyfit

多項式曲線擬合

全頁折疊
 

說明

示例

p = polyfit(x,y,n) 返回次數為 n 的多項式 p(x) 的系數,該階數是 y 中數據的最佳擬合(在最小二乘方式中)。p 中的系數按降冪排列,p 的長度為 n+1

p(x)=p1xn+p2xn1+...+pnx+pn+1.

[p,S] = polyfit(x,y,n) 還返回一個結構體 S,后者可用作 polyval 的輸入來獲取誤差估計值。

示例

[p,S,mu] = polyfit(x,y,n) 還返回 mu,后者是一個二元素向量,包含中心化值和縮放值。mu(1)mean(x)mu(2)std(x)。使用這些值時,polyfitx 的中心置於零值處並縮放為具有單位標准差

ˆ

這種中心化和縮放變換可同時改善多項式和擬合算法的數值屬性。

 

示例

全部折疊

將多項式與三角函數擬合

在區間 [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 次多項式,這將改善問題的數值屬性。polyfityear 中的數據以 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。如果 xy 包含 NaN 值且 n < length(x),則 p 的所有元素均為 NaN

使用 polyval 計算 p 在查詢點處的解。

S - 誤差估計結構體
結構體

誤差估計結構體。此可選輸出結構體主要用作 polyval 函數的輸入,以獲取誤差估計值。S 包含以下字段:

 

字段 說明
R Vandermonde 矩陣 x 的 QR 分解的三角因子
df 自由度
normr 殘差的范數

如果 y 中的數據是隨機的,則 p 的估計協方差矩陣是 (Rinv*Rinv')*normr^2/df,其中 RinvR 的逆矩陣。

如果 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 並生成線性方程組

xn

其中 polyfit 使用 p = V\y 求解。由於 Vandermonde 矩陣中的列是向量 x 的冪,因此條件數 V 對於高階擬合來說通常較大,生成一個奇異系數矩陣。在這些情況下,中心化和縮放可改善系統的數值屬性以產生更可靠的擬合。

擴展功能

用法說明和限制:

XY 必須為列向量。

有關詳細信息,請參閱 tall 數組

用法說明和限制:

 

 

GPU 數組
通過使用 Parallel Computing Toolbox™ 在圖形處理單元 (GPU) 上運行來加快代碼執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM