O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
1.0        0.5                                                                         Rでマンデルブロ集合Im(d)        0.0        -...
なんで今さらマンデルブロ集合?• マンデルブロ博⼠の「禁断の市場」  を読んだから                 クオンツ⼤仏様の                   ご推薦本• お断り – 「マンデルブロ集合」についてはwikipediaな...
でなんとかならないものか?             と考えた• マンデルブロ集合って何という⽅へ  – これwikipediaマンデルブロ集合   •マンデルブロ集合はどこだと思いますか?                          3
偶然 plot(1+1i) ができること                                                              を                       知               ...
「もしかしたら出来るかも」と             思             っ漸化式             たZk+1=Zk   2+CZ0=0複素数Cにおいて発散するか否か?発散しないCがマンデルブロ集合               ...
⼿順• 複素数のリスト(ベクトル)を⽤意• マンデルブロ集合に含まないものをリストアップ  – ネガフィルムのように• plot()  – 以上なるべくRっぽく                           6
準備(特別なpackage使わないで)• 材料 – outer(): 複素数のリスト作成 – complex(real=1,imag=1) #‐>1+1i   • Mod(): 絶対値 2を超えると発散してしまうらしい       – 無限のチ...
複素数の            絶対値とはa<‐c()step=0.05a<‐outer(seq(‐2,2,step),seq(‐2,2,step),          function(x,y)complex(r=x,i=y))   原点から...
スクリプト1(複素数のリストを⽤意)forの⼆重ループを使わずに                              outer(1:9,1:9,"*")step=0.1                                  ...
スクリプト2(マンデルブロ集合に含まれるか否か)• zの絶対値が2を超えるものをリストアップm <‐c() #ここへリストアップfor(c in g){  z<‐0 #初期値は0とする(⼀般的なマンデルブロ集合)    for(i in 1:1...
スクリプト3(plotする)• mm<‐setdiff(g,m) #集合演算(差をとる)• plot(mm)                                                                    ...
mandelbrot()として         定義する• mandelbrot<‐function(step=0.1){...}   #stepのデフォを0.1に  – ステップ1,2,3を囲むだけ    • おまけはありますが       ...
やっぱり               カラフル じゃないと...              mandelbrot<‐function(step=0.1,n=2){g<‐outer(seq(‐2,1,step),seq(‐1,1,step),fu...
1.0        0.5                      デモ mandelbrot(0.03)Im(d)        0.0        -0.5        -1.0               -2.0     -1....
ちょっとかわいいマンデルブロ集合ですが                       い                       か> mandelbrot(0.03)     が                       で       ...
たとえばpar(mfrow=c(2,5))#画⾯を2×5=10for(i in 1:10)#nを1〜10に  mandelbrot(0.1,i)                              16
1.0                                                                                                    1.0                ...
円の⼤きさは回数のlog                                                               たとえば2                                          ...
たとえば3           plot3d()もおもしろい• 複素数をそのまま渡してもOK!  – 3D表⽰> library(rgl)> plot3d(m,mc,col=mc)                            19
?complex でヘルプをみると   ...更に、複素数値に対する初等的な三⾓関数、  対数関数、指数関数が使える。 – http://www.is.titech.ac.jp/~mase/mase/h   tml.jp/temp/comple...
1.0                                                                                           1.0                         ...
まとめ• Rでマンデルブロ集合が何となく理解できる  ようになるはず• zoom in しなくても楽しい• ⾊々と試してみて下さい – ジュリア集合(Z0を0以外、Cを固定)デモします – 解像度を上げる – (⾊|n)を変える – アニメーシ...
参 考• マンデルブロ集合の不思議な世界 – マンデルブロ集合の作り⽅ – あじさん  • マンデルブロ集合のjavaアプレットあり• wikipedia マンデルブロ集合• マンデルブロー集合ー2次関数の複素⼒学系⼊⾨ – 川平 友規(名古屋...
謝謝                    2                    1Im(setdiff(a, d))                    0                    -1                  ...
Gallery          25
2                                                           ジュリア集合で遊ぶ        1Im(d)        0        -1        -2          ...
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))...
ジュリアサイコロ> par(bg=1,mfrow=c(2,3))> for(i in 1:6)julia(n=i)                          2                                      ...
マンデルブロ            マスクmandelbrot(0.03)#解像度(マシンに合わせて)library(rgl)rgl.bg(col=1)#バックは⿊plot3d(‐1i/tan(m),mc,col=heat.colors(100...
以上 デモしました• ジュリアサイコロはお初。                     30
Próximos SlideShares
Carregando em…5
×

Rでマンデルブロ集合

  • Seja o primeiro a comentar

Rでマンデルブロ集合

  1. 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. 2. なんで今さらマンデルブロ集合?• マンデルブロ博⼠の「禁断の市場」 を読んだから クオンツ⼤仏様の ご推薦本• お断り – 「マンデルブロ集合」についてはwikipediaな どを⾒るか「禁断の市場」を読んでください。 – 数学は数ⅡB?まで(⽂系) • 複素数は⾼校時代にうっすらやった記憶あり 2
  3. 3. でなんとかならないものか? と考えた• マンデルブロ集合って何という⽅へ – これwikipediaマンデルブロ集合 •マンデルブロ集合はどこだと思いますか? 3
  4. 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. 5. 「もしかしたら出来るかも」と 思 っ漸化式 たZk+1=Zk 2+CZ0=0複素数Cにおいて発散するか否か?発散しないCがマンデルブロ集合 5
  6. 6. ⼿順• 複素数のリスト(ベクトル)を⽤意• マンデルブロ集合に含まないものをリストアップ – ネガフィルムのように• plot() – 以上なるべくRっぽく 6
  7. 7. 準備(特別なpackage使わないで)• 材料 – outer(): 複素数のリスト作成 – complex(real=1,imag=1) #‐>1+1i • Mod(): 絶対値 2を超えると発散してしまうらしい – 無限のチェックはいらない(is.infinite()) – setdiff(): 集合演算(差) – plot(): 複素数もplotで 7
  8. 8. 複素数の 絶対値とはa<‐c()step=0.05a<‐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} -1plot(d,pch=19,asp=1) -2 -3 -2 -1 0 1 2 3 Re(d) 8
  9. 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.0dim(g) #‐> 31 21 0.5length(g) #‐> 651 Im(a) 0.0plot(g) -0.5⼀粒⼀粒発散するか確認 -1.0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 9 Re(a)
  10. 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. 11. スクリプト3(plotする)• mm<‐setdiff(g,m) #集合演算(差をとる)• plot(mm) 1.0おぼろげながら 0.5⾒えてきた Im(g) 0.0 -0.5 1.0 0.5Im(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. 12. mandelbrot()として 定義する• mandelbrot<‐function(step=0.1){...}  #stepのデフォを0.1に – ステップ1,2,3を囲むだけ • おまけはありますが 12
  13. 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<<‐mcprint(length(m))} length(colors())#‐>657⾊ 13
  14. 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. 15. ちょっとかわいいマンデルブロ集合ですが い か> mandelbrot(0.03) が で n し Z k +1 = Z k + C ょ うおまけ(nを変えてみる) か> mandelbrot(0.03,11) ? Rらしくいろいろ遊べます 15
  16. 16. たとえばpar(mfrow=c(2,5))#画⾯を2×5=10for(i in 1:10)#nを1〜10に mandelbrot(0.1,i) 16
  17. 17. 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5Im(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.5Im(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. 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. 19. たとえば3 plot3d()もおもしろい• 複素数をそのまま渡してもOK! – 3D表⽰> library(rgl)> plot3d(m,mc,col=mc) 19
  20. 20. ?complex でヘルプをみると  ...更に、複素数値に対する初等的な三⾓関数、 対数関数、指数関数が使える。 – http://www.is.titech.ac.jp/~mase/mase/h tml.jp/temp/complex.jp.html とある。 もちろん複素数に対する四則も 20
  21. 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 -310 tan() 5 0 5 10 log() 05 00 05 00 05 exp() 10 15 20 25 21
  22. 22. まとめ• Rでマンデルブロ集合が何となく理解できる ようになるはず• zoom in しなくても楽しい• ⾊々と試してみて下さい – ジュリア集合(Z0を0以外、Cを固定)デモします – 解像度を上げる – (⾊|n)を変える – アニメーション(gifアニメーションなど) 22
  23. 23. 参 考• マンデルブロ集合の不思議な世界 – マンデルブロ集合の作り⽅ – あじさん • マンデルブロ集合のjavaアプレットあり• wikipedia マンデルブロ集合• マンデルブロー集合ー2次関数の複素⼒学系⼊⾨ – 川平 友規(名古屋⼤学⼤学院多元数理科学研究科) – 平成24年1⽉10⽇ 23
  24. 24. 謝謝 2 1Im(setdiff(a, d)) 0 -1 -2 -2 -1 0 1 2 Re(setdiff(a, d)) 24
  25. 25. Gallery 25
  26. 26. 2 ジュリア集合で遊ぶ 1Im(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. 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<<‐ddc<<‐dc} 27
  28. 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. 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. 以上 デモしました• ジュリアサイコロはお初。 30

×