2012年7月30日月曜日

[ドリトル] 平方数を求める

前回、円周率を算出してみたので今度は平方数を求めてみよう。
当たり前だが、sqrt 使用禁止。
√2、√3は簡単。
√2 は隣辺長1の直角2等辺三角形の底辺が √2 になる。

SCALE = 100.
t1 = Turtle ! create.
t1 ! 45 leftturn (SCALE) forward 90 rightturn (SCALE) forward.
Label ! ((t1 ! xPosition?) / (SCALE)) create.

次は√3。正三角形の半分、つまり斜辺1、隣辺の一つを 1/2 としたときの残りの斜辺値が√3/2 になるのでそれを使う。

SCALE = 100.
t1 = Turtle ! create.
t1 ! 30 leftturn (SCALE) forward 60 rightturn (SCALE) forward.
Label ! ((t1 ! xPosition?) / (SCALE)) create.

ヒトナミニオゴレヤ。

√5。隣辺長がそれぞれ1と2になる直角三角形の斜辺が√5なのはわかるのだが角度がわからない。
ところで √5 といえば sin(π/10) つまりsin( 18°) は (√5-1)/ 4 なので、18°の直角三角形を描いて、短辺値を4倍して1足せば √5 が取り出せる。

SCALE = 100.
t1 = Turtle ! create.
t1 ! 18 leftturn (SCALE) forward. 
Label ! (((t1 ! yPosition?) / (SCALE) * 4) + 1) create.

2.2369068。
だんだん何をやりたいのかわからなくなってきた。結局タートルを 三角関数 の代わりに使っているだけだ。
でもせっかくなので最後まで行こう。

この後は逆三角関数を使わないと無理そう。
一般的に √n は隣辺が √(n-1) と1の直角三角形の斜辺になるので、再帰的に求められる。

SCALE = 100.
t1 = Turtle ! create hide.

t1:root? = [ | n ; deg | 
  [ n == 1 ] ! then [ 1 ] else [
    n1 = self ! ( n - 1 ) root?.
    deg = atan( 1 / n1 ).
    self ! movetocenter (deg) direction (n1*SCALE) forward.
    self ! 90 rightturn (SCALE) forward.
    (self ! xPosition? ) / (SCALE).
  ] execute.
].

Label ! (t1 ! 10 root?) create.

「 t1 ! 10 root? 」で 3.1622775。√10=3.16227766 なのでこんなものか。
ここまでやるならもう

:root? = [ | n ; deg | 
  [ n == 1 ] ! then [ 1 ] else [
    n1 = self ! ( n - 1 ) root?.
    deg = atan( 1 / n1 ).
    1 / sin (deg).
  ] execute.
].

Label ! ( ! 10 root?) create.

でいい気がする。ついにタートルが関係なくなってしまった。

(逆)三角関数を排除するなら Newton 法で計算する手もあるが、もう何をやっているのかわからなくなりかけているのでこの辺で終わりにしよう。



上の操作で平方根を求めているのは、次のような作図によって平方根を求めている操作に相当する。

SCALE = 50.
t1 = Turtle ! create.
deg = 0.
[ | n |
  t1 ! penup movetocenter (deg) direction pendown.
  t1 ! (SCALE * sqrt(n)) forward 90 leftturn (SCALE) forward.
  deg = deg + atan(1/sqrt(n)).
] ! 15 repeat.  

外側の辺長がつねに1なので放射方向の線長はルート1、ルート2、ルート3、・・・となっている。
外周辺だけにしてもっと描いてみる。

SCALE = 5.
t1 = Turtle ! create.
deg = 0.
[ | n |
  t1 ! penup movetocenter (deg) direction pendown.
  t1 ! penup (SCALE * sqrt(n)) forward pendown.
  t1 ! 90 leftturn (SCALE) forward.
  deg = deg + atan(1/sqrt(n)).
] ! 1000 repeat.  


蚊取り線香になった。

0 件のコメント:

コメントを投稿