\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,1988“The
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}