Main Content

チェビシェフ スプラインの作成

この節では、チェビシェフ スプラインの作成の次の点について説明します。

チェビシェフ スプラインとは

節点シーケンス t=(ti: i=1:n+k) の場合の、次数 k の "チェビシェフ" スプライン C=Ct=Ck,t は、最大ノルム 1 の Sk,t の固有の要素で、区間 [tk..tn+1] で最大限変動し、tn+1 に近い正数です。つまり、C(τi)=(–1)n – 1 (すべての i について) によって与えられる関数 C=Ct∊Sk,t が [tk.tn+1] で最大ノルム 1 をもつように、厳密に増加する固有の n シーケンス τ が存在します。これは、τ1=tkn=tn+1、および ti < τi < tk+i (すべての i について) を意味しています。事実、ti+1 ≤ τi ≤ ti+k–1 (すべての i について) です。これにより、このような不等式が節点シーケンスにより可能になると想定される、つまり、Sk,t の要素が連続していると想定されるという論点が生まれます。

要するに、チェビシェフ スプライン C は、チェビシェフ多項式のように見えます。同様の機能を実行します。たとえば、その極端なサイト τ は、結果の射影子のノルムがほぼ最小限であるため、Sk,t から内挿するのに特に適したサイトです。ツールボックス コマンド chbpnt を参照してください。

チェビシェフ スプラインの作成を実行して、特定の節点シーケンス t の C を作成できます。

スプライン空間の選択

3 次スプラインを取り上げます。つまり、次数は以下のとおりです。

k = 4;

以下のブレーク シーケンスを使用します。

breaks = [0 1 1.1 3 5 5.5 7 7.1 7.2 8];
lp1 = length(breaks); 

簡易な内部節点を使用します。つまり、以下の節点シーケンスを使用します。

t = breaks([ones(1,k) 2:(lp1-1) lp1(:,ones(1,k))]);
n = length(t)-k;

各端点の四倍の節点に注意してください。k = 4 のため、これは、[0..8] = [breaks(1)..breaks(lp1)] を対象の区間 [tk..tn+1] にします。n = length(t)-k は結果のスプライン空間 Sk,t の次元です。以下の場合にも、同じ節点シーケンスが提供されます。

t=augknt(breaks,k);

初期推定

τ の初期推定として、節点平均を使用します。

ti=(ti+1+...+ti+k1)/(k1)

これは、適切な内挿サイト選択として推奨されています。これらは、以下によって提供されます。

tau=aveknt(t,k); 

結果として得られた C への最初の近似、つまり、c(τi)=(–1)n-–i (すべての i について) を満たすスプライン c をプロットします。

b = cumprod(repmat(-1,1,n)); b = b*b(end);
c = spapi(t,tau,b); 
fnplt(c,'-.') 
grid

以下のプロットが得られます。

チェビシェフ スプラインへの最初の近似

The plot shows a curve with large oscillations. The oscillations are more frequent on the left side of the plot.

Remez 反復

この近似から始めて、Remez アルゴリズムを使用して C に収束する一連のスプラインを生成できます。つまり、C への現在の近似 c の極値として新しい τ を作成し、再度試行します。ここでは、ループ全体です。

Dc のゼロ、つまり、c の 1 階微分として新しい内部 τi を求めます。最初に微分します

Dc = fnder(c);

関数 fnzeros を使用して、Dc のゼロをとります。このゼロは、現在の近似 c の極値を表します。この結果が tau の新しい推定となります。

tau(2:n-1) = mean(fnzeros(Dc));

その後、現在の近似の極値を確認します。

extremes = abs(fnval(c, tau));

差分

max(extremes)-min(extremes)
  ans = 0.6906

は、全体の平準化からいかに離れているかの推定です。

新しく選択した tau に対応する新しいスプラインを作成し、それを以前のスプラインの上にプロットします。

c = spapi(t,tau,b); 
sites = sort([tau (0:100)*(t(n+1)-t(k))/100]); 
values = fnval(c,sites); 
hold on, plot(sites,values)

以下のコードは、グリッドをオンにし、極値の位置をプロットします。

grid on
plot(tau(2:end-1),zeros(size(tau(2:end-1))),'o');
hold off
lgd = legend( 'Initial Guess', 'Current Guess', 'Extreme Locations',...
 'location', 'NorthEastOutside' );
lgd.Location = 'south';

以下は結果の Figure です (凡例は示されていません)。

ほぼ平準化されたスプライン

The plot shows a sequence of yellow dots, a blue curve, and a red curve. The curves follow each other closely in most regions and have with large oscillations. The blue curve's oscillations are more extreme than the red curve's in several regions. The plot contains a legend indicating that the blue curve corresponds to the initial guess, the red curve corresponds to the current guess, and the yellow does correspond to extreme locations.

これが十分に近接していない場合は、単にループを繰り返します。この例では、次の反復が既にグラフィックスの精度に対する C を生成しています。