ローレンツ・アトラクターの スクリーンセーバーによる表現

ローレンツ・アト ラクターの
スクリーンセーバーによる表現
理工学部 数理情報学科
T020070 竹原 正朗
指導教員 池田 勉
概要
今回私がスクリーンセーバー作成においてローレンツ・アトラクターを選ん
だことは卒業研究を非常に楽しくさせるものとなった。描かれる軌道もそうだ
が 、解の一意性という同じ点は二度と通らないなど 、不思議な面を数々持って
いる。しかし 、研究を始める以前の私は力学系を毛嫌いしており、力学系関係
の研究をするとは夢にも思っていなかった。私と同じような考えを持っている
理系の学生には是非とも苦手な分野に挑戦することが 、意外な副産物を得られ
ることもあるということを伝えたい。
本研究ではローレンツ・アトラクターを主材として取り上げている。インター
ネット上などではアトラクターを時間経過と共に描いているが 、私はローレン
ツ・アトラクターを即存のものと比べて飛躍的にダ イナミックに表現すること
を目指した。例えば 、近くにある2つの点を初期値とするそれぞれの解は、時
には衝突するかと思うほど 接近し 、時には遠く離れたりするが 、これをレース
サーキットでの疾走に見立てた。この目的を達成するために正六角形と中心の
一点 (正確には中心を頂点とする 6 個の正三角形の頂点) を取る。時間の経過と
共に 7 つの頂点は 3 次元空間を走り回り、6 個の三角形はさまざまにその形を変
化させるのである。徐々に六角形が引き伸ばされたと思うと次の瞬間にはもう
六角形の面影はない。頂点がそれぞれの解曲線を描き、また三角形も多種多様
な形に変化してくれる。
アニメーションを作成する際に、もっとも手を焼いたものが軌道上を走らせ
ることであった。先にアトラクターを必要なだけ書いた後、別の関数を用いて
時間ごとに走らせる。ここまでは順調だったのだが 、問題は視点であった。た
だ上から見ているだけではおもしろくない、逆に、走っているものに視点を近
づけすぎると 3 次元のため気持ちが悪いなどと指摘されることもあった。最終
的に Y 軸方向を無理やり X-Z 平面へ潰したような解曲線を生成した。このこと
で指摘された問題点は解決できただろう。また、アトラクターを描写する際に
は、乱数を用いてパラメータを変えている。このことによって、実行するたび
に別の形のローレンツ・アトラクターを生成することができる。
ローレンツ・アトラクター以外にもストレンジ・アトラクターはたくさんあ
る。レスラー・アトラクター、ダフィン方程式などからもアニメーションを作
成した。
スクリーンセーバー作成には OpenGL を用いている。OpenGL は 3 次元グラ
フィックスに関する機能が充実しているため、本研究のアニメーションはこれ
を使用して描いたものである。
2005年度特別研究
ローレンツ・アトラクターの
スクリーンセーバーによる表現
龍谷大学 理工学部
数理情報学科
T020070 竹原 正朗
指導教員 池田 勉
目次
1
2
3
4
はじめに
1.1 スクリーンセーバーとは . . . . . .
1.2 OpenGL とは . . . . . . . . . . . .
1.3 ローレンツ・アトラクターについて
1.4 本研究について . . . . . . . . . . .
.
.
.
.
.
.
.
.
カオスについて
2.1 カオス現象とは . . . . . . . . . . . . .
2.2 カオスの特徴 . . . . . . . . . . . . . .
2.3 バタフライ効果について . . . . . . . .
2.4 その他のアトラクターについて . . . .
2.4.1 ストレンジ・アトラクター . . .
2.4.2 エノン・アトラクター . . . . .
2.4.3 ティンカーベル・アトラクター
2.4.4 ダフィン方程式 . . . . . . . . .
2.4.5 ジャパニーズ・アトラクター .
2.4.6 レスラー・アトラクター . . . .
2.5 ローレンツ系について . . . . . . . . .
プログラムについて
3.1 プログラムの簡単な流れ
3.2 差分方程式 . . . . . . .
3.3 乱数 . . . . . . . . . . .
3.4 アトラクター生成 . . . .
3.5 走らせる点 . . . . . . .
3.6 視点 . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
5
6
.
.
.
.
.
.
.
.
.
.
.
7
7
7
8
8
8
9
9
10
10
10
12
.
.
.
.
.
.
14
14
14
15
16
19
20
22
おわりに
3
1
1.1
はじめに
スクリーンセーバーとは
あなたは熱心にスクリーンセーバーを見たことがあるだろうか。そもそも
スクリーンセーバーとはデ ィスプレ イの焼き付き現象を防ぐ 為のプログラムの
ことである。ここでいう焼き付きとは、静止画などの同じ画像を長時間表示し
ている場合に、その画像がディスプレ イに残ってしまう現象。また、LCD の場
合は蛍光体カラーフィルタの劣化ではなく、液晶の配列が固定されてしまって、
本来通るべき光の量が変化してしまうのことである。研究を始める以前の私は、
スクリーンセーバーがそのような目的で動いてるなんて考えもしなかった。今
までは自分のパソコンのそれを見るよりも、休憩中や、付けっ放しのパソコン
に映っているものを見る機会が多かった。なにげなく見ている映像に自分の持っ
ているどの感情も反応したことがなかった。4 回生となり、スクリーンセーバー
作成の研究をしている現在では、100 種類以上のそれを見る経験をし 、また、も
のによっては感動することもあった。
今回、スクリーンセーバーを作成するにあたり、センスのある、またはスピー
ド 感のある作品にしたいと考えていた。デ ィスプレ イの焼き付き現象を防ぐた
めだけじゃなく、何種類かのそれが私に感動を与えたようにパソコンを使って
いる人間の気持ちを少しでも動かすことのできるスクリーンセーバーを作成す
ることを課題とした。
1.2
OpenGL とは
OpenGL とはグラフィックス処理のためのプログラミング インターフェース
である。本来自分で 3D 描画ライブラリーを書いた場合、グラフィクスハード
ウェアと使用することは不可能なのだが 、これを利用するとグラフィクスハー
ド ウェアにアクセスするプログラムを書けるようにしてくれる API である。ま
た、API とはアプ リケーションから OS が用意する各種機能を利用するための
仕組みである。3 次元グラフィックスに関する機能が充実しているため今回のス
クリーンセーバー作成に用いることとなった [4]。
4
1.3
ローレンツ・アト ラクターについて
ローレンツ・アトラクターとはマサチューセッツ工科大学の気象学者である
エド ワード ・ノートン・ローレンツ( Edward Norton Lorenz) が 、1960 年に 、
初期変数を色々変えて初歩的なコンピュータシミュレーションによる気象モデ
ルを観察していたところ、気象パターンが初期値のごく僅かな違いにより大き
く発散することに気づいたことが始まりと言われている。計算結果の検証のた
め同一のデータを初期値として複数回のシミュレーションすべきところを二度
目の入力の際に手間を惜しんだ。初期値の僅かな違いは最終的な計算結果に与
える影響もまた小さいだろうと考え、小数のある桁以降の入力を省いたところ、
結果が大きく異なった。これによりコンピュータによる気象の正確な長期予報
が不可能であることが明らかになった。ローレンツは根底にある数学的性質に
ついて探求を続け、結果を「決定論的な非周期の流れ」として 1963 年に気象学
の学会誌に発表した。この論文のなかで、方程式による比較的単純な系が無限
に複雑なパターンに行き着く、と記述している。これがローレンツ・アトラク
ターである。
Lorenz Attractor
’lorenz.data’
Z
60
50
40
30
20
10
0
-10
30
20
10
-20
-15
-10
0
-5
0
X
5
-10
10
15
-20
20
25-30
図 1: ローレンツ・アトラクター
5
Y
1.4
本研究について
1.1 で述べたように、センスを感じる、またはスピード 感のある作品にしたい
と考えていた。だが、スクリーンセーバー作成は決まっている上で、何を題材に
するかひど く悩んでいた。当初の予定ではロープワークや折り紙をするといっ
たアニメーションを作る予定であった。もしこのど ちらかを作ったのであれば
焼け付きを防ぐだけでなく、社会にちょっとだけ貢献できたかもしれない。し
かし 、これらにスピード 感を持たせても意味がなくなる。それらは結び方、折
り方を学ぶことが目的となるからだ。視点が一定でなく、動きのあるもの、例
えばレーシングゲームのような物を作りたかった。そこで、昨年受講した「非
線形解析」で学んだカオスをテーマにして本研究に臨むことにした。
なぜテーマにカオスを選んだかというと、初期条件に敏感に依存するという
特徴に惹かれたからだ。初期条件をランダムで変えるだけで、前回表示したア
トラクターとは別の形のアトラクターにできる点。非常に複雑な非周期的現象
なので視点を周期上を走らせることでスピード 感が多少なりとも生み出せる。
さらに、出来上がった作品は大学で学んだ内容であるため、大学生活最後の課
題としては持って来いだと考えた。なかでもローレンツ・アトラクターを選んだ
理由としては、上記したように、解曲線上を進んでいるように見せたかっただ
けである。ところがこの分野は講義中に学ばなかったため、本に載っている式
を参考にアトラクターを表示してみるところから始まった。以下の式はローレ
ンツが編み出した略式化された有名な連立微分方程式であり、これによりロー
レンツ・アトラクターは生成される。
dx
= −10x + 10y
dt
dy
dt
= 28x − y − xz
dz
dt
= −8/3z + xy
この式を解くには Euler(オイラー) 法、Trapezoidal(台形則) 法,Runge-Kutta(ル
ンゲ・クッタ) 法など いくつかあるが 、今回は差分化方程式を使ってアトラク
ターを生成した。詳しくは第 3 章で説明するので、ここでは省略したいと思う。
今回はローレンツ・アトラクターだけを用いてスクリーンセーバーを作成した
のだが 、カオスの世界はとても芸術的であり、奥深いものなので、第 2 章では
カオスとは何なのか、どのようなものなのかを簡単に説明したいと思う。
6
2
2.1
カオスについて
カオス現象とは
初期値のちょっとした違いが 、結果に大きく影響してしまう。最初の状態で
もって結果をコントロールできなくなってしまうことを言う。これは自然界に
おける食物連鎖に例えると簡単に説明できる。ここではわかりやすいように肉
食動物と草食動物(食べる者と食べられるもの)の 2 種類で説明したいと思う。
一般的に考えると、草食動物が肉食動物に食べ尽くされて絶滅し 、その後肉食
動物も絶滅する。または肉食動物が絶滅して草食動物だけの世界になる、現在
の地球のようにほど よくバランスがとれているのいずれかであろう。しかし 、
実際にある初期値を与えてシミュレーションをスタートさせるとなんとも言え
ない結果が生じるのである。初期値を少し変えるだけで前回のシュミレーショ
ンとはまったく異質なものとなる。また、ある一定の数値以上の初期値に設定
しても、ど ちらも絶滅する等という境界線が引けないのである。数百回、数千
回やっても明快な関係が出てこないのである。
このように、初期条件が結果を大きく左右するものがカオス現象なのだ。
2.2
カオスの特徴
前項でも多少話したことではあるが 、カオスには初期条件に敏感に依存す
るという特徴がある。ローレンツは「カオスとは決定論的でないように見えな
がら、実は決定論的であるふるまい」だと彼の著した本で述べている。決定論
というのは決められたアルゴ リズムに従うと、必ず決まった解にたどり着くと
言う物、次に起こり得ることがただひとつであることをいう。通常、カオスの
アトラクターはローレンツアトラクターのように、8の字を何度も書いたのよ
うな構造を持つことが多く、これは「自己相似性」とか「フラクタル」などと
呼ばれている。また、カオスは周期的ではない,非常に複雑な非周期的現象で
ある。したがって,アトラクター上の軌道も二度と同じところに戻ることはな
いのである [1]。
7
2.3
バタフライ効果について
ほんの少しだけ違う初期状態から出発したふたつの軌道を考える。当然は
じめのうち、ふたつはほとんど 同じ軌道を描くはず。軌道は少しずつ離れだす
けれど 、それでもしばらくは互いに近い軌道にいる。だけど 、やがて、ふたつ
が決定的に分離する瞬間が劇的に訪れる。一方の軌道が片方の羽に留まってい
るにもかかわらず、もう一方の軌道が反対側の羽に飛び移ってしまうのだ。そ
れ以後、ふたつの軌道はまったく違うものになる。初期状態の違いが劇的に拡
大され 、元々初期状態が似ていたという記憶は失われてしまう。これが ”バタ
フライ効果 ”である。このことは制作したプログラムを見てもらえばよりわか
りやすい。
実はバタフライ効果の名前の由来は現在のところ定かではない。一つ目は 、
ローレンツ・アトラクターが蝶の形に似ている事を由来とする説。もうひとつ
は,ローレンツによる 1972 年の講演(ブラジルで蝶が羽ばたくとテキサスで大
竜巻が起こるか?)を由来とする説である。ど ちらにせよ、ローレンツと彼が
発見したアトラクターに関係することは、間違いないのだが、1963 年に書いた
論文にも、1972 年の講演でも ”バタフライ効果 ”という言葉は出てこない。
2.4
その他のアト ラクターについて
そもそもアトラクターとは何かを引きつけたり、吸い寄せたりすることを意
味している。また、違った言い方をするならば 、近くのすべての軌道が収束す
る不変集合である。ここではローレンツ・アトラクター以外のアトラクターに
ついて少し紹介したいと思う。
2.4.1
ストレンジ・アト ラクター
決して同じ軌跡を通らないのに、なにかに引き寄せられるように繰り返し運
動を行うものである。特に、軌跡がフラクタルになっているものは非常に美し
い絵を描く。ローレンツ・アトラクターや、以下のアトラクターはこれに含ま
れており、奇妙な振る舞いをする方程式を総称してストレンジ・アトラクター
と呼んでいる。
8
2.4.2
エノン・アト ラクター
フランスの天文学者であり、数学者でもあるミッチェル・エノンにより探し
出されたこれは、簡単な 2 変数関数で非常に複雑な系の性質を持っている。
dx
= 1 − ax2 + y
dt
dy
dt
= bx (a = 1.4, b = 0.3)
Henon Attractor
1.5
’henon.data’
1
Y
0.5
0
-0.5
-1
-1.5
-1.5
-1
-0.5
0
0.5
1
1.5
X
図 2: エノン・アトラクター
2.4.3
ティンカーベル・アト ラクター
ジェイムスズ・ヨークより研究されたものである。
図3は
dx
= x2 − y 2 + 0.9x − 0.6013y
dt
dy
dt
= 2xy + 2x + 0.5y
で与えられる写像 F に対するアトラクターである。
これはエノン・アトラクターより大きいリャプノフ次元を持っている。
図 3: ティンカーベル・アトラクター [2] より転載
9
2.4.4
ダフィン方程式
ダフィン方程式は電気回路の研究において使われる。第 2 式が運動方程式で,
右辺の第 3 項 Bcos(t) によって,系は強制的に揺さぶられる。
dx
=y
dt
dy
dt
= ky − x3 + Bcosθ
図 4 には、k = −0.01 、B = 10.0 、θ には時間経過と共に
2π
1000
を加えている。
Duffing Attractor
10
’duffing.data’
8
6
4
Y
2
0
-2
-4
-6
-8
-10
-4
-3
-2
-1
0
X
1
2
3
4
図 4: ダフィン・アトラクター
2.4.5
ジャパニーズ・アト ラクター
1961年、京都大学工学部の上田 亮氏が電気回路による非線形常微分方
程式を解析したことによって発生したカオスを物理現象として観測し 、不規則
遷移現象と称したものである。この微分方程式はダフィン方程式のポアンカレ
断面への写像によって図 5 のように生成される。ポアンカレ断面とは連続曲線
を切断する平面のことを言う。
dx
=y
dt
dy
dt
= ky − x3 + Bcosθ
図 5 には k=0.05, B=7.5 を与えている。
2.4.6
レスラー・アト ラクター
オットー・レスラーが 3 つの微分方程式からなる系を、化学反応のモデルと
して組み立てたものである。ローレンツ系は、アトラクターが2つあるが 、レ
スラー系のアトラクターは、1つだけである。
10
Japanese Attractor
6
’japanese.data’
4
2
Y
0
-2
-4
-6
-8
1
1.5
2
2.5
X
3
3.5
4
図 5: ジャパニーズ・アトラクター
微分方程式は
dx
dt
= −y − z
dy
dt
= x + αy
dz
dt
= β + xz − µz
であり、差分方程式に変形するなどして求める。
下の図 6 には α = 0.15 、β = 0.20 、µ = 10.0 を与えている。
Roesler Attractor
’roesler.data’
Z
40
35
30
25
20
15
10
5
0
15
10
5
-15
-10
0
-5
-5
0
X
5
-10
10
15
-15
20-20
図 6: レスラー・アトラクター
11
Y
2.5
ローレンツ系について
ここでは、ローレンツ・アトラクターがど ういう条件下であれば 、2つの羽
を持った形になるかを [2] に従って説明する。
レーリイはレーリイ数と呼ばれている量 Ra が、ある臨界値 Rc = π 4 a−2 (1+a2 )3
を越えるとき対流が発生することを発見した。ここで Ra は、
Ra = gαH 3 (∆T )ν −1 χ−1
Ã
熱膨張率:α, 動粘性率:ν, 熱伝導率:χ
∆T = (底部の温度) − (上部の温度) > 0
!
である。その後、E. ローレンツは、もっと略式化された有名な微分方程式系
dx
= σy − σx
dt
dy
dt
= rx − y − xz
dz
dt
= xy − bz
を編み出した。これをローレンツ系という。変数 t は時間である。しかし 、x,y,z
は空間座標とはまったく関係がない。
x : 対流運動の強さに比例した変数
y : 上昇流と下降流の温度差に比例した変数
z : 鉛直方向の温度変化が 1 次関数からどの程度ずれているかを表す変数
上記の微分方程式系に含まれる定数は各々、
σ=
ν
χ
r=
Ra
Rc
b=
4
1+a2
(プラントル数)
(規格化されたレーリイ数)
(与えられた容器に関係する定数)
であり、プラントル数とは 、対流伝熱において現れる無次元数のことである。
b, σ は正の定数である。また σ > 1 と仮定すると、定数 r は温度差 ∆T に依存す
ることになる。
ローレンツ系は 0 で準線形になる。この証明はすぐできるためここでは省略
する。また r > 1 の時、ローレンツの微分方程式系には 0 以外に 2 つの臨界点
p, q が存在する。それら p, q は
 p
 p


− b(r − 1)
b(r − 1)
 p
 p


q =  − b(r − 1) 
p =  b(r − 1) 
r−1
r−1
で与えられる。さらに、この系は p でも準線形であり、その随伴行列は
12


−σ
σ
0
p


Ap = 
1
−1
− b(r − 1) 
p
p
− b(r − 1) − b(r − 1)
−b
であり、随伴方程式は
λ + (σ + b + 1)λ2 + b(σ + r)λ + 2bσ(r − 1) = 0
3
となる。また、ローレンツ系は z 軸に関して対称である。つまり、




x(t)
−x(t)




X(t) =  y(t)  , Y (t) =  −y(t) 
z(t)
z(t)
とすると、X も Y も解になる。その結果、p, q は共に安定する、不安定になる、
またはど ちらでもないかである。
ここで 、σ> b + 1 と仮定すると 、σ > b + 1 > 1 であるから R > 1 である。
R > r > 1 のとき、上の方程式の 3 つの解はすべて実部が負であるため、p は漸
近的に安定するが 、逆に r > R の時には p は不安定になってしまう。
ローレンツモデルは散逸系であり、もともとの不変測度を持たない。散逸系
とはエネルギーの出入りがある系のことを言う。実際にシュミレーションした
結果、この系ではパラメータ r がある値を越えると、カントール集合のような
複雑な構造を持つ高次元アトラクターが現れ 、アトラクター上の軌道は周期的
の範囲であり、ローレ
でなくなる。アトラクター上の構造は領域 R > σ(σ+b+3)
(σ−b−1)
8
ンツのパラメータ値は σ = 10.0, b = 3 および r = 28.0 となっているため、当然
これは条件を満たしている。この σ = 10.0, b = 83 のとき、r(r > 1) をパラメー
タとするローレンツ系の族を特にローレンツ族という。ローレンツ族は R で分
岐する。
13
3
プログラムについて
ここでは、プログラムの流れと作成したプログラムの説明としたいと思う。
3.1
プログラムの簡単な流れ
作成したプログラムの流れを簡単に説明する。
1. アトラクターを生成するための変数を、ランダムでとる。
2. データ数を global 変数として宣言しておき、そのデータの数だけ差分方程
式を解く。
3. アトラクターを生成。
4. 走らせる点 (六角形) の中心の初期値にアトラクターの初期値を入れる。
5. 別にしていた点の数 (六角形の頂点と中心の7つ) だけ、それぞれの値で差
分方程式を解く。
6. reshape を利用してウィンド ウ全体をビューポートにすることや透視変換行
列の設定、変換行列の初期化などを実行させる。
7. デ ィスプレ イに描写。
8. その後は 5.6.7 をループさせ、ダブルバッファリングさせることでスムーズ
なアニメーションに見える。
3.2
差分方程式
ここでは実数型で差分方程式を解く関数を作るためにローレンツ方程式
dx
= −10x + 10y
dt
dy
dt
= 28x − y − xz
dz
dt
= − 83 z + xy
を、コンピューターで計算できるように次のような差分方程式にする。
Xn+1 = Xn + 10(Yn − Xn )dt
Yn+1 = Yn + (28Xn − Yn − Xn Zn )dt
Zn+1 = Zn + (− 83 Zn + Xn Yn )dt
次に 2 つの一次元配列を準備し 、それぞれ要素数を 3 とする。
一つ目は、Xn+1 , Yn+1 , Zn+1 , もうひとつは Xn , Yn , Zn に対応している。
また dt は時間間隔 (時間変化率) であり、プログラムでは dt の値を 0.005 に設定
している。
14
今回作成したプログラムでは、2.5 章、3.1 章で述べた条件の範囲内で値をラ
ンダムで変え、実行するたびに違うアトラクターを生成できるようにしている。
そのために方程式の定数 10 、38 、28 をそれぞれ外部変数 A 、B 、C と置き、実数
型で確保させている。
Xn+1 = Xn + A(Yn − Xn )dt
Yn+1 = Yn + (CXn − Yn − Xn Zn )dt
Zn+1 = Zn + (−BZn + Xn Yn )dt
ここで出てくる A,B,C の値は次項の 3.3 で説明する。
3.3
乱数
double 型で乱数をとる関数を作成する。
rand 関数を使うため stdlib.h ヘッダファイルを取り込ませておく。今回は毎回
違う seed をとるプログラムにするため、先にそれについての説明をする。
srand 関数は rand 関数で発生させる擬似乱数の発生系列を変更できる。プログ
ラムを実行するたびに異なる系列で擬似乱数を発生させるには、seed に現時刻
を設定することで実現できる。現時刻は time 関数で取得する。暦時刻は多くの
処理系において、グリニッチ標準時の 1970 年 1 月 1 日の 00:00:00 から現在まで
の経過時間を秒単位で扱われている。そのため現在時刻は同じ値が存在するこ
とはないため、time 関数を使用し 、seed に現時刻を設定すればプログラムを実
行するたびに異なる系列で擬似乱数を発生させることができる。この time 関数
の引数に NULL を設定した場合には、戻り値に暦時間を返すことになる。これ
によってプログラムを実行するたびに違うアトラクターを生成できるようにな
る。以上より、
srand((unsigned)time(NULL))
と書き、time 関数を使うため time.h というヘッダファイルを取り込ませておく。
次に A 、B 、C に乱数をいれる。そのため乱数のためのシードを外部変数として
定義しておく。まず A,B は半開区間 [0,10) の範囲で乱数を取るために、下記の
ようにした。
((double)rand()×10)
A = ((double)RAN
D M AX+1.0)
((double)rand()×10)
B = ((double)RAN
D M AX+1.0)
ここで、2.5 章で述べた一つ目の条件である A > B+1 を満たしているか検証さ
せる。while 文を利用し 、条件式を入れる部分に条件とは逆の A≤B+1 を入れ 、
満たしている場合は A に 2 を足すことを繰り返させた。
15
C は半開区間 [0,210) の範囲で乱数を取るために、
((double)rand()×210)
C = ((double)RAN
D M AX+1.0)
とし 、上記と同じ要領で二つ目、三つ目の条件である
C > A(A+B+3)
、C > 1
(A−B−1)
を満たしているか検証させた。
一つ目の条件と同様に、while 文を利用し 、条件式を入れる部分に条件とは逆の
と C≤1 を入れ 、ど ちらかを満たしている場合は C に 1 を足すこ
C ≤ A(A+B+3)
(A−B−1)
とを繰り返させた。
しかし 、この状態では問題がある。例えば A 、B, が条件を満たしているとする。
A の値が 10 、B が限りなく 9 に近い値を返したとすると、C の値はとてつもな
く大きな値をとらなければならないことになる。2.5 章で述べたように、この系
ではパラメータ r(ここでは C) がある値を越えると、カントール集合のような
複雑な構造を持つ高次元アトラクターが現れ 、アトラクター上の軌道は周期的
でなくなる。これは実際に実行した結果からも明らかである。そこで、一つ目
while 文をに A≤B+3 に変え、さらに B の半開区間を [0,7) に、C の半開区間を
[0,100) の範囲で乱数を取るために、
((double)rand()×7)
B = ((double)RAN
D M AX+1.0)
C=
((double)rand()×100)
((double)RAN D M AX+1.0)
と変更し 、二つ目、三つ目の条件下で、C の値が 100 を超えないように作成し
た。
3.4
アト ラクター生成
以下にアトラクターを作成する関数をアルゴ リズムで示す。
<アルゴ リズム アトラクター生成>
マクロ定義 DATA SIZE 5000:アトラクターの長さ
global 変数 Attractor[DATA SIZE][3]:実数型 2 次元配列
global 変数 Attractorcolor[DATA SIZE][3]:実数型 2 次元配列
global 変数 a:実数型
変数 i,j:整数型
配列 v1[3],v2[3]:実数型
(1) 初期設定 v1[0]=1.0,v1[1]=1.0,v1[2]=1.0 とおく。
(2)i=0 と置き、条件 i < DATA SIZE が満たされている間、次の操作を繰り返
す。
(2-1) 差分方程式の関数を呼び出し 、与えられた v1[3] を解かせ、答えを v2[3] に
入れる。
(2-2)Attractor[i][0] に v2[0] + v2[1] をいれる。
(2-3)Attractor[i][1] に (v2[0]−v2[1])
をいれる。
10
(2-4)Attractor[i][2] に v2[3] をいれる。
16
(2-5)a に Attractor[i][0] いれる。
(2-5-1)j=0 と置き、j < 3 が満たされている間、次の操作を繰り返す。
(2-5-2)v1[j] に v2[j] をいれる。
(2-5-3)j に j+1 を入れる。
(2-6)Attractorcolor[i][0] に 1.0 をいれる
(2-7)Attractorcolor[i][1] に 0.5 をいれる
(2-8)Attractorcolor[i][2] に 0.0 をいれる
(2-9)i に i+1 をいれる。
マクロ定義とは、コンパイルする前に処理され 、ある文字列を別の文字列に
置き換えることができるプリプロセッサのことである。今回の場合、コンパイ
ル時にソースプログラム中の DATA SIZE がすべて 5000 に置き換わる。プログ
ラムの修正が必要で、データの数を変更するときに、#define 定義を修正する
だけで対応できるなどの利点がある。
glbal 変数とは , プログラムの中のもっとも外側のブロックで宣言された変数で、
すべてのブロックで有効なものである。プログラム全体に対して定義される変
数であるため、この関数内で配列に与えた数値は、他のどこの関数からでも参
照することができる。
(2-2) 、(2-3) は本来ならば v2[0] 、v2[1] をそのまま入れるべきなのだが 、実行結
果が思わしくなかった為、Y 軸方向の値を小さくし 、X − Z 平面に潰したよう
な形にしている。この関数によって計算したデータを他の関数で呼び出し 、ア
トラクターを表示させる。
3.2 章、3.3 章、3.4 章より図 7 、図 8 のような実行するたびに違うアトラクター
を描くことができる。
17
図 7: ローレンツ・アトラクター (A=7.8,B=4.4,C=49.7)
図 8: ローレンツ・アトラクター (A=10.4,B=6.8,C=81.6)
18
3.5
走らせる点
以下に 3.4 章で生成したアトラクターに沿って走らせる関数をアルゴ リズム
で示す。
<アルゴ リズム 走らせる点>
マクロ定義 BALLS 7:六角形の各頂点と中心
global 変数 ballsp[BALLS 7][3]:実数型 2 次元配列
global 変数 balls[BALLS 7][3]:実数型 2 次元配列
global 変数 b,e:実数型
変数 i,j,k:整数型
配列 v1[3],v2[3]:実数型
(1)i=0 と置き、条件 i < BALLS が満たされている間、次の操作を繰り返す。
(1-1)ballsp[i][0] に balls[i][0] をいれる
(1-2)ballsp[i][1] に balls[i][1] をいれる
(1-3)ballsp[i][2] に balls[i][2] をいれる
+ balls[i][1] × 5.0 をいれる。
(1-4)v1[0] に balls[i][0]
2.0
balls[i][0]
(1-5)v1[1] に 2.0 − balls[i][1] × 5.0 をいれる。
(1-6)v1[2] に balls[i][2] をいれる。
(1-7) 差分方程式の関数を呼び出し 、与えられた v1[3] を解かせ、答えを v2[3] に
入れる。
(1-8)balls[i][0] に v2[0] + v2[1] をいれる。
(1-9)balls[i][1] に (v2[0]−v2[1])
をいれる。
10
(1-10)balls[i][2] に v2[3] をいれる。
(1-11)b に balls[i][0] いれる。
(1-11-1) もし 、i=6 ならば e に ab をいれる。
(1-12)i に i+1 をいれる。
ここは BALLS の数 (六角形の頂点+中心の 7 つ) の差分方程式を解く。balls[7][3]
の初期値には別の関数により、balls[0][3] から balls[5][3] にそれぞれの六角形の
頂点、balls[6][3] にその中心の座標 (アトラクターの初期値) が与えられる。こ
のため中心がアトラクター上を走るように見え、その他の頂点はカオス現象に
よりさまざ まな図形へと変化するのである。この関数はそれぞれの点を一回更
新させると別の関数に行くことと、点が七つあることから 3.4 で使用した値を
参照することができないため、(1-4) から (1-6) のような計算式で表した。(1-8)
から (1-10) は 3.4 章の (2-2) 、(2-3) 同様に視覚的なものである。(1-10-1) の内容
も 3.4 章の (2-5) と同様に終了条件で使用するものである。アトラクターの最後
の値が a であり、b には balls[i][0] の座標が入る。balls[6][0](中心の座標) の時、
e' 1.00000 になれば終了となる。ballsp については次の 3.6 章で説明する。
19
3.6
視点
後方から走っている点を見る関数をアルゴ リズムで示す。
<アルゴ リズム 視点>
global 変数 vall,zoom:整数型
global 変数 vht:実数型
変数 i:整数型
変数 rr:実数型
配列 u1[3],vr[3],ue[3]:実数型
(1) もし 、vall=1 ならば 、(1-1) へ、それ以外は (2) へ。
(1-1)glLoadIdentity() をする。(1-2)
(1-2)gluLookAt(0.0,100.0,30.0, 0.0,0.0,30.0, 0.0,0.0,1.0) をする。(その後、この
関数から出る)
(2)i=0 と置き、条件 i < 3 が満たされている間、次の操作を繰り返す。
(2-1)u1[i] に ballsp[ball num][i] をいれる。
(2-2)ur[i] に balls[ball num][i] - u1[i] をいれる。
(2-3)i に i+1 いれ 、(2) に帰る。
p
(3)rr に ur[0]2 + ur[1]2 + [2]2 をいれる。
(4)i=0 と置き、条件 i < 3 が満たされている間、次の操作を繰り返す。
をいれる。
(4-1)ue[i] に u1[i] - zoom×ur[i]
rr
(4-2)i に i+1 いれ 、(4) に帰る
(5)ue[1] に (zoom×vht) を加える
(6)glLoadIdentity() をする。
(7)gluLookAt(ue[0],ue[1],ue[2], u1[0],u1[1],u1[2], 0.0,1.0,0.0) をする。
vall というのは上方遠方に固定する、もしくは各々注目させるという切り替え
スイッチになっている。glLoadIdentity() は現在の行列を恒等行列に初期化して
いる。gluLookAt(0.0,100.0,30.0, 0.0,0.0,30.0, 0.0,0.0,1.0) はそれぞれ (視点、注目
点、up 方向) を表している。この場合、(0.0,100.0,30.0) の位置から (0.0,0.0,30.0)
を眺める。また、(0.0,0.0,1.0) は「上」の方向を示すベクトルとなっている。glLoadIdentity() も gluLookAt() も OpenGL 関数であり、GL/glut.h をインクルード
させる必要がある。
さきほど 登場した ballsp はここで活用される。u1[3] に ballsp[7][3](balls[7][3] の
差分する前の値) の配列の中身をいれ、ur[3] には ball[7][3]-u1[3] をいれる。この
ことによって視点は常に更新され 、点を後ろから追いかけるようになる。rr は
ベクトルの大きさであり、zoom パラメータ (視点と点の距離) や、vht パラメー
タ (Y 軸方向の視点の高さ) 関係させることで、距離を一定にさせることやパラ
メータを使用できるようになる。この関数があることで見る側が「点」を追う
視点になり、スピード 感を生む結果になったと思っている。
3.5 章、3.6 章より図 9 、図 10 のようなアニメーションにすることができる。
20
図 9: 初期状態
図 10: 差分方程式を 500 回解いた時の位置
21
4
おわりに
今回スクリーンセーバー用として作成したアニメーションはローレンツ・アト
ラクターだけであり、説明した内容もカオスのほんの一部分にしかすぎない。こ
の研究中にレスラー・アトラクターや、ダフィン方程式を使用したプログラムな
ども作成したのだが、どれもアニメーションが満足いくものにはならなかった。
冒頭や文中で述べたように、カオス、またはローレンツ・アトラクターの不
思議さに触れ 、またローレンツ以外のアトラクター、カオスについて少しでも
理解、興味を持って頂ける作品に仕上がったと思う。
私自身も研究前、研究中そして現在へとカオスに対する考え方が変わり、正直
今後はより深くまで掘り下げた研究をしたいと考えている。多少不満足な部分
もあるがこの一年、有意義に研究ができたと思う。
謝辞
論文作成ならびにスクリーンセーバー作成に当たって、なにかと相談に乗っ
て頂いた田端君に感謝致します。
参考文献
[1] E.N.Lorenz 「ローレンツ カオスのエッセンス」 共立出版 1997 年
[2] デニーグーリック 「カオスとの遭遇」 産業図書 1995 年
[3] ラルフ・エイブラハム ウエスケ・ヨシダ「カオスはこうして発見された」
共立出版 2002 年
[4] エド ワード・エンジェル「 Open GL 入門」 ピアソン・エデュケーション
2002 年
[5] 「 スクリーンセーバーで Go! 」
http://ayapin.film.s.dendai.ac.jp/ matuda/TeX/PDF/1st∼3rd.pdf
22