ドキュメンテーション

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

spline

3 次スプライン データ内挿

説明

s = spline(x,y,xq) は、xq のクエリ点に対応する内挿値のベクトル s を返します。s の値は xy の 3 次スプライン内挿により決定されます。

pp = spline(x,y) は、ppval とスプライン ユーティリティ unmkpp で使用する区分的多項式の構造体を返します。

すべて折りたたむ

spline を使用して、等間隔のサンプル点に正弦曲線を内挿します。

x = [0 1 2.5 3.6 5 7 8.1 10];
y = sin(x);
xx = 0:.25:10;
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)

端点の勾配が判明している場合に、固定または完全スプライン内挿を使用します。この例では、内挿の端点での勾配を強制的にゼロにしています。

x = -4:4;
y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0];
cs = spline(x,[0 y 0]);
xx = linspace(-4,4,101);
plot(x,y,'o',xx,ppval(cs,xx),'-');

データセットを外挿して人口増加を予測します。

1900 年から 1990 年までのアメリカ合衆国の国勢調査の実施年 (t) のベクトルと、それに対応した合衆国の百万人単位での人口 (p) を表す 2 つのベクトルを作成します。

t = 1900:10:1990;
p = [ 75.995  91.972  105.711  123.203  131.669 ...
     150.697 179.323  203.212  226.505  249.633 ];

3 次スプラインを使用して、2000 年の人口を外挿して予測します。

spline(t,p,2000)
ans = 270.6060

上記は、o でマークした 5 個のデータ点 y(:,2),...,y(:,6) をもつ円のプロットを作成します。行列 y の列数は x より 2 列多くなっています。そのため、spliney(:,1)y(:,end) を端点の勾配として使用します。円の始点と終点は点 (1,0) なので、この点は 2 回プロットされます。

x = pi*[0:.5:2]; 
y = [0  1  0 -1  0  1  0; 
     1  0  1  0 -1  0  1];
pp = spline(x,y);
yy = ppval(pp, linspace(0,2*pi,101));
plot(yy(1,:),yy(2,:),'-b',y(1,2:5),y(2,2:5),'or')
axis equal

スプラインを使用して、細かいメッシュで関数をサンプリングします。

0 と 1 の間のいくつかの値に対して正弦曲線と余弦曲線を生成します。スプライン内挿を使用して、細かいメッシュで関数をサンプリングします。

x = 0:.25:1;
Y = [sin(x); cos(x)];
xx = 0:.1:1;
YY = spline(x,Y,xx);
plot(x,Y(1,:),'o',xx,YY(1,:),'-')
hold on
plot(x,Y(2,:),'o',xx,YY(2,:),':')
hold off

2 つの異なる関数に対して splinepchip により生成された内挿結果を比較します。

x の値のベクトル、点 y での関数値、クエリ点 xq を作成します。splinepchip の両方を使用して、クエリ点での内挿を計算します。比較のため、クエリ点での内挿関数値をプロットします。

x = -3:3; 
y = [-1 -1 -1 0 1 1 1]; 
xq1 = -3:.01:3;
p = pchip(x,y,xq1);
s = spline(x,y,xq1);
plot(x,y,'o',xq1,p,'-',xq1,s,'-.')
legend('Sample Points','pchip','spline','Location','SouthEast')

この場合、pchip はサンプル点間で大幅に変動していないため、こちらの方が適しています。

振動サンプル関数を使用して、2 回目の比較を行います。

x = 0:25;
y = besselj(1,x);
xq2 = 0:0.01:25;
p = pchip(x,y,xq2);
s = spline(x,y,xq2);
plot(x,y,'o',xq2,p,'-',xq2,s,'-.')
legend('Sample Points','pchip','spline')

基になる関数が振動関数である場合、pchip よりも spline の方が点の間の動きをより良好にキャプチャします。

入力引数

すべて折りたたむ

x 座標。ベクトルとして指定します。ベクトル x は、データ y が与えられる時点を指定します。x の要素は一意でなければなりません。

データ型: single | double

x 座標での関数値。数値ベクトル、行列または配列として指定します。xy は通常は同じ長さですが、y は端点の勾配を指定するために x よりも厳密に 2 つ多い要素をもつことができます。

y が行列または配列の場合、最後の次元の値 y(:,...,:,j)x に一致させる値として使用されます。この場合、y の最後の次元は x と同じ長さであるか、厳密に 2 つ多い要素がなければなりません。

3 次スプラインの端点の勾配は次の規則に従います。

  • x および y が同じサイズのベクトルである場合、節点なしの端点条件が使用される。

  • x または y がスカラーである場合、長さがもう一方と同じになるように拡張され、節点なしの端点条件が使用される。

  • yx より 2 つ多い値をもつベクトルの場合、spliney の最初と最後の値を 3 次スプラインの端点の勾配として使用する。たとえば、y がベクトルの場合、次のようになります。

    • y(2:end-1) は、x の各点での関数値を返す。

    • y(1) は、min(x) の位置の間隔について、開始時の勾配を返す。

    • y(end) は、max(x) の位置の間隔について、終了時の勾配を返す。

  • 同様に、y が行列または length(x)+2 に等しい size(y,N) をもつ N 次元配列の場合、以下のようになります。

    • j = 1:length(x) について、y(:,...,:,j+1)x の各点での関数値を返す。

    • y(:,:,...:,1) は、min(x) の位置の各間隔について、開始時の勾配を返す。

    • y(:,:,...:,end) は、max(x) の位置の各間隔について、終了時の勾配を返す。

データ型: single | double

クエリ点。ベクトルとして指定します。xq で指定された点は、spline で計算される内挿関数値 s の x 座標です。

データ型: single | double

出力引数

すべて折りたたむ

クエリ点における内挿値。ベクトル、行列または配列として返されます。

s のサイズは、yxq のサイズに関連しています。

  • y がベクトルの場合、s のサイズは xq と同じです。

  • y がサイズ Ny = size(y) の配列の場合、以下の条件が適用されます。

    • xq がスカラーまたはベクトルの場合、size(s)[Ny(1:end-1) length(xq)] を返す。

    • xq が配列の場合、size(s)[Ny(1:end-1) size(xq)] を返す。

区分的多項式。構造体として返されます。この構造体は関数 ppval とあわせて使用し、区分的多項式を 1 つ以上のクエリ点で評価します。これらの構造体には次のフィールドがあります。

フィールド説明
form

"区分的多項式" の場合 'pp'

breaks

長さ L+1 のベクトル。このベクトルには厳密に増加する要素があり、 L 個の区間のそれぞれについて開始と終了を表しています。

coefs

Lk 列の行列。各行 coefs(i,:) は、i 番目の区間 [breaks(i),breaks(i+1)] における k 次多項式の局所的な係数を含みます。

pieces

区分の数 (L)

order

多項式の次数

dim

ターゲットの次元

coefs の多項式係数は各区間の局所的な係数であるため、従来の多項方程式で係数を使用するには対応する節点区間の下限端点を減算しなければなりません。言い換えれば、区間 [x1,x2] の係数 [a,b,c,d] について、対応する多項式は次のようになります。

f(x)=a(xx1)3+b(xx1)2+c(xx1)+d.

ヒント

  • また、関数 interp1 を使用して、コマンド interp1(x,y,xq,'spline') でスプライン内挿を実行できます。spline が入力行列の行方向に内挿を実行する一方で、interp1 は入力行列の列方向に内挿を実行します。

アルゴリズム

三重対角線形方程式 (いくつかの右辺をもつ可能性があります) は、内挿するスプラインを作成するさまざまな 3 次多項式の係数を示すために必要な情報を基に解かれます。関数 spline は、関数 ppvalmkppunmkpp を使用します。これらのルーチンは、区分的多項式に機能する関数群です。より高度な機能へのアクセスについては、interp1 または Curve Fitting Toolbox™ スプライン関数を参照してください。

参照

[1] de Boor, Carl. A Practical Guide to Splines. Springer-Verlag, New York: 1978.

拡張機能

参考

| | | |

R2006a より前に導入