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

テンソル積スプラインによる近似

ツールボックスは"ベクトル" 係数と共にスプラインを処理できるため、以降の説明でわかるように、テンソル積スプラインによるグリッド データへの内挿または近似の実装は容易です。また、"二変量テンソル積スプライン" の例を実行できます。

確かに、グリッド データへのテンソル積スプライン近似のほとんどは、この例で説明する詳細を考慮することなく、このツールボックスの样条拟合c类s公司apeなどのスプライン作成コマンドのいずれかを使用して直接取得できます。むしろ、この例はテンソル積作成の背後にある理論を示すための手段であり、このツールボックスの作成コマンドが対応していない状況で役立ちます。

この節では、テンソル積スプラインの問題の次の点について説明します。

サイトと節点の選択

たとえば、与えられたデータ z(i,j)=f(x(i),y(j)),i=1:Nx,j=1:Ny への最小二乗近似を考えてみます。曲面近似のスキーマをテストするためのフランケによって広く使用されている関数からデータを取得します (R. Franke, "A critical comparison of some methods for interpolation of scattered data", Naval Postgraduate School Techn. Rep. NPS-53-79-003, March 1979 を参照)。領域は単位正方形です。y 方向よりも、x 方向で少し多くデータ サイトを選択します。また、より明確に定義するには、境界の近くでデータ密度が高くなるようにします。

x=排序([(0:10)/10,.03.07,.93.97]);y=排序([(0:6)/6,.03.07,.93.97]);[xx,yy]=ndgrid(x,y);z=franke(xx,yy);

是的の関数としての最小二乗近似

これらのデータは、ベクトル値関数、つまり、y(j) における値がベクトル z(:,j) (すべての j について) になる関数 y から得られたデータとして扱います。特に理由はありませんが、この関数を、等間隔の 3 つの内部節点をもつベクトル値放物線スプラインによって近似することを選択してください。つまり、このベクトル値スプラインのスプラインの次数と節点シーケンスを次のように選択します。

ky=3;knotsy=augknt([0,.25,.5,.75,1],ky);

その後、间隔2を使用して、データへの最小二乗近似を提供します。

sp=spap2(节,ky,y,z);

実際には、S公司肯塔基,诺西から各N个十データセットへの離散最小二乗近似を同時に求めていることになります。

( 是的 ( j型 ) , z轴 ( , j型 ) ) j型 = 1个 N个 是的 , = 1个 : N个

特に、ステートメント

yy=-.1.05:1.1;vals=fnval(sp,yy);

は、配列五alsを提供します。この配列のエントリ瓦尔斯(i,j)五als(:,j)が、s公司pでの近似スプライン線のyy(j)における値であるためです

图、图

mesh(x,yy,vals.'), view(150,50)

meshコマンドで瓦尔斯。”®99Z(i,j)を、正(x(j),y(i))におる関数値と見なためです

曲面のように見える一連の滑らかな曲線

(二)有价证券s公司p型スプラインの基本区間外であるためです。

また、リッジにも注意してください。これで、滑らかな曲線が一方向のみでプロットされていることが確認できます。

xの関数としての係数への近似

実際の曲面を得るには、さらに 1 ステップを実行する必要があります。以下は、s公司pのスプラインの係数c类o型e类f型s公司是的です。

系数Y=fnbrk(sp,'coefs');

抽象的に、s公司pのスプラインは関数として考えることができます。

是的 | c类 o型 e类 f型 s公司 是的 ( : , ) , 是的 ( 是的 )

ベクトル係数系数(:,r)の我番目のエントリc类o型e类f型s公司是的(我,右)十(一)千十および同じ適切な節点シーケンス结十のスプラインによる各係数ベクトルc类o型e类f型s公司是的(问,:)の近似を示しています。特に理由はありませんが、今回は等間隔の“4”方位“3”

千十=4; knotsx = augknt([0:.2:1],kx); sp2 = spap2(knotsx,kx,x,coefsy.');

间隔2(结,k,x,f型十) は、外汇(:,j型)が十(j型)におけるデータとなると想定している点に注意してください。つまり、外汇の各"列" が関数値になると想定しています。x(q) (すべての q について) におけるデータc类o型e类f型s公司是的(问,:)を近似するには、c类o型e类f型s公司是的"転置" と共に间隔2を提供します。

二変量近似

ここでは、得られたスプライン"曲線" の係数cxy公司の転置について検討します。

系数=fnbrk(sp2,“系数”);

以下の"二変量" スプライン近似が提供されます。

( , 是的 ) | c类 o型 e类 f型 s公司 ( , ) , ( ) , 是的 ( 是的 )

元のデータは、以下のとおりです。

( ( ) , 是的 ( j型 ) ) | z轴 ( ( ) , 是的 ( j型 ) ) , = 1个 : N个 , j型 = 1个 : N个 是的

このスプライン曲面をグリッド (以下に例を示します) 上にプロットするために

xv=0.025:1;yv=0.025:1;

以下を実行できます。

价值观=s公司pcol(knotsx,kx,xv)*coefs*spcol(knotsy,ky,yv).'; mesh(xv,yv,values.'), view(150,50);

これにより以下の图形が得られます

フランケ関数へのスプライン近似

これは有意義です。なぜなら、s公司pcol(knotsx,kx,xv)(i,q)横切では、次数千十の十五番目の B スプラインの i(xv) における値 B我,问(千十(千n个o型tsx)) に等しいためです。

行列s公司pcol(knotsx,kx,xv)spcol(纽特西,肯塔基州,伊夫)帯状のため、次のように"大きな"十五伊夫の場合にfnval公司を使用すると、効率が向上する場合がありますが、おそらくメモリ消費量が増加します。

值2=。。。fnval(spmak(knotsx,fnval(spmak(knotsy,coefs),yv)。'),十五';

これは実際に、以下のようにfnval公司がテンソル積スプラインによって直接呼び出されたときに、内部で起こっていることです。

五alue2 = fnval(spmak({knotsx,knotsy},coefs),{xv,yv});

以下は、相対誤差の計算です。相対誤差とは、与えられたデータの大きさを基準とする、与えられたデータとそれらデータ サイトでの近似の値との差です。

错误=z-spcol(knotsx,kx,x)*coefs*spcol(knotsy,ky,y)。';disp(max(max(abs(errors)))/max(max(abs(z)))

出力は0.0539分で、おそらくそれほど大きいわけではありません。ただし、係数配列はサイズ8 6のみでした。

丁我s公司p(size(coefs))

サイズ2011年のデータ配列を近似するには、次のようになります。

显示(大小(z))

次数の切り替え

ここで従うアプローチは、次のように"偏っている" ように見えます。まず、与えられたデータz轴12395;よって形される列をxのベクトル値関数𞗀述してるのとして扱ます

逆の順序で考えた場合、つまり、z轴を十のベクトル値関数を記述するものと考え、その後、近似曲線のベクトル係数から構成される行列を y のベクトル値関数を記述するものとして扱うと、何が起こるでしょうか。

驚くかもしれませんが、最終近似は同じ (丸め) になります。ここでは数値実験を行います。

十の関数としての最小二乗近似

12487ータ値になるのはz轴"行" です。それに応じて、z轴.'ではなく、z轴间隔2に提供しなければなりません。

spb=spap2(结x,kx,x,z');

(x;z(:,j))公司

valsb=fnval(spb,xv)。';

は、行列五alsbを提供します。この行列のエントリ五alsb(i, j)meshを使用して五alsbをプロットする場合に明らかです。

mesh(xv,y,valsb.'), view(150,50)

曲面のように見える別の一連の滑らかな曲線

リッジに注意してください。これで、やはり、滑らかな曲線が一方向のみでプロットされていることが確認できます。ただし、今回は、曲線が逆方向に向かっています。

yの関数としての係数への近似

ここで 2 番目のステップで、実際の曲面を取得します。まず、係数を抽出します。

c类o型e类f型s公司十=f型n个brk(spb,'coefs');

その後、同じ次数千是的および適切な同じ節点シーケンス结是的のスプラインによって各係数ベクトルc类o型e类f型s公司十(右,:)を近似します。

spb2系列=spap2(结,ky,y,coefsx’);

ここでも、s公司pbからの係数配列を転置する必要がある点に注意してください。これは、间隔2が最終入力引数の列をデータ値として使用するためです。

それに応じて、得られた"曲線" の係数配列c类o型e类f型s公司bを転置する必要がなくなります。

系数b=fnbrk(spb2,'coefs');

二変量近似

c类o型e类f型s公司bは前出の係数配列c类o型e类f型s公司(丸め) と等しいと主張されています。以下はテストです。

disp(最大值(abs(coefs-coefsb)))

出力は1.4433e-15号です。

説明は簡単です。sp=spap2(节,k,x,y)に含まれるスプラインsの係数c类二、你"線形" に依存します。これは、c类是的が両方とも1行の行列の場合に、一个=一个结,k,xのような行列が存在することを意味します。これにより、

c类 = 是的 一个 , ,

が、任意のデータ是的で成り立ちます。このステートメントは是的“合二为一”、“合二为一”、“合二为一”公司c类はサイズdn个列 (n =长度(节)-k) となります。

特に、ステートメント

sp=spap2(节,ky,y,z);c类o型e类f型s公司是的=f型n个brk(sp,'coefs');

は、次を満たす行列c类o型e类f型s公司是的を提供します。

c类o型e类f型s公司 是的 = z轴 . 一个 诺西,基,伊

後続の計算

s公司p2 = spap2(knotsx,kx,x,coefsy.'); coefs = fnbrk(sp2,'coefs').';

によって係数配列c类o型e类f型s公司が生成されます。この配列は 2 つの転置を考慮して次を満たします。

c类o型e类f型s公司 = ( ( z轴 一个 诺西,基,伊 ) ' . 一个 结x,kx,x ) ' = ( 一个 结x,kx,x ) ' . z轴 . 一个 诺西,基,伊

代替の 2 番目の計算では、最初に次を計算しました。

spb=spap2(结x,kx,x,z');c类o型e类f型s公司十=f型n个brk(spb,'coefs');

そのため、c类o型e类f型s公司十=z'.A结x,kx,xです。後続の計算

spb2系列=spap2(结,ky,y,coefsx’);c类o型e类f型s公司b = fnbrk(spb,'coefs');

によって次が提供されます。

c类o型e类f型s公司b = c类o型e类f型s公司十 . ' . 一个 诺西,基,伊 = ( 一个 结x,kx,x ) . ' . z轴 . 一个 克诺西,肯塔基, 是的

その結果、c类o型e类f型s公司b=c类o型e类f型s公司となります。

比較と拡張

间隔2が呼び出されるたびに転置が実行され、ほかでは実行されないという点で、1 番目のアプローチより対称的です。このアプローチは、任意の数の変数でグリッド データに近似するために使用できます。

たとえば、“三”[纽约州,纽约州,新西兰]の3 次元配列に含まれ、v(i,j,k)が値 f(x(i),y(j),z(k)) を含む場合は、次から開始します。

c类o型e类f型s公司=右e类s公司hape(v,Nx,Ny*Nz);

n个j型=j型-千j型(j)=x、 是,是の場合) と仮定して、次のように進めます。

sp=spap2(knotsx,kx,x,coefs’);coefs=重塑(fnbrk(sp,'coefs'),Ny,Nz*nx);sp=spap2(knotsy,ky,y,coefs’);coefs=重塑(fnbrk(sp,'coefs'),Nz,nx*Ny);sp=spap2(knotsz,kz,z,coefs’);coefs=重塑(fnbrk(sp,'coefs'),nx,Ny*Nz);

詳細については、PGS公司の第17章または[C.de Boor,“张量积的有效计算机操作”s manbetx 845ACM公司Trans.Math.软件5个(1979),173-182;勘误表,建设内容はいずれも、同じ方法で、グリッドデータへの多変量近似プロセスに拡張できます。

これはまさに、グリッド データを近似する際に、スプライン作成コマンドc类s公司apic类s公司ape样条拟合水疗、および间隔2で使用されている方法です。また、テンソル積スプラインがグリッド上で評価されるときに、fnval公司でも使用されます。