Main Content

spaps

説明

メモ

簡単で柔軟性が低い方法で平滑化スプラインを生成するには、曲線フィッターアプリまたは関数 fit を使用してみてください。

sp = spaps(x,y,tol) は、与えられたデータ点 (x(j), y(:,j)), j=1:length(x) の指定された許容誤差 tol 内にある最も滑らかな関数 f の B 型を返します。データ値 y(:,j) はスカラー、ベクトル、行列、または場合によっては N 次元配列です。同じデータ サイトをもつデータ点は加重平均で置き換えられ、その重みは対応する重みの合計となり、それに合わせて許容誤差 tol が減少します。

[sp,values] = spaps(x,y,tol) は平滑化された値も返します。valuesfnval(sp,x) と同じになります。

ここで、与えられたデータからの関数 f の距離は、次のように測定されます。

E(f)=j=1nw(j)|(y(:,j)f(x(j)))|2

重み w に既定値を選択すると、E(f) は min(x)max(x)|yf|2 の複合台形則近似となり、|z|2 は z のエントリの二乗和を示します。

さらに、"最も滑らかな" は、次の粗さ測定が最小化されることを意味します。

F(Dmf)=min(x)max(x)λ(t)|Dmf(t)|2dt

ここで、Dmf は f の m 階微分を示します。m の既定値は 2 で、粗さ測定の重み λ の既定値は定数 1 です。これにより f は 3 次平滑化スプラインになります。

tol が非負の場合、スプライン f は式 ρE(f) + F(Dmf) の一意の最小化関数となり、E(f) が tol と等しくなるよう選択された平滑化パラメーター ρ (オプションで返される) が使用されます。したがって、m2 である場合、pp 型への変換後、結果は csaps(x,y,ρ/(ρ + 1)) で得られるものと同じ (丸めを除く) になります。さらに、tol がゼロの場合、次数 2m の "自然な" または変分スプライン内挿が返されます。さらに tol が非常に大きくなると、m より小さい次数の多項式によるデータの最小二乗近似が返されます。

tol が負の場合、ρ は -tol となります。

粗さ測定における重み関数 λ の既定値は定数関数 1 です。ただし、データ サイトでのみブレークを使用する、より一般的な区分的な定数関数にすることができます。ベクトル x が厳格に増加すると仮定した場合、tolx と同じサイズのベクトルとして入力して、このような区分的な定数 λ を指定します。この場合、tol(i) は、区間 (x(i-1) .. x(i)) における λ の定数値 i=2:length(x) として使用されますが、tol(1) は引き続き指定された許容誤差として使用されます。

[sp,values,rho] = spaps(x,y,tol) は、3 番目の出力引数として使用される ρ の実際の値も返します。

[...] = spaps(x,y,tol,w,m) では、重みベクトル w または整数 m (あるいはその両方) を argi として指定することができます。この場合、wx と同じサイズの非負のベクトルでなければなりません。m1 (区分線形平滑化スプラインの場合)、2 (既定の 3 次平滑化スプラインの場合)、または 3 (5 次平滑化スプラインの場合) でなければなりません。

結果の平滑化スプライン sp が基本区間外で評価される場合は、その m 次導関数が該当区間外でゼロになるように fnxtr(sp,m) で置き換えられます。

[...] = spaps({x1,...,xr},y,tol,...) は、特定の "グリッド データ" に対して指定された許容誤差内にほぼおさまる r 変量テンソル積平滑化スプラインの B 型を返します。"散布" データの場合は tpaps を使用してください。ここでは、y には対応するグリッド値を指定する必要があります。size(y) は、関数がスカラー値である場合は [length(x1),...,length(xr)] と等しくなり、関数が d 値である場合は [d,length(x1),...,length(xr)] と等しくなります。さらに、tolr エントリを持つ cell 配列でなければなりません。tol{i} は、i 次変数の一変量 (ただしベクトル値) 平滑化スプラインが作成されている場合は i 番目のステップ中に使用される許容誤差です。m のオプションの入力は r ベクトル (セット {1,2,3} からのエントリを使用) でなければなりません。また、w のオプションの入力は長さ r の cell 配列でなければなりません。w{i} は空 (既定の選択が必要であることを示す) または xi と同じ長さの正のベクトルです。

すべて折りたたむ

このコードは、ノイズのない基のデータにきわめて近いと予想される、ノイズを含んだデータに対する近似を返します。基データはゆっくり変化する関数に由来し、使用される TOL はノイズのサイズに適したサイズであるためです。

x = linspace(0,2*pi,21); y = sin(x) + (rand(1,21)-.5)*.2;
sp = spaps(x,y, (.05)^2*(x(end)-x(1)) );
fnplt(sp)

Figure contains an axes object. The axes object contains an object of type line.

このコードは、前と同じデータと許容誤差を使用していますが、区間の右半分で粗さの重みが 0.1 になるように選択しています。これにより、滑らかさが粗くなるものの、より形状の近い近似になります。

sp1 = spaps(x,y, [(.025)^2*(x(end)-x(1)),ones(1,10),repmat(.1,1,10)] );
fnplt(sp1)

Figure contains an axes object. The axes object contains an object of type line.

最後に、前に取得した 2 つの 3 次平滑化スプラインを比較します。

fnplt(sp); 
hold on
fnplt(sp1,'r')
plot(x,y,'ok')
hold off
title('Two cubic smoothing splines')
xlabel('The red one has reduced smoothness requirement in right half.')

Figure contains an axes object. The axes object with title Two cubic smoothing splines contains 3 objects of type line.

この例では、平滑な二変量関数からのノイズを含むデータに対し、滑らかな近似を生成します。ここで ndgrid を使用していることに注意してください。meshgrid を使用するとエラーになります。

x = -2:.2:2; y=-1:.25:1; 
[xx,yy] = ndgrid(x,y); 
rng(39);
z = exp(-(xx.^2+yy.^2)) + (rand(size(xx))-.5)/30;
sp = spaps({x,y},z,8/(60^2));  
fnplt(sp)
axis off

入力引数

すべて折りたたむ

近似対象のデータ値 y のデータ サイト。ベクトル、または多変量データの場合は cell 配列として指定します。スプライン f は、j のすべての値について f(x(j)) = y(:,j) を満たすよう、各データ サイト x の節点によって作成されます。

多変量グリッド データの場合、x を、各変数の次元のデータ サイトを指定する cell 配列として指定できます。f(x1(i),x2(j),...xn(k)) = y(:,i,j,...,k)

データ型: single | double

スプライン作成時の近似対象のデータ値。ベクトル、行列、または配列として指定します。データ値 y(:,j) は、スカラー、行列、または n 次元配列にすることができます。同じデータ サイト x のデータ値は平均化されます。

データ型: single | double

与えられたデータ点の許容誤差。スカラーとして指定します。

データ型: single | double

データ点の重み w。x と同じサイズの非負エントリのベクトルとして指定します。

微分の階数。スカラーとして指定します。この値は、1 (区分線形平滑化スプラインの場合)、2 (既定の 3 次平滑化スプラインの場合)、または 3 (5 次平滑化スプラインの場合) でなければなりません。

データ型: single | double

出力引数

すべて折りたたむ

B 型のスプライン。次のフィールドがある構造体として返されます。

スプラインの形式。B- として返されます。B- は、スプラインが B 型であることを示します。

スプラインの節点の位置。ベクトル、または多変量データの場合はベクトルの cell 配列として返されます。ベクトルには厳密に増加する要素が含まれます。これらの要素は、多項式区分が定義される各区間の開始と終了を表します。

各区分の多項式の係数。行列、または多変量データの場合は配列として返されます。

スプラインを記述する多項式区分の数。スカラー、または多変量データの場合は各変数の区分数のベクトルとして返されます。

スプラインの各多項式区分を記述する多項式関数の次数。スカラー、または多変量データの場合は各変数の次数を含むベクトルとして返されます。

ターゲット関数の次元。スカラーとして返されます。

x の各点におけるスプラインの値。ベクトルとして、または多変量データの場合は行列または配列として返されます。

スプラインの計算に使用された平滑化パラメーター。スカラーとして、または多変量データの場合はスカラー値の cell 配列として返されます。

アルゴリズム

この関数では、Reinsch のアプローチ[1]を使用しています (適切な初期推定値が利用でき、また、ニュートン法が収束および高速な収束で保証されるように最適な平滑化パラメーターの方程式を選択するための方法を含む)。

参照

[1] C. Reinsch. "Smoothing by spline functions." Numer. Math. 10 (1967), 177–183.

バージョン履歴

R2006a より前に導入