ラベル fractal の投稿を表示しています。 すべての投稿を表示
ラベル fractal の投稿を表示しています。 すべての投稿を表示

2014年6月9日月曜日

フラクタル 第4回

フラクタルシリーズの4回めです。

今回も、マンデルブロのアレンジを作ってみました。
ただ、毎回関数を別に作るのは無駄なので、P乗で一般化してみました。
つまり、

z(n+1) = z(n)**p + c
z(0)=0

とした時のcと最終のzの値を出力します。


import numpy as np

def makeMandelbrotP( itrn, p=2, n=100, xrange=None, yrange=None ):
if xrange == None:
xrange = (-2.5, 2.5)
if yrange == None:
yrange = (-2.5, 2.5)
r = np.random.uniform( xrange[0], xrange[1], n) + 1j*np.random.uniform( yrange[0], yrange[1],n)

c = r.copy()
z = 0
for i in range(itrn):
z = z**p + c
return c, z

今回はp=4として4乗にした時、このzの値が発散しているかどうかを複素平面上に表示しました。


予想通り、120度の回転対称です。
前回の3乗で180度対称だったので、p乗で306/(p-1) 度の回転対称になるものと想像できます。
この図は16回の繰り返しです。


繰り返し回数については、8回ぐらいでだいたいフラクタルっぽくなります。


繰り返し2回

繰り返し3回

繰り返し4回

繰り返し5回

繰り返し6回

繰り返し7回
繰り返し8回
という感じです。
一枚あたりのデータ量が多く、リスト内表記を使うとメモリアロケーションのエラーになるので、
仕方なくforループを使いました。
通常書類作成用に使っているPC(Core2Quad 2.4GHz)で、上の画像作成時間は一枚あたり6分位かかりました。






2014年5月29日木曜日

フラクタル 第3回


今度は前回のマンデルブロ集合の変則的な形として、試してみたものです。


今回は

z(n+1) = z(n)^3 + c

という漸化式による収束性について複素平面の図を作ってみました。

できたのは下のような左右対称な図です。


各c(複素数)の点で、zの発散しなかった領域が黒い部分です。緑部分は発散領域です。
この場合もフラクタルのような図形になりました。
図の中央が原点で、左右対称な図形となりました。
範囲は実数軸、虚数軸ともに-1.5から1.5までです。

データ点は約14M 個生成して作成しました。
漸化式の繰り返し回数は10回です。

今回はpythonからデータを生成して、MySQLを使ってデータを管理しましたが、30分程度かかりました。
今回の計算結果はWEBを検索しても簡単に見つからなかったので、ちょっとした課題としていいかもしれません。



作った関数はこんなかんじです。

def makeMandelbrot3( itrn, n=100, xrange=None, yrange=None ):
if xrange == None:
xrange = (-2.5, 2.5)
if yrange == None:
yrange = (-2.5, 2.5)
c = np.random.uniform( xrange[0], xrange[1], n) + 1j*np.random.uniform( yrange[0], yrange[1],n)

z = 0
for i in range(itrn):
z = z**3 + c
return c, z


itrnは繰り返し回数で、データ数はnです。
戻り値はcとzなので、
この関数を使用するときは

c, z = makeMandelbrot3( 10, 1000 )

のようにします。
これで繰り返し10回のデータcとzが1000点分生成されます。
メモリ確保の問題さえなければ、nの値を大きくすればその分データが生成されます。



2014年5月14日水曜日

フラクタル 第2回

以前、マンデルブロ集合の図を作成しました。
今回pythonはあまり関係ないです。


マンデルブロ集合の画像を線分データのベクター画像(svg)として変換しました。
PDF


そのベクターデータを元に彫刻してみました。

工作関連は別なブログに載せてありますので、詳しくはそちらを見て下さい。