\chapter{すこし発展した話題}

\section{コッホ曲線とツリー}

\baselineskip=1.98zh

応用される数学の最前線として「フラクタル図形」が話題になったことがあります。その拡大図を作っても自分自身と一致するという自己相似な性質を持った図形のことです。海岸の入り江、山の稜線、肺胞の形などを良くまねることができると言われています。口上はこれくらいにして、実際に Logo で作ってみましょう。\verb+ Tree_1 :t +は高さ $t$ の木をかきます。これはあまりに単純ですが、\verb+forward :x +の部分を、\verb+ :x +に対応した木をかくことにするとどうなるでしょう\footnote{それぞれを言い表すのにイニシエータとジェネレータという言葉があります。}。実は、自分に自分自身を含むので、どんどん小さな小枝までかこうとして無限に作業を続けていこうとして、一番左の部分をかこうとする途中で容量が足りなくなってストップしてしまいます。適当なところで見切りをつけて、イニシエータで代用するようにしたのが、\verb+Tree :t :limit +です。長さがこの2番目の引数以下であれば線分で代用します。

\newpage

{%\small

\begin{verbatim}

to Tree_1 :t

   forward :t / 2

   left 60

   forward :t / 2

   back :t / 2

   right 120

   forward :t / 2

   back :t / 2

   left 60

   forward :t / 2

end

 

to Tree :t :limit

   if :t <= :limit [ forward :t stop ]

   forward :t / 2

   left 60

   Tree ( :t / 2 ) :limit

   back :t / 2

   right 120

   Tree ( :t / 2 ) :limit

   back :t / 2

   left 60

   Tree ( :t / 2 ) :limit

end

\end{verbatim}

}%--------end of \small

 

次はコッホ曲線。正六角形をイニシエータとすると雪の結晶に似てくると言われています。

 

\begin{figure}

\begin{center}

\bmpfile(10cm,2.17cm){koch.BMP}

\caption{深さの違うコッホ曲線を次々に}

\end{center}

\end{figure}

 

{%\small

\begin{verbatim}

to Koch :t :limit

   if :t < :limit [ forward :t stop ]

   Koch :t / 3 :limit

   left 60

   Koch :t / 3 :limit

   right 120

   Koch :t / 3 :limit

   left 60

   Koch :t / 3 :limit

end

\end{verbatim}

 

}%-----end of \small

\vfill

さて、このような\verb+ :limit +の値によって図形がどのように変るか亀に分担させて書いてみましょう。

\vfill

{%\small

\begin{verbatim}

to Set

   tell [ 0 1 2 3 4 5 ]

   cg penup

   showturtle

   each

     [ setpos ( list ( who * 100 - 300 ) -150 )

       pendown

       tree 100  ( 100 / ( 2 ^ who  ) )

     ]

   hideturtle

end

\end{verbatim}

}%--------end of \small

\vfill

\begin{figure}

\begin{center}

\bmpfile(10cm,2.33cm){tree.BMP}

\caption{フラクタルな図形:ツリー}

\end{center}

\end{figure}

\vfill

\verb+tell リスト +でリストに記されている出席番号の亀全部に命令が出せるようになります。\verb+who +は命令を聞いている亀の出席番号を出力にする関数です。\verb+each リスト +でリストとしてあらわされた命令を順次それぞれの亀が実行していきます。

\newpage

 

\section{ポアンソの図形}

%\baselineskip=1.98zh

Stanley Gudder,1976 A Mathematical Journey”/和田秀之訳,1980『教養%\newpage

%\noindent

%\baselineskip=1.98zh

のための数学の旅 I』(啓学出版)pp.111-115 に「ポアンソの図形」が出ています。手短に言うと、正 $\dfrac{m}{n}$ 角形のことです。すでに正多角形のかき方については{\bf 3.2 }で触れています。これの頂点の数を有理数に拡張したものです。正 $k$ 角形は

外角 $360°/ k$ となるように隣り合う二辺が頂点で連結しています。この外角の計算、有理数の計算を {\bf 4.5.1 } で考えているのですから使いたいですよね。そのページから Windows のコピー機能を使って書き込んでもいいのですが、そうするとプログラムが長くなります。あまりプログラムの当初の目的とは離れる部分が長いと読みにくいものです。そこで、\verb+gettools +を使って他のページに記述されている定義を読み込みます。ちょうどC言語などのライブラリのようなものです。その定義を見るには該当するページを開く必要がありますから、機能を充分連想できるような名を付けておきましょう。

%\newpage

\vfil

{%\small

\begin{verbatim}

to Polygon :n :Size

   gettools "Yuuri

   repeat ( Bunsi :n )

     [ forward :Size

       right ( times 360 ( inv :n ) )

     ]

end

\end{verbatim}

}%---------end of \small

\vfil

本当は、元の位置に戻るまで繰り返させたいのですが、内部で行なわれている三角関数などの桁落ち誤差によって元に戻っても止ってくれないのです。

\begin{center}

\verb+Polygon [ 9 / 3] 80 +

\end{center}

などとすると一辺の長さが三角形を3回なぞってかきます。

 

\section{複素写像}

複素数は、2つの実数の組~$ x,y $~であらわされた数 $x+y$i ですから、それに対応した座標平面上の点$(x,y)$であらわすことができます。i$^2=-1$ となることを

%\newpage \noindent

除けば整式と同様な計算をします。この複素数に関する変換を複素数平面上の図形によってあらわしてみましょう。青が赤に変換されます。図形は、[$x$座標 $y$座標 (必要があれば\verb+ pu/pd + \footnote{それぞれ {\rm penup,pendown の省略形。}} ]を並べてあらわすことにします。

 

{%\small

\begin{verbatim}

to Fukuso

   local [Car Grid]

   tell all

   hideturtle

   tell [ 1 2 ]

   print "準備の計算に時間が掛かります。

   make "Car  Car

   make "Grid Grid

   cleartext

   print "やっと準備完了!

   DrawF  [F1 :Pos]

   DrawF  [F2 :Pos]

end

to DrawF :F

   DrawFig :Car   :F

   DrawFig :Grid  :F

end

to DrawFig :Fig :F

   cg

   penup

   each

    [ setc who

      Walk :Fig :F

    ]

end

to Walk :Fig :F

   local "Dummy

   if ( count :Fig )= 0

      [ print "なにかキーを押して下さい

        make "Dummy readchar

        cleartext

        stop

      ]

   ToPoint first :Fig

   Walk ( butfirst :Fig ) :F

end

to ToPoint :Point

   local [ x y ]

   make "x first :Point

   make "Point butfirst :Point

   make "y first :Point

   setpos GetPos ( list :x :y )

   run butfirst :Point

end

to GetPos :Pos

   if ( who > 1 ) [ make "Pos run :F ]

   output ( list ( first :Pos ) * 15 ( last :Pos ) * 15 )

end

to Car

   output

    [ [0 2 pd ] [ -2 0 ] [ -4 0 ] [ -4 -2 ]

     [-2.5 -2 ] [ -2 -3 ] [ -1 -3 ] [-0.5 -2 ]

     [ 2 -2 ] [ 2.5 -3 ] [ 3.5 -3 ] [ 4 -2 ]

     [5 -2] [5 0] [4 2] [0 2 pu]

    ]

end

to Grid

   local [ L k j ]

   make "L []

   make "k -5

   repeat 11

    [ make "L lput ( list :k (-5)  "pd ) :L

      make "j -4.8

      repeat 50

        [ make "L lput ( list :k :j ) :L

          make "j :j + 0.2

        ]

      make "L lput ( list :k 5  "pu ) :L

      make "k :k + 1

    ]

   make "k -5

   repeat 11

    [ make "L lput ( list (-5) :k "pd ) :L

      make "j -4.8

      repeat 50

        [ make "L lput ( list :j :k ) :L

          make "j :j + 0.2

        ]

      make "L lput ( list 5 :k "pu ) :L

      make "k :k + 1

    ]

   output :L

end

---V--- F1 1 + i を掛ける変換です。---V---

to F1 :Pos

  local [x y]

  make "x first :Pos

  make "y last  :Pos

  output ( list ( :x - :y ) ( :x + :y )

end

---V--- F2 f2( Z ) = ( Z + 2 )^2 / 10 ---V---

to F2 :Pos

   local [x y]

   make "x first :Pos

   make "y last  :Pos

   output ( list ( ( :x + 2 ) * ( :x + 2 ) - :y * :y ) / 10

                  2 * ( :x + 2 ) * :y / 10   )

end

\end{verbatim}

}%-------- end of \small

 

\section{ロジスティック曲線からカオスまで}

『現代数学ワンダーランド』\footnote{Ivars Peterson,1988The Mathematical Tourist/奥田 晃(訳),1990(新曜社)pp.224-233}によると、漸化式 $ x_{n+1} = 3.57 x_n ( 1 - x_n ) $ に従う数列は、初期値 $ x_0 $ の取りかたによって、どこに収束するかが様々にかわるそうです。既に \verb+ Shusoku +として調べるための用具を作ってますね。このような初期値によって収束の具合がどのようになるを研究した話題としては、ジュリア集合\footnote{例えば、『現代数学ワンダーランド』 p.236 参照}があります。漸化式 $ z_{n+1}=z_n^2+c $ が、$ n \rightarrow \infty $のときに収束する初期値を青、発散する初期値を赤などと色分けをするのです。この $ z_n, c  $ が複素数値をとることとして複素平面を色分けすると値によって様々なそして奇妙な図形があらわれます。$c = 0 $のときは、半径1の円になりますね。プログラムの動作試験に使えそうです。では、どのような定数 $ c $ を選べば収束したり発散したりするか。それをまた色分けしたのが、マンデルブロー集合です。この形は何と自己相似の性質を持っていることが知られています。つまり、フラクタル図形なのです。さて、この意外な結びつきを亀にジュリア集合を描かせることで味わってみましょう。

 

亀の50歩(引数\verb+ :Scale +で指定)を座標平面の1とみます。ある点をあらわすのに、その点を中心とする一辺が $2s$ の正方形に色を塗りましょう。発散するかどうかを無限に計算することはできませんから、50回(引数\verb+ :kk +で指定)計算するまでに画面の2倍(引数\verb+ :w +で指定)以上先まで亀が遠ざかるかどうかで判定します

 

\noindent

{\bf [課題]}上に指定の一例をかきましたが、これではかなり遅くなるはずです。いろいろな値で試してみてどのようにすると実用的か考えてみて下さい。

 

 

{%\small

\begin{verbatim}

 

-----------------------

注釈は、C [/*   */] の形で記します。

to C :List

end

 

  c:f(z)=z^2+c なる定数

  w:発散したとは、画面の w 倍以上彼方へ飛んだとき。

 kk:収束するとは、kk回繰り返しても発散しないとき。

 s:画面の精度は2*s

 Scale:画面上の Scale が1に当たります。

        

to Julia :c :w :kk :s :Scale

   local "Dummy

   penup  seth 0

   PaintC [ 0 0 ]

end

to WhatColor :k :Posi

  local "co

  if InScreen :Posi [ 160 120 ]

    [  SetPosInt :Posi

       if colorunder < 6

         [ output colorunder ]

       if colorunder = 6

         [ output 2 ]

            C [/* 赤:収束を意味します。*/]

    ]

  if ( not InScreen  :Posi ( list ( 160 * :w ) ( 120 * :w ) ) )

    [  output  1 ]

            C [/* 青:発散を意味します。*/]  

  if :k > :kk [ output 2 ]

            C [/* 赤 */]       

  if InScreen :Posi [ 200 150 ]

    [ SquarePaint 6 :Posi ]

            C [/* 6:計算中を示す色。*/]

  make "co ( WhatColor  :k + 1  NextP :Posi )

  if InScreen :Posi [ 200 150 ]

    [ SquarePaint :co :Posi ]

  output :co 

end

to PaintC :Posi

  local "co

  if InScreen :Posi [ 120 120 ]

    [ make "co WhatColor 0 :Posi

      SquarePaint :co :Posi

      recycle

      PaintC ( NearP :Posi )

    ]

end

to InScreen :Posi :Screen

   if ( abs first :Posi ) > ( first :Screen ) [ output 0 = 1 ]

   if ( abs last  :Posi ) > ( last  :Screen ) [ output 0 = 1 ]

   output 1 = 1

end

to NextP :Posi

   local [ x y u v ]

   make "x  ( ( first :Posi ) / :Scale )

   make "y  ( ( last  :Posi ) / :Scale )

   make "u ( :x * :x - :y * :y + ( first :c ) )

   make "v ( 2 * :x * :y + ( last :c ) )

   output ( list ( :Scale * :u ) ( :Scale * :v ) )

end

to NearP :Posi

   local [ x y p ]

   tell 1

     hideturtle

     penup

     setpos :Posi

     make "x xcor

     make "y ycor

     if :x + :y > 0

      [ if :y > :x   [ seth 90 ]

        if :y = :x   [ right 90 ]

        if :y < :x   [ seth 180 ]

      ]

     if :x + :y < 0

      [ if :y > :x   [ seth 0 ]

        if :y = :x   [ right 90 ]

        if :y < :x   [ seth 270 ]

      ]

     if :x + :y = 0

      [ if :x <= 0 [ seth 0 ]

        if :x >  0 [ right 90 ]

      ]

     forward :s * 2

     make "p pos

   tell 0

   penup

   output :p

end

to SetPosInt :Posi

   local [ x y ]

   make "x ( int ( first :Posi ) / ( 2 * :s ) + 0.5 ) * 2 * :s

   make "y ( int ( last  :Posi ) / ( 2 * :s ) + 0.5 ) * 2 * :s

   setpos ( list :x :y )

end

to SquarePaint :Color :Posi

   penup

   SetPosInt :Posi

   setc :Color

   seth 0

   forward :s  right 90

   pendown

   repeat 4 [  forward :s right 90 forward :s ]

   penup

   right 90 forward :s

   pendown

   fill

   penup

end

  

----------------------

 

\end{verbatim}

}%------end of \small

 

\begin{figure}

\begin{center}

\bmpfile(10cm,75mm){julia1.BMP}

\caption{一番簡単なジュリア集合:単位円}

\end{center}

\end{figure}

 

ここで\verb+ colorunder +というのは、亀のいる場所の色を色番号で答えさせるもの。また、\verb+ fill +とは亀のいる線で囲まれた領域に色を塗ります。Pc Logo には残念ながらないので使えません。

ところで、計算を書き散らしたメモリーを \verb+ recycle + で掃除を

しても場所の狭さは覆うべくもなく、出力例のように途中で音をあげてしまいます。

でも亀が働き蜂のようにあちこち飛び回る様子をみていると

複素写像の面白さをホノボノ感じることができます。

 

 

 

\newpage \noindent

\begin{itembox}{処理系とサイトの案内}

{\Large \bf リンク集}

{\small

\begin{enumerate}

\item \verb+http://www.cck.dendai.ac.jp/~rio/+ \\

この本の著者のホームページです。

\item \verb+http://www.edu.ipa.go.jp/kyouiku/100/100.html+ \\

本文中にも紹介した100校プロジェクト。

\item \verb+http://hp.vector.co.jp/authors/VA003294/ + \\

ロゴ坊の作者のページですが、ロゴ坊に限らず Logo に関するサイトはここから

のリンクをたどるのが便利です。

\item \verb+http://www.logo.co.jp/ + \\

ロゴジャパン株式会社のサイト。

\item \verb+http://www.terapinlogo.com/ + \\

テラピンロゴ(アメリカ)のサイト。

\item \verb+http://www.monbu.go.jp/ + \\

文部省のホームページ。統計資料なども見られる。

\item \verb+http://acorn.educ.nottingham.ac.uk//SchEd/pages/atm/ + \\

イギリスの数学教育に関する民間団体。

\item \verb+http://www.tarquin-books.demon.co.uk/ + \\

イギリスの手作りが得意な一味違う出版社。

\end{enumerate} }

\vfil

{\Large \bf 処理系の案内}

{\small

ホームページについては上を参照して下さい。

\begin{enumerate}

\item ロゴライター for Win (ロゴジャパン株式会社)\\

日本語化されているので、日本語の処理の安定性は秀逸。

東京都港区虎ノ門1-23-4.

\item Terrapin Logo (Pc Logo) for Windows \\

Ver.2.0b では、データとして日本語のフォントが使えるようになった。

Terrapin Software  : 10 Holworthy Street Cambridge MA 02138 USA

\item ロゴ坊\\

フリーウェアなのが嬉しい。

\end{enumerate}

}%end of small

\end{itembox}