2013年3月11日月曜日

[ドリトル] 包絡線 -アステロイド-

この間は、包絡線で放物線を作ってみたので今度は「アステロイド曲線(星芒形(せいぼうけい))」を描いてみる。

アステロイド

アステロイド(astroid)の語義はギリシア語: aster(星の)+ -oid(ようなもの)であり、星芒形(せいぼうけい)、星形とも呼ばれる。アステロイドは四つの尖点を持つ内サイクロイド(四尖点内擺線)であり、四尖点形 (tetracuspid) の名称も古くから用いられている
- Wikipedia

アステロイド曲線は、X軸Y軸との交点間の距離が等しい直線群によって構成される包絡線になる。
つまり、ある長さの棒を壁に立てかけたときに滑って倒れるときに、その棒が描く包絡線がアステロイド曲線になる。


描いてみる

描いてみよう。
X、Y軸との交点距離を L と置き、X軸との交点を x:0 ≦ x ≦ L とすると、
Y軸との交点は、 √(L2 - x2 になる。

以下の方法で描画する。

  • X軸上、Y軸上に非表示タートルを用意する。
  • X軸上の各々を1ステップずつ移動しながら、両者の間に線を引く。

moveTurtle = Turtle ! create penup hide.
pen = Turtle ! create 1 lineWidth (blue) lineColor.

NUM = 31.
STEP = 10.
LENGTH = (NUM-1)*STEP.

[ | i ; y x|
  x = moveTurtle ! xPosition?.
  y = sqrt( LENGTH*LENGTH - x*x ).  
  pen ! penup (x) 0 moveto pendown 0 (y) moveto.
  moveTurtle ! (STEP) forward.
] ! (NUM) repeat.

pen ! makefigure.
pen ! hide.

アステロイドが包絡線として現れる。
X軸上の点を等速で動かしている関係で、左上が緻密なのにたいして右下側が粗くなってしまう。
上の絵に、さらにY軸上の点を登録で動かした絵を重ねてみる。

moveTurtle = Turtle ! create penup hide.
pen = Turtle ! create 1 lineWidth (blue) lineColor.

NUM = 31.
STEP = 10.
LENGTH = (NUM-1)*STEP.

[ | i ; y x|
  x = moveTurtle ! xPosition?.
  y = sqrt( LENGTH*LENGTH - x*x ).  
  pen ! penup (x) 0 moveto pendown 0 (y) moveto.
  moveTurtle ! (STEP) forward.
] ! (NUM) repeat.
pen ! makefigure.

pen ! (red) lineColor.
moveTurtle ! movetoCenter 90 direction.
[ | i ; y x|
  y = moveTurtle ! yPosition?.
  x = sqrt( LENGTH*LENGTH - y*y ).  
  pen ! penup (x) 0 moveto pendown 0 (y) moveto.
  moveTurtle ! (STEP) forward.
] ! (NUM) repeat.

pen ! makefigure.
pen ! hide.

右下まできれいに描けている。



アステロイド(星芒形)であることを確認する。

現れた包絡線がアステロイド曲線であることを確認しよう。
アステロイド曲線は次の式で与えられるので、 包絡線がこの式になることを確認できればいい。

x2/3 + y2/3 = a2/3

x軸上の座標tをパラメータとして、 ( 0, √(L2 - t2) ), ( t, 0 )
を端点とする直線の方程式を立てると、t に関する4次方程式になってしまい、 放物線の時にやったように判別式による証明はできない。
そこで今回は別の方法をとることにする。

y軸からの角度を θ とすると、両端点は ( 0 , L・cosθ ), (L・sinθ , 0) となる。
動線はθをパラメータとして、

  • y=- x・cosθ / sinθ + L・cosθ = - x・cotθ + L・cosθ
となる。
これをθで偏微分し、偏導関数が0になる条件を求める。
  • ∂y/∂θ=x / sin2θ - L・sinθ = 0
  • x = L・sin3θ
これをもとの動線の式に代入してxを消す。
  • y = -L・cosθ・ sin2θ + L・cosθ
  • y = L・cosθ(1- sin2θ)
  • y = L・cos3θ

x = L sin3θ 、 y = L・cos3θ となったので、
sin2θ + cos2θ = 1
を使ってθを消去すると、
  • x2/3 + y2/3 = L2/3
が得られた。



θ で偏微分した意味

今回は判別式を使う代わりに、パラメータ θ で動線の式を偏微分した。
この意味を少し考えてみる。
θ で偏微分した式はyに関して陽関数になっているので、 xを固定した時に、θ の変動に対して y がどのように動くかを調べていることになる。
包絡線は、「動線がこれ以上あっちに行かない」線なので、 x を固定して θ を動かす(=動線を動かす)と、包絡線のところでy値の変動方向が変わることになる。
つまり、動線がxでちょうど包絡線に触れたときに yの値が局値をとる、すなわち偏導関数が0になる。

確かめてみよう。
x を固定して θ の値に応じた 「 y = - x・cosθ / sinθ + L・cosθ 」の値の変化を見てみる。
L=1 の場合、サイクロイドの真ん中は x=y=√2/4 になり、θ=45°である。
x を√2/4とし、θとyのグラフを描く。

グラフ描画は 関数グラフソフト Grapes 6.83 を使用。Grapes 使ったの初めてだったけどこれはすごい。

グラフをみると、確かに θ=45° のところで y が最大値 √2/4(≒0.35)になっている、すなわち θ による偏導関数が 0 になることがわかる。
数学屋さんではないので、あまり厳密ではなく多分に直観的な理解になっているかもしれないがこんな感じでいいのだと思う。
アステロイドに関しては、ほかにも、

などに解説があった。



完全なアステロイドを描く

ドリトルと関係ない話になってしまったので、最後に完全なアステロイドを描いておく。
さっき描いたアステロイドはアステロイド曲線全体の右上 1/4 なので上下左右方向に拡張する。

moveTurtle = Turtle ! create penup hide.
pen = Turtle ! create 1 lineWidth (blue) lineColor.

NUM = 61.
STEP = 10.
LENGTH = (NUM-1)/2*STEP.

moveTurtle ! (0-LENGTH) 0 moveto 0 direction.
[ | i ; y x|
  x = moveTurtle ! xPosition?.
  y = sqrt( LENGTH*LENGTH - x*x ).  
  pen ! penup (x) 0 moveto pendown 0 (y) moveto.
  pen ! penup (x) 0 moveto pendown 0 (0-y) moveto.
  moveTurtle ! (STEP) forward.
] ! (NUM) repeat.
pen ! makefigure.

pen ! (red) lineColor.
moveTurtle ! 0 (0-LENGTH) moveto 90 direction.
[ | i ; y x|
  y = moveTurtle ! yPosition?.
  x = sqrt( LENGTH*LENGTH - y*y ).  
  pen ! penup (x) 0 moveto pendown 0 (y) moveto.
  pen ! penup (0-x) 0 moveto pendown 0 (y) moveto.
  moveTurtle ! (STEP) forward.
] ! (NUM) repeat.

pen ! makefigure.
pen ! hide.

さっきのプログラムの可動タートルの動く範囲を -LENGTH ~ +LENGTH に拡大し、
動線を書くときに左右(上下)に2本ずつ書くようにすれば4象限分のアステロイド曲線が描ける。



0 件のコメント:

コメントを投稿