Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

polyfit

説明

p = polyfit(x,y,n) は、y のデータに対して (最小二乗的に) 最適な近似となる n 次の多項式 p(x) の係数を返します。p の係数は降べきの順で、p の長さは n+1 になります。

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

[p,S] = polyfit(x,y,n) はさらに、誤差推定を得るために polyval への入力として使用可能な構造体 S を返します。

[p,S,mu] = polyfit(x,y,n) は、センタリングとスケーリングを実行して、多項式アルゴリズムと近似アルゴリズムの両方の数値特性を改善します。この構文はさらに、センタリングとスケーリングの値をもつ 2 要素ベクトル mu を返します。mu(1)mean(x) で、mu(2)std(x) です。これらの値を使用して、polyfitx をゼロにセンタリングし、それが以下の単位標準偏差をもつようにスケーリングします。

x^=xx¯σx.

すべて折りたたむ

[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

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

[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')

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent y, y1, f1.

最初に、区間 [0,2.5] で等間隔に分布する x 個の点からなるベクトルを作成し、これらの点で 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

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers

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

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

3 出力の polyfit を使用し、センタリングとスケーリングを使用して 5 次の多項式をあてはめます。これにより問題の数値特性が向上します。polyfityear のデータを 0 にセンタリングし、標準偏差が 1 になるようにスケーリングします。これにより近似計算において悪条件のヴァンデルモンド行列を避けることができます。

[p,~,mu] = polyfit(T.year, T.pop, 5);

polyval を 4 入力で使用し、p をスケーリングされた年 (year-mu(1))/mu(2) に対して評価します。結果を元の年に対してプロットします。

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

単純な線形回帰モデルを、一連の離散 2 次元データ点に近似します。

サンプル データ点のベクトル (x,y) をいくつか作成します。1 次多項式をデータに近似します。

x = 1:50; 
y = -0.3*x + 2*randn(1,50); 
p = polyfit(x,y,1); 

近似多項式 px の点で評価します。その結果得られる線形回帰モデルをデータでプロットします。

f = polyval(p,x); 
plot(x,y,'o',x,f,'-') 
legend('data','linear fit') 

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent data, linear fit.

線形モデルでデータ点セットを近似し、95% の予測区間の推定を含めて結果をプロットします。

サンプル データ点のベクトル (x,y) をいくつか作成します。polyfit を使用して、1 次多項式でデータを近似します。線形近似の係数と誤差推定値の構造体を返す 2 つの出力を指定します。

x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 

x の各点で p の 1 次多項式近似を評価します。polyval の 3 番目の入力として誤差推定の構造体を指定し、標準誤差の推定値を計算します。標準誤差の推定値は 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')

Figure contains an axes object. The axes object with title Linear Fit of Data with 95% Prediction Interval contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Linear Fit, 95% Prediction Interval.

入力引数

すべて折りたたむ

クエリ点。ベクトルとして指定します。x の点は、y に含まれる近似された関数の値に対応します。x がベクトルでない場合、polyfit はそれを列ベクトル x(:) に変換します。

x が同じ点 (またはほぼ同じ点) を含む場合または x のセンタリングやスケーリングが必要になる可能性がある場合には、警告メッセージが出力されます。

データ型: single | double
複素数のサポート: あり

クエリ点における近似値。ベクトルとして指定します。y の値は、x に含まれるクエリ点に対応します。y がベクトルでない場合、polyfit はそれを列ベクトル y(:) に変換します。

データ型: single | double
複素数のサポート: あり

多項式近似の次数。正の整数スカラーとして指定します。n は、p の最も左の係数の、多項式のべき乗を指定します。

出力引数

すべて折りたたむ

最小二乗近似多項式の係数。ベクトルとして返されます。p の長さは n+1 で、最大べき乗が n である多項式の係数を降べきの順に含みます。x または y のいずれかに NaN 値が含まれ、n < length(x) である場合、p のすべての要素が NaN です。データのセンタリングとスケーリングを行うために 3 つの出力引数を指定した場合、polyfit は、データのセンタリングとスケーリングを行わない場合とは異なる係数を p に返します。

クエリ点における p を評価するには、polyval を使用します。

誤差推定の構造体。このオプションの出力構造体は、主に誤差推定を得るために関数 polyval への入力として使用します。S には次のフィールドが含まれています。

フィールド説明
Rx のヴァンデルモンド行列の QR 分解によって得られる (置換されている可能性がある) 三角 R 因子
df自由度
normr残差のノルム

データ y がランダムな場合、p の共分散行列の推定は、(Rinv*Rinv')*normr^2/df になります。ここで、RinvR の逆行列です。

y のデータの誤差が一定の分散をもつ独立した正規分布の場合、関数 [y,delta] = polyval(...) は少なくとも予測の 50% を含む誤差範囲を出力します。つまり y ± delta の範囲には、x において予想される将来の観測値の 50% 以上が含まれます。

センタリング値とスケーリング値。2 要素ベクトルとして返されます。mu(1)mean(x)mu(2)std(x) です。これらの値は、x のクエリ点が単位標準偏差をもち、ゼロ センタリングされるために使用されます。

mupolyval への 4 番目の入力として使用すると、スケーリングされた点 (x - mu(1))/mu(2)p を計算します。

制限

  • 多くの点をもつ問題に対して polyfit を使用して多項式近似の次元数を増やしても、より優れた近似が得られるとは限りません。高次の多項式はデータ点の間で振動する場合があり、データの "より劣った" 近似になる場合があります。このような場合は、低次の多項式近似 (点の間がより滑らかになる傾向がある) や別の手法を問題に応じて使用します。

  • 多項式は本質的に非有界の振動関数です。このため、有界のデータや、単調増加または単調減少するデータの外挿にはあまり適していません。

アルゴリズム

polyfitx を使用して n+1 列および m = length(x) 行のヴァンデルモンド行列 V を形成し、次の線形方程式を導きます。

(x1nx1n11x2nx2n11xmnxmn11)(p1p2pn+1)=(y1y2ym),

polyfit はこれを p = V\y によって解きます。ヴァンデルモンド行列の列はベクトル x のべき乗であるため、V の条件数は高次の近似の場合にはしばしば大きくなり、結果として特異係数行列になります。このような場合、センタリングとスケーリングによって方程式の数値特性が向上し、信頼性の高い近似が得られる場合があります。

拡張機能

バージョン履歴

R2006a より前に導入