マンデルブロ集合のお絵かき

  • Rをインストールする(Rさえインストールされればよくて、その他のパッケージは(ひとまず)不要です)
  • 以下のコードをコピーペーストする
# Rに2つのパッケージを追加します
# "fields"と言う名前のパッケージと
# "caTools"という名前のパッケージです
# パッケージを取って来る先を尋ねる画面が現れるはずなので
# 適当に選びます(日本のそれでもよいです。安心なのはUK,USAのサイトですのでそれを選ぶのもよいです)
install.packages(c("fields","caTools"))
# 取って来たパッケージを使えるように、読み込みます
library(fields) # for tim.colors
library(caTools) # for write.gif
# 描図の解像度を決めます
# 領域を m x mの格子にします
m = 500

# 格子上の点に複素数を並べます
# 実部の最小値と最大値を決めます
min.real = -1.8
max.real = 0.6
# 虚部の最小値と最大値を決めます
min.imaginary = -1.2
max.imaginary = 1.2
# 実部用の等間隔数列を作ります
# 最小値から最大値までの等間隔数列を長さmで作る処理です
sequence.real = seq(min.real,max.real, length.out=m)
# 虚部用に同様にします
sequence.imag = seq(min.imaginary,max.imaginary, length.out=m)

# 格子を作るには、実部用数列をm回繰り返します
# 虚部用数列も繰り返します
# 実部は水平方向、虚部は鉛直方向なので
# 繰り返しの並べ方の縦・横を変える必要があります
# 次のように少し作り方を変えることでそれができます
rep.seq.real = rep(sequence.real,each=m)
rep.seq.imag = rep(sequence.imag,m)

# 虚数列を作ります
C = complex( real=rep.seq.real,imag=rep.seq.imag)
# それをmxm行列に納めます
C = matrix(C,m,m)

# マンデルブロ集合の定義に沿って
# 各虚数の漸化式を計算します
Z = 0.1 # z(n+1)=z(n)^2+Cのz
K = 20 # 漸化式の「漸化」回数(gifアニメの枚数)
X = array(0, c(m,m,K))
for (k in 1:K) {
	Z = Z^2+C
	X[,,k] = exp(-abs(Z))
}
# 最後の絵を描きます
image(X[,,1], col=tim.colors(256)) 
image(X[,,5], col=tim.colors(256)) # show final image in R

image(X[,,K], col=tim.colors(256)) # show final image in R

# 連続した絵をスタックしたファイルを作って動画にします

write.gif(X,"Mandelbrot.gif",col=tim.colors(256), delay=100)