Advertisement

More Related Content

Slideshows for you(20)

Advertisement

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
  2. なんで今さらマンデルブロ集合? • マンデルブロ博⼠の「禁断の市場」 を読んだから クオンツ⼤仏様の ご推薦本 • お断り – 「マンデルブロ集合」についてはwikipediaな どを⾒るか「禁断の市場」を読んでください。 – 数学は数ⅡB?まで(⽂系) • 複素数は⾼校時代にうっすらやった記憶あり 2
  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
  6. ⼿順 • 複素数のリスト(ベクトル)を⽤意 • マンデルブロ集合に含まないものをリストアップ – ネガフィルムのように • plot() – 以上なるべくRっぽく 6
  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)
  10. スクリプト2(マンデルブロ集合に含まれるか否か) • zの絶対値が2を超えるものをリストアップ m <‐c() #ここへリストアップ for(c in g){ z<‐0 #初期値は0とする(⼀般的なマンデルブロ集合) for(i in 1:100){#100回を超えて発散しないものをマンデルブロ集合とする z <‐ z^2 + c #漸化式 if(Mod(z) > 2){ #絶対値が2を超えると発散(マンデルブロ集合ではない) m<‐c(m,c) #リストに追加 break     #抜ける } } 絶対値が2を超えるとzは無限遠に⾶んでいく } 10
  11. スクリプト3(plotする) • mm<‐setdiff(g,m) #集合演算(差をとる) • plot(mm) 1.0 おぼろげながら 0.5 ⾒えてきた Im(g) 0.0 -0.5 1.0 0.5 Im(m) 0.0 -1.0 -0.5 -2.0 -1.5 -1.0 -0.5 0.0 Re(g) -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 Re(m) plot(m) この⼀粒⼀粒がマンデルブロ集合 11
  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
  16. たとえば par(mfrow=c(2,5))#画⾯を2×5=10 for(i in 1:10)#nを1〜10に mandelbrot(0.1,i) 16
  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
  25. Gallery 25
  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
  30. 以上 デモしました • ジュリアサイコロはお初。 30
Advertisement