Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

この例では、Curve Fitting Toolbox™ のコマンドを使用して、チェビシェフ スプラインを作成する方法を示します。

チェビシェフ (別名、等振動) スプラインの定義

定義上、長さ n+k の任意の節点シーケンス t の場合、C = C_{t,k} は最大ノルム 1 の S_{t,k} の固有の要素で、区間 [t_k .. t_{n+1}] で最大限変動し、t_{n+1} に近い正数です。つまり、長さ n の厳密に増加する一意の tau が存在します。そのため、次で与えられる S_{k,t} の関数 C

C(tau(i)) = (-1)^{n-i},

が、すべての i について [t_k .. t_{n+1}] で最大ノルム 1 をもつようになります。これは、次のことを意味します。

tau(1) = t_k,

tau(n) = t_{n+1},

および

t_i < tau(i) < t_{k+i},

これは、すべての i についてです。実際は、

t_{i+1} <= tau(i) <= t_{i+k-1},

これは、すべての i についてです。これにより、このような不等式が節点シーケンス t により可能になると想定される、つまり S_{k,t} のすべての要素が連続することと同等になるという論点が生まれます。

t = augknt([0 1 1.1 3 5 5.5 7 7.1 7.2 8], 4 );
[tau,C] = chbpnt(t,4);
xx = sort([linspace(0,8,201),tau]);
plot(xx,fnval(C,xx),'LineWidth',2);
hold on
breaks = knt2brk(t); 
bbb = repmat(breaks,3,1);
sss = repmat([1;-1;NaN],1,length(breaks));
plot(bbb(:), sss(:),'r');
hold off
ylim([-2 2]);
title('The Chebyshev Spline for a Particular Knot Sequence');
legend({'Chebyshev Spline' 'Knots'});

要するに、チェビシェフ スプライン C は、チェビシェフ多項式のように見えます。同様の機能を実行します。たとえば、その極値 tau は、結果の射影子のノルムがほぼ最小であるため、S_{k,t} から内挿するのに特に適したサイトです。

hold on
plot(tau,zeros(size(tau)),'k+');
hold off
legend({'Chebyshev Spline' 'Knots' 'Extrema'});

スプライン空間の選択

この例では、任意のスプライン空間の C の作成を試みます。

単純な内部節点をもつ 3 次スプラインを取り上げます。これは次のように指定されます。

k = 4;
breaks = [0 1 1.1 3 5 5.5 7 7.1 7.2 8];
t = augknt(breaks, k)
t = 1×16

         0         0         0         0    1.0000    1.1000    3.0000    5.0000    5.5000    7.0000    7.1000    7.2000    8.0000    8.0000    8.0000    8.0000

そのため、次の次元のスプライン空間を求めます。

n = length(t)-k
n = 12

初期推定

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

tau(i) = (t_{i+1} + ... + t_{i+k-1})/(k-1)

これは、適切な内挿サイト選択として推奨されています。得られた C への最初の近似をプロットします。

tau = aveknt(t,k)
tau = 1×12

         0    0.3333    0.7000    1.7000    3.0333    4.5000    5.8333    6.5333    7.1000    7.4333    7.7333    8.0000

b = (-ones(1,n)).^(n-1:-1:0);
c = spapi(t,tau,b);
plot(breaks([1 end]),[1 1],'k', breaks([1 end]),[-1 -1],'k');
hold on
fnplt(c,'r',1);
hold off
ylim([-2 2]);
title('First Approximation to an Equioscillating Spline');

反復

完全な平準化のために、Remez アルゴリズムを使用します。つまり、C への現在の近似 c の極値として新しい tau を作成し、再度試行します。

極値を求めるには、まず現在の近似 c の微分 Dc を計算します。

Dc = fnder(c);

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

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

         0    0.2765    0.9057    1.7438    3.0779    4.5531    5.5830    6.5841    7.0809    7.3464    7.7889    8.0000

plot(breaks([1 end]),[1 1],'k', breaks([1 end]),[-1 -1],'k');
hold on
fnplt(c,'r',1);
plot(tau(2:n-1),zeros(1,n-2),'x');
hold off
title('First Approximation to an Equioscillating Spline');
ax = gca;
h = ax.Children;
legend(h([2 1]),{'Approximation','Extrema'});
axis([0 8 -2 2]);

最初の反復ステップの終了

tau の新しい推定を使用して、チェビシェフ スプラインについて得られる新しい近似を計算します。

cnew = spapi(t,tau,b);

この新しい近似は等振動スプラインにより近くなります。

plot(breaks([1 end]),[1 1],'k', breaks([1 end]),[-1 -1],'k');
hold on
fnplt(c,'r',1);
fnplt(cnew, 'k', 1);
hold off
ax = gca;
h = ax.Children;
legend(h([2 1]),{'First Approximation' 'Updated Approximation'});
axis([0 8 -2 2]);

これが十分に近くない場合は、この新しい tau から始めて単に再度実行します。この例では、次の反復が既にグラフィックスの精度に対するチェビシェフ スプラインを提供しています。

チェビシェフ・デムコ点の使用

任意のスプライン空間 S_{k,t} のチェビシェフ スプラインおよびその極値は、ツールボックスの chbpnt コマンドのオプション出力として使用できます。これらの極値はスティーブン・デムコにより、適切な内挿サイトとして推奨されているため、チェビシェフ・デムコ サイトと呼ばれています。この節では、その使用法の例を示します。

次の節点シーケンスをもつ 3 次スプラインにより、区間 [0 .. 1] で平方根関数を近似することにした場合、

k = 4;
n = 10;
t = augknt(((0:n)/n).^8,k);

特定のスプライン空間から平方根関数への適した近似は、次によって与えられます。

tau = chbpnt(t,k);
sp = spapi(t,tau,sqrt(tau));

これは、誤差のほぼ等しい振動によって証明されます。

xx = linspace(0,1,301);
plot(xx, fnval(sp,xx)-sqrt(xx));
title({'Error in Interpolant to Square Root','at Chebyshev-Demko Sites.'});