Mais conteúdo relacionado
Semelhante a Rでマンデルブロ集合 (15)
Mais de Yoshiteru Kamiyama (7)
Rでマンデルブロ集合
- 1. 1.0
0.5
Rでマンデルブロ集合
Im(d)
0.0
-0.5
-1.0
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0
step: 0.03 n = 2
@manozo
Tokyo.R#20 LT1 at Nifty
28.JAN.2012
- 3. でなんとかならないものか?
と考えた
• マンデルブロ集合って何という⽅へ
– これwikipediaマンデルブロ集合
•マンデルブロ集合はどこだと思いますか?
3
- 4. 偶然 plot(1+1i) ができること
を
知
1.4
複素平⾯(ガウス平⾯) る
Y
1.2
軸
が
Im(1 + (0+1i))
これ
1.0
虚
部
0.8
0.6
0.6 0.8 1.0 1.2 1.4
Re(1 + (0+1i)) X軸が実部 4
- 5. 「もしかしたら出来るかも」と
思
っ
漸化式
た
Zk+1=Zk 2+C
Z0=0
複素数Cにおいて発散するか否か?
発散しないCがマンデルブロ集合
5
- 7. 準備(特別なpackage使わないで)
• 材料
– outer(): 複素数のリスト作成
– complex(real=1,imag=1) #‐>1+1i
• Mod(): 絶対値 2を超えると発散してしまうらしい
– 無限のチェックはいらない(is.infinite())
– setdiff(): 集合演算(差)
– plot(): 複素数もplotで
7
- 8. 複素数の 絶対値とは
a<‐c()
step=0.05
a<‐outer(seq(‐2,2,step),seq(‐2,2,step),
function(x,y)complex(r=x,i=y)) 原点からの距離
d <‐ c()
for(c in a){
2
if(Mod(c) < 2) #⿊いところが絶対値が2未満
1
d<‐c(d,c)
Im(d)
0
}
-1
plot(d,pch=19,asp=1)
-2
-3 -2 -1 0 1 2 3
Re(d)
8
- 9. スクリプト1(複素数のリストを⽤意)
forの⼆重ループを使わずに outer(1:9,1:9,"*")
step=0.1 で九九
outer(1:9,1:9)でもOK!
g<‐outer(seq(‐2,1,step),
seq(‐1,1,step),
function(x,y)complex(r=x,i=y))
1.0
dim(g) #‐> 31 21
0.5
length(g) #‐> 651
Im(a)
0.0
plot(g)
-0.5
⼀粒⼀粒発散するか確認
-1.0
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 9
Re(a)
- 12. mandelbrot()として 定義する
• mandelbrot<‐function(step=0.1){...}
#stepのデフォを0.1に
– ステップ1,2,3を囲むだけ
• おまけはありますが
12
- 13. やっぱり カラフル じゃないと...
mandelbrot<‐function(step=0.1,n=2){
g<‐outer(seq(‐2,1,step),seq(‐1,1,step),function(x,y)complex(r=x,i=y))
g<<‐g[Mod(g)<=2] #絶対値2以下のものだけにする
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
m<‐c()#マンデルブロ集合でないもの(絶対値が2より⼤きいものを⼊れる)
mc<‐c()#発散するまでの回数を⼊れる
発散した回を
for(c in g){
z<‐0 #初期値
for(i in 1:100){
z <‐ z^n + c カウントして⾊づけ
if(Mod(z) > 2){
m <‐c(m,c);mc<‐c(mc,i);break}}}
#‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#回数で⾊分け
plot(m,pch=pch,xlab=paste("step:",step,"n = ",n),
xlim=c(‐2,1),ylim=c(‐1,1),col = colors()[mc*30])
m<<‐m #永続化(関数の外でも使えるように)
mc<<‐mc
print(length(m))
} length(colors())#‐>657⾊
13
- 14. 1.0
0.5
デモ mandelbrot(0.03)
Im(d)
0.0
-0.5
-1.0
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0
step: 0.03 n = 2 14
- 15. ちょっとかわいいマンデルブロ集合ですが
い
か
> mandelbrot(0.03) が
で
n し
Z k +1 = Z k + C ょ
う
おまけ(nを変えてみる) か
> mandelbrot(0.03,11) ?
Rらしくいろいろ遊べます 15
- 17. 1.0
1.0
1.0
1.0
1.0
0.5
0.5
0.5
0.5
0.5
Im(d)
Im(d)
Im(d)
Im(d)
Im(d)
0.0
0.0
0.0
0.0
0.0
-0.5
-0.5
-0.5
-0.5
-0.5
-1.0
-1.0
-1.0
-1.0
-1.0
-2.0 n=1
-1.0 0.0 1.0 -2.0 n=2
-1.0 0.0 1.0 -2.0 n=3
-1.0 0.0 1.0 -2.0 n=4
-1.0 0.0 1.0 -2.0 n=5
-1.0 0.0 1.0
step: 0.1 n = 1 step: 0.1 n = 2 step: 0.1 n = 3 step: 0.1 n = 4 step: 0.1 n = 5
1.0
1.0
1.0
1.0
1.0
0.5
0.5
0.5
0.5
0.5
Im(d)
Im(d)
Im(d)
Im(d)
Im(d)
0.0
0.0
0.0
0.0
0.0
-0.5
-0.5
-0.5
-0.5
-0.5
-1.0
-1.0
-1.0
-1.0
-1.0
-2.0 n=6
-1.0 0.0 1.0 -2.0 n=7
-1.0 0.0 1.0 -2.0 n=8
-1.0 0.0 1.0 -2.0 n=9
-1.0 0.0 1.0 -2.0 n=10
-1.0 0.0 1.0
step: 0.1 n = 6 step: 0.1 n = 7 step: 0.1 n = 8 step: 0.1 n = 9 step: 0.1 n = 10
17
- 18. 円の⼤きさは回数のlog たとえば2
mct<‐table(mc)
plot(mct,col=colors()[30*as.integer(names(mct))])
1.0
1500
発散するまで
0.5
の回数分布
1000
table(mc)
Im(m)
0.0
500
-0.5
-1.0
0
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1 7 15 24 33 42 51 60 69 81 90 99
Re(m) mc 18
- 19. たとえば3
plot3d()もおもしろい
• 複素数をそのまま渡してもOK!
– 3D表⽰
> library(rgl)
> plot3d(m,mc,col=mc)
19
- 20. ?complex でヘルプをみると
...
更に、複素数値に対する初等的な三⾓関数、
対数関数、指数関数が使える。
– http://www.is.titech.ac.jp/~mase/mase/h
tml.jp/temp/complex.jp.html
とある。
もちろん複素数に対する四則も
20
- 21. 1.0
1.0
0.5
0.5
0.0
0.0
-0.5
-0.5
-1.0
-1.0
逆数
-1 0 1 2 3 -1.5 -1.0 -0.5 0.0 0.5 1.0 -0.5 0.0 0.5 1.0 1.5
逆数 3 sin()
sin() cos()
cos()
2
2
1
1
0
0
-1
-1
-2
-2
-3
10 tan()
5 0 5 10 log()
05 00 05 00 05 exp() 10 15 20 25
21
- 22. まとめ
• Rでマンデルブロ集合が何となく理解できる
ようになるはず
• zoom in しなくても楽しい
• ⾊々と試してみて下さい
– ジュリア集合(Z0を0以外、Cを固定)デモします
– 解像度を上げる
– (⾊|n)を変える
– アニメーション(gifアニメーションなど)
22
- 23. 参 考
• マンデルブロ集合の不思議な世界
– マンデルブロ集合の作り⽅
– あじさん
• マンデルブロ集合のjavaアプレットあり
• wikipedia マンデルブロ集合
• マンデルブロー集合ー2次関数の複素⼒学系⼊⾨
– 川平 友規(名古屋⼤学⼤学院多元数理科学研究科)
– 平成24年1⽉10⽇
23
- 24. 謝謝
2
1
Im(setdiff(a, d))
0
-1
-2
-2 -1 0 1 2
Re(setdiff(a, d))
24
- 26. 2
ジュリア集合で遊ぶ
1
Im(d)
0
-1
-2
-2 -1 0 1 2
step: 0.1 ri = -0.4-1.1i
• ソースは次
> par(bg=1)#バックを⿊に
> julia(step=0.1, n=2, col=30)
• パラパラジュリア
> for(i in 1:100)julia()
• サイケジュリア
2
1
> for(i in 1:100)
Im(d)
0
-1
+ julia(col=sample(1:100,1))
-2
-2 -1 0 1 2
step: 0.1 ri = 0.9+1.5i
26
- 27. julia<‐function(step=0.1,pch=19,col=30,n=2){
a<‐outer(seq(‐2,2,step),seq(‐2,2,step),
function(x,y)complex(r=x,i=y))
a<<‐a[Mod(a) <= 2]
ri<‐sample(a,1)#Zの初期値をランダムに選ぶ
d<‐c()
dc<‐c()
for(z in a){
c<‐ ri
zz<‐z
for(i in 1:100){
zz <‐ zz^n + c
if(Mod(zz) >= 2){
d <‐c(d,z)
dc<‐c(dc,i) #何回⽬で発散したか
break
}
}
}
#発散した回数で⾊分け
plot(d,pch=pch,xlab=paste("step:",step,"ri = ",ri),xlim=c(‐2,2),ylim=c(‐2,2),
col=colors()[dc+col])
d<<‐d
dc<<‐dc
} 27
- 28. ジュリアサイコロ
> par(bg=1,mfrow=c(2,3))
> for(i in 1:6)julia(n=i)
2
2
2
1
1
1
Im(d)
Im(d)
Im(d)
0
0
0
-1
-1
-1
-2
-2
-2
-2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2
step: 0.1 ri = 0.4-1.3i step: 0.1 ri = -0.1-1.6i step: 0.1 ri = -1.2+0.5i
2
2
2
1
1
1
Im(d)
Im(d)
Im(d)
0
0
0
-1
-1
-1
-2
-2
-2
-2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2
step: 0.1 ri = -1.6+2i step: 0.1 ri = 0+1.2i step: 0.1 ri = 0.1+1.3i
28
- 29. マンデルブロ マスク
mandelbrot(0.03)#解像度(マシンに合わせて)
library(rgl)
rgl.bg(col=1)#バックは⿊
plot3d(‐1i/tan(m),mc,col=heat.colors(100)[dc])
#無限ループで回す(⼿ぶらで)ESCでストップ。
i<‐0;while(1)rgl.viewpoint(i<‐i+1)
29