『3 次元データ点の空間曲線』


この Tips では、CurveFitting[Spline] を使用しての3次元データ点からの空間曲線や、CurveFitting[LeastSquares] を空間近似曲線をグラフ化する方法を紹介します。

>    restart;

3 次元データ点の空間曲線

任意の 3 次元データ点の作成。

>    randomize():
data1 := [seq(evalf([rand()/10^12,rand()/10^12,rand()/10^12]),i=1..5)];

data1 := [[.6497881271, .8756357348, .7343922514], [.8623730415, .8196959965, .7995812440], [.5718532378e-1, .1788838309, .7460972759], [.7520719953, .1283870869, .1994233996], [.9937647185, .250978332...
data1 := [[.6497881271, .8756357348, .7343922514], [.8623730415, .8196959965, .7995812440], [.5718532378e-1, .1788838309, .7460972759], [.7520719953, .1283870869, .1994233996], [.9937647185, .250978332...

ListTools パッケージの Transpose を使用し、作成したデータの転置を行います。

つまりデータは、[ [ x , x , x , x ・・・・ ] , [ y , y , y , y ・・・・ ] , [ z , z , z , z ・・・・ ] ] と配置されます。

>    data2 := ListTools[Transpose](data1);

data2 := [[.6497881271, .8623730415, .5718532378e-1, .7520719953, .9937647185], [.8756357348, .8196959965, .1788838309, .1283870869, .2509783328e-1], [.7343922514, .7995812440, .7460972759, .1994233996...
data2 := [[.6497881271, .8623730415, .5718532378e-1, .7520719953, .9937647185], [.8756357348, .8196959965, .1788838309, .1283870869, .2509783328e-1], [.7343922514, .7995812440, .7460972759, .1994233996...

スプラインによるデータ点を結ぶ空間曲線

スプライン曲線を求めるためにデータのスケーリングを行います。

>    dd := seq( ListTools[Transpose]([[$1..nops(data1)]/nops(data1),data2[i]]) , i=1..nops(data2));

dd := [[1/5, .6497881271], [2/5, .8623730415], [3/5, .5718532378e-1], [4/5, .7520719953], [1, .9937647185]], [[1/5, .8756357348], [2/5, .8196959965], [3/5, .1788838309], [4/5, .1283870869], [1, .250978...
dd := [[1/5, .6497881271], [2/5, .8623730415], [3/5, .5718532378e-1], [4/5, .7520719953], [1, .9937647185]], [[1/5, .8756357348], [2/5, .8196959965], [3/5, .1788838309], [4/5, .1283870869], [1, .250978...
dd := [[1/5, .6497881271], [2/5, .8623730415], [3/5, .5718532378e-1], [4/5, .7520719953], [1, .9937647185]], [[1/5, .8756357348], [2/5, .8196959965], [3/5, .1788838309], [4/5, .1283870869], [1, .250978...

CurveFitting パッケージを呼び出し、Spline を使用し3次のスプライン曲線を求めます。

>    with(CurveFitting):

>    A0 := Spline(dd[1], v);

A0 := PIECEWISE([.493446237e-1+3.00221751700000006*v-48.4823236000000010*(v-1/5)^3, v < 2/5],[1.988637568-2.81566131800000008*v-29.0893941733928578*(v-2/5)^2+115.190039100000008*(v-2/5)^3, v < 3/5],[.4...

>    A1 := Spline(dd[2], v);

A1 := PIECEWISE([.7318051051+.719153148500000006*v-24.9712959999999988*(v-1/5)^3, v < 2/5],[1.730656945-2.27740237099999998*v-14.9827775973214284*(v-2/5)^2+51.7474265700000018*(v-2/5)^3, v < 3/5],[1.41...

>    A2 := Spline(dd[3], v);

A2 := PIECEWISE([.6894880128+.224521193099999988*v+2.53559424700000013*(v-1/5)^3, v < 2/5],[.5880642431+.528792502199999958*v+1.52135654785714292*(v-2/5)^2-27.5120913199999998*(v-2/5)^3, v < 3/5],[2.04...

座標点でのプロットを作成(pointplot3d)や、グラフの重ね描き(display)を行う為に、

plots パッケージを呼び出します。

>    with(plots):

Warning, the name changecoords has been redefined

3次元データのデータ点でのグラフの作成します。

>    gpoint := pointplot3d(data1, symbol=BOX, symbolsize=20, axes=BOXED, labels=[x,y,z]):

空間内のスプライン曲線のグラフを作成します。

>    gline0 := plot3d([A0,A1,A2], v=0..1, y=0..10, numpoints=4000):

グラフの重ね描きを行います。

>    display(seq(display(gpoint, gline0, orientation=[i*10,45]), i=0..36), insequence=true, projection=0.85);

[Maple Plot]

最小二乗法によるデータ点の近似曲線

最小2乗法を用い、 x , y , z それぞれの近似曲線の3次関数を求めます。

>    funcs :=
[seq(
  LeastSquares(
    ListTools[Transpose]([[$1..nops(data1)]/nops(data1),data2[i]]),
    v, curve=a0+a1*v+a2*v^2+a3*v^3
  ),
  i=1..nops(data2)
)];

funcs := [.4784758464-7.80318959474764817*v^2+5.88102795624871532*v^3+2.50132358719873915*v, .6261518210-9.09146918692548488*v^2+5.54249914249831477*v^3+2.97389171071263060*v, -.5237430386-19.608696839...
funcs := [.4784758464-7.80318959474764817*v^2+5.88102795624871532*v^3+2.50132358719873915*v, .6261518210-9.09146918692548488*v^2+5.54249914249831477*v^3+2.97389171071263060*v, -.5237430386-19.608696839...
funcs := [.4784758464-7.80318959474764817*v^2+5.88102795624871532*v^3+2.50132358719873915*v, .6261518210-9.09146918692548488*v^2+5.54249914249831477*v^3+2.97389171071263060*v, -.5237430386-19.608696839...

近似曲線のグラフを作成します。

>    gline1 := plot3d(funcs, v=0..1, y=0..10, numpoints=400):

元の3次元データ点とグラフの重ね描きを行います。

>    display(seq(display(gpoint, gline1, orientation=[i*10,45]), i=0..36), insequence=true, projection=0.85);

[Maple Plot]

近似曲線のデータ点を求めます。

>    data3 := [seq(subs(v=i/5,funcs),i=1..5)];

data3 := [[.7136612036, .9016113888, .708520996], [.6068807356, .7157933801, .903066264], [.440423782, .334737756, .590869746], [.496579688, .24484471e-1, .302908416], [1.057637794, .51073487e-1, .5701...
data3 := [[.7136612036, .9016113888, .708520996], [.6068807356, .7157933801, .903066264], [.440423782, .334737756, .590869746], [.496579688, .24484471e-1, .302908416], [1.057637794, .51073487e-1, .5701...

>   

閉じる