ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

polyfit

構文

p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)

説明

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) です。polyfit は、これらの値を使用して x をゼロにセンタリングし、スケーリングして以下の単位標準偏差を取るようにします。

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

[0,1] の区間内で等間隔に配置された 5 つの点のベクトルを作成し、それらの点で を評価します。

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

最初に、区間 [0,2.5] で等間隔に分布する x 個の点からなるベクトルを作成し、これらの点で erf(x) を計算します。

x = (0:0.1:2.5)';
y = erf(x);

6 次の近似多項式の係数を求めます。

p = polyfit(x,y,6)
p = 

    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
    1.6    0.97635       0.97652    -0.00016704
    1.7    0.98379       0.98379     8.3306e-07
    1.8    0.98909       0.98893     0.00016278
    1.9    0.99279       0.99253     0.00025791
      2    0.99532       0.99508     0.00024347
    2.1    0.99702       0.99691      0.0001131
    2.2    0.99814       0.99823    -8.8548e-05
    2.3    0.99886       0.99911    -0.00025673
    2.4    0.99931       0.99954    -0.00022451
    2.5    0.99959       0.99936     0.00023151

この区間内では、内挿値と実際の値は、かなり一致しています。この区間の外側で外挿値が実際のデータからどの程度急速に離れるのかを見るためにプロットを作成します。

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

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

入力引数

すべて折りたたむ

クエリ点。ベクトルとして指定します。x の点は、y に含まれる近似された関数の値に対応します。

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

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

クエリ点における近似値。ベクトルとして指定します。y の値は、x に含まれるクエリ点に対応します。

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

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

出力引数

すべて折りたたむ

最小二乗近似多項式の係数。ベクトルとして返されます。p の長さは n+1 で、最大べき乗が n である多項式の係数を降べきの順に含みます。x または y のいずれかに NaN 値が含まれ、n < length(x) である場合、p のすべての要素が NaN です。

クエリ点で p を計算するには polyval を使用します。

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

フィールド説明
Rx のヴァンデルモンド行列の QR 分解によって得られる三角因子
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 のクエリ点をゼロにセンタリングし、標準偏差 1 をもつようにします。

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

制限

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

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

アルゴリズム

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

(x1nx1n11x2nx2n11xmnxmn11)(p1p2pn)=(y1y2ym),

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

拡張機能

R2006a より前に導入

この情報は役に立ちましたか?