R 言語 - マンデルブロ集合!

Updated:


統計解析向けのプログラミング言語 R で「マンデルブロ集合」を図形化してみました。

詳しいことは述べません。「こんなこともできるんだ」程度にとどめています。

0. 前提条件Permalink

  • Linux Mint 14 での作業を想定。
  • 統計解析向けのプログラミング言語 R 導入済み。(Ver. 3.0.1 を想定)
  • 今回は、2次元グラフと3次元グラフを描画する。

1. マンデルブロ集合についてPermalink

マンデルブロ集合とは、以下の条件を満たす複素数 c 全体が作る集合で表される複素平面上の点の集合のことである。

漸化式 {zn+1=z2n+c (nN)z0=0

で定義される複素数列{znnN}が、 n で無限大に発散しない。

また、zn を点 (xn,yn) に、c を点 (a,b) にそれぞれ置き代えて、以下のように変形することもできる。

{xn+1=x2ny2n+a (nN)yn+1=2xnyn+b (nN)

2. R ライブラリインストールPermalink

今回はグラフ描画に ggplot2(2次元)、lattice(3次元)ライブラリを使用するので、未インストールならインストールしておく。

> install.packages("ggplot2")

3. R ソース作成Permalink

以下のように R ソースを作成する。

【2次元】

File: mandelbrot_01.R

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(ggplot2)

g <- function(x0, y0) {
  x <- 0
  y <- 0
  for (i in 1:20) {
    xtemp <- x ^ 2 - y ^ 2 + x0
    y <- 2 * x * y + y0
    x <- xtemp
  }
  exp(-(x^2+y^2))
}
m <- 600
X <- seq(-1.8, 0.6, length.out=m)
Y <- seq(-1.2, 1.2, length.out=m)
grid   <- expand.grid(x=X, y=Y)
grid$z <- g(grid$x, grid$y)

ggplot(grid[grid$z != 0, ], aes(x=x, y=y, fill=z)) + geom_tile()

【3次元】

File: mandelbrot_02.R

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(lattice)

g <- function(x0, y0) {
  x <- 0
  y <- 0
  for (i in 1:20) {
    xtemp <- x ^ 2 - y ^ 2 + x0
    y <- 2 * x * y + y0
    x <- xtemp
  }
  exp(-(x^2+y^2))
}
m <- 600
X <- seq(-1.8, 0.6, length.out=m)
Y <- seq(-1.2, 1.2, length.out=m)
grid   <- expand.grid(x=X, y=Y)
grid$z <- g(grid$x, grid$y)

wireframe(z ~ x*y, grid, shade=TRUE)

4. R ソース実行Permalink

以下のようにして R ソースを実行してみる。

File: 【2次元】

1
$ R --vanilla --slave < mandelbrot_01.R

File: 【3次元】

1
$ R --vanilla --slave < mandelbrot_02.R

5. 確認Permalink

R ソースと同じディレクトリに PDF ファイルが作成されるので確認してみる。(ファイル名は2つとも同じなので上書き注意!)

R_MANDELBROT_01 R_MANDELBROT_02


以上。





 

Sponsored Link

 

Comments