spcol
B スプライン選点行列
構文
colmat = spcol(knots,k,tau)
colmat = spcol(knots,k,tau,arg1,arg2,...)
説明
colmat = spcol(knots,k,tau) は、length(tau) 行で length(knots)-k 列の行列を返します。その (i,j) 番目のエントリは次のとおりです。
これは、ノット シーケンス knots に対する次数 k の j 番目の B スプラインの m(i) 次導関数の tau(i) における値です。ここで、tau は一連のサイトです。これは "非減少" で、m = knt2mlt(tau)、つまり m(i) が #{j < i:tau(j) = tau(i)} (すべての i について) であるものとします。
また、colmat = spcol(knots,k,tau,arg1,arg2,...) は、その行列を返しますが、ユーザーがいくつかの側面を指定することができます。
argi のいずれかが、最初の 2 文字が 'slvblk' と同じである文字ベクトルまたは string スカラーの場合、行列は、slvblk によって必要とされる (さらに、bkbrk によって理解される) 概ブロック対角形式 (スプラインに特化した) で返されます。
argi のいずれかが、最初の 2 文字が 'sparse' である同じ文字ベクトルまたは string スカラーの場合、行列は、MATLAB® の sparse 形式で返されます。
argi のいずれかが、最初の 2 文字が 'noderiv' と同じである文字ベクトルまたは string スカラーの場合、多重度は無視されます。つまり、m(i) はすべての i について 1 となります。
例
非標準の 2 次 ODE を近似的に解くとします。
これを、区間 [0..π] で、10 の多項式区分をもつ 3 次スプラインを使用して解きます。次の方法で spcol を使用することができます。
tau = linspace(0,pi,101); k = 4; knots = augknt(linspace(0,pi,11),k); colmat = spcol(knots,k,brk2knt(tau,3)); coefs = (colmat(3:3:end,:)/5-colmat(1:3:end,:))\(-sin(2*tau).'); sp = spmak(knots,coefs.');
残差 D2y(t) – 5· (y(t) – sin(2t)) を計算して、細かいメッシュにプロットすることで、このスプラインが ODE をどの程度満たしているかを確認できます。
t = linspace(0,pi,501);
yt = fnval(sp,t);
D2yt = fnval(fnder(sp,2),t);
plot(t,D2yt - 5*(yt-sin(2*t)))
title(['residual error; to be compared to max(abs(D^2y)) = ',...
num2str(max(abs(D2yt)))])
ステートメント spcol([1:6],3,.1+[2:4]) は、次の行列を提供します。
ans =
0.5900 0.0050 0
0.4050 0.5900 0.0050
0 0.4050 0.5900
この行列の一般的な行は、ノット シーケンス 1:6 に対する次数 3 のすべての B スプラインの 2.1、3.1、または 4.1 で値を記録します。このような B スプラインが 3 つあります。1 番目のものにはノット 1、2、3、4 があり、その値は 1 列目に記録されます。特に、1 列目の最終エントリは 0 になります。これは、このエントリがその B スプラインの 4.1 (最終ノットの右側にあるサイト) における値を提供するためです。
文字ベクトルまたは string スカラー 'sl' を spcol への追加の入力として追加すると、bkbrk を使用して、spcol からの結果の出力で符号化された行列のブロック構造体に関する詳細を抽出できます。したがって、ステートメント bkbrk(spcol(1:6,3,.1+2:4,'sl')) は以下を返します。
block 1 has 2 row(s)
0.5900 0.0050 0
0.4050 0.5900 0.0050
next block is shifted over 1 column(s)
block 2 has 1 row(s)
0.4050 0.5900 0.0050
next block is shifted over 2 column(s)
制限
シーケンスは tau は非減少であると仮定されます。
アルゴリズム
このコマンドはさまざまな次数とブロックの問題に対処しなければならないため、このツールボックスの中で最も複雑なコマンドです。再帰関係は、それらがサポートする tau(i) のいずれかをもつ次数 k のすべての B スプラインの値を同時に生成するために使用されます。
導関数の値が必要な (おそらくわずかな) サイトに関しては個別の計算が実行されます。これらは、m(i) > 0 のサイト tau(i) です。これらと各次数 k – j、j = j0、j0 – 1,...,0 (j0 は max(m) に等しい) について、その次数のすべての B スプラインの値が再帰によって生成され、次数 k のすべての B スプラインのサイトにおける j 次導関数を計算するために使用されます。
得られた B スプライン値の行 (各行は特定の tau(i) に対応する) は組み立てられ、行列 (通常はスパース) 全体となります。
オプション引数 'sl' が存在する場合は、これらの行が組み立てられ、いずれのサイト tau(i) でも非ゼロで次数 k の B スプラインは k 個以下であるという事実を利用する便利な概ブロック対角型となります。この事実は (B スプラインの自然な次数と共に) 選点行列が概ブロック対角である、つまり、高さは異なるが、幅は同じ k である個々のブロックまたはステップをもつ階段型の形状であることを意味しています。
コマンド slvblk は、spap2、spapi、または spaps で使用される場合に使用可能な、このストレージを節約する型を利用するように設計されています。これは、内挿またはその他の近似条件から B 型の区分的多項式関数を決定するために役立ちます。