Main Content

ベクトル値関数

Curve Fitting Toolbox™ は、"ベクトル値" スプラインをサポートしています。たとえば、スプライン "曲線" に与えられた平面上の点 (x(i),y(i)),i=1,...,n を通過させる場合は、次のコードで一部のデータを定義してから、このようなスプライン曲線を作成し、プロットします。コード長パラメーター化と、節点なしの端点条件を用いた 3 次スプライン内挿を使用します。

x = [19 43 62 88 114 120 130 129 113 76 135 182 232 298 ...
    348 386 420 456 471 485 463 444 414 348 275 192 106 ...
    30 48 83 107 110 109 92 66 45 23 22 30 40 55 55 52 34 20 16];
y = [306 272 240 215 218 237 275 310 368 424 425 427 428 ...
    397 353 302 259 200 148 105 77 47 28 17 10 12 23 41 43 ...
    77 96 133 155 164 157 148 142 162 181 187 192 202 217 245 266 303];

xy = [x;y];
df = diff(xy,1,2); 
t = cumsum([0,sqrt([1 1]*(df.*df))]); 
cv = csapi(t,xy);
fnplt(cv)
hold on
plot(x,y,"o")
hold off

その後、この曲線で囲まれる領域を把握する場合は、積分 y(t)dx(t)=y(t)Dx(t)dt を、パラメーター値 t に対応する曲線上の点 (x(t),y(t)) で評価します。作成された cv 内のスプライン曲線の場合、これを 1 つの (やや複雑な) コマンドで正確に実行できます。

area = diff(fnval(fnint( ...
    fncmb(fncmb(cv,[0 1]),"*",fnder(fncmb(cv,[1 0])))), ...
    fnbrk(cv,"interval")));

説明すると、y = fncmb(cv,[0 1])cv 内の曲線の 2 番目の成分を選択し、Dx = fnder(fncmb(cv,[1 0])) が 1 番目の成分の微分を提供して、yDx = fncmb(y,"*",Dx) が点単位の積を構成します。その後、IyDx = fnint(yDx)yDx の不定積分を作成し、最後に、diff(fnval(IyDx,fnbrk(cv,"interval"))) がその不定積分を基本区間の端点で評価してから、1 番目と 2 番目の値の差を取得することで、基本区間における yDx の定積分を取得します。パラメーターの増加に伴って曲線の点が移動する際に、囲まれた領域が右側と左側のどちらになるかによって、結果の数値が正または負になります。

さらに、作成された cv 内のスプライン曲線上に点 (X,Y) がある、すべての値 Y (存在する場合) を次の (やや複雑な) コマンドで取得できます。

X = 250; % Define a value of X
Y = fnval(fncmb(cv,[0 1]), ...
    mean(fnzeros(fncmb(fncmb(cv,[1 0]),"-",X))))
Y = 1×2

  423.4902    9.4812

説明: x = fncmb(cv,[1 0])cv 内の曲線の 1 番目の成分を選択します。xmX = fncmb(x,"-",X)X によって成分を変換します。t = mean(fnzeros(xmX))xmX が 0 である (つまり、曲線の 1 番目の成分が X に等しい) すべてのパラメーター値を提供します。y = fncmb(cv,[0,1])cv 内の曲線の 2 番目の成分を選択します。最後に、Y = fnval(y,t) がその 2 番目の成分を、cv 内の曲線の 1 番目の成分が X に等しいパラメーター サイトで評価します。

ベクトル値関数を使用する別の例を挙げます。標準的な方法で、等価な 1 次の系を数値的に解く場合と同様に、平面内の指定された力場における粒子の運動方程式を解き、離散時間 tj=t(j),j=1:n で、位置 (x(tj),y(tj))、および 4 ベクトル z(:,j) に格納された速度 (x˙(tj),y˙(tj)) を取得したものとします。その後、3 次エルミート内挿を使用する次のステートメント fnplt(spapi(augknt(t,4,2),t,reshape(z,2,2*n))) が、粒子のパスのプロットを生成します。