曼德布洛特集合繪制

[toc]

初衷

曼德布洛特集合是在李善友老師的混沌大學(xué)公開(kāi)課上聽(tīng)到的,在極客學(xué)院使用TensorFlow也可以實(shí)現(xiàn)該集合炎咖,將其可視化時(shí)赃泡,于是嘗試模擬該模型。

參考文檔

Numpy乘盼、matplotlib實(shí)現(xiàn)二維數(shù)據(jù)到圖像的轉(zhuǎn)換升熊,添加colormap,無(wú)邊距顯示:https://blog.csdn.net/u010105243/article/details/76695400

極客學(xué)院源碼曼德布洛特集合源碼(較老):http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mandelbrot.html

源碼實(shí)現(xiàn)曼德勃羅集合
"""
本案例來(lái)展示偏微分方程
使用tensorflow來(lái)實(shí)現(xiàn)該模型
"""

import tensorflow as tf
import numpy as np

import PIL.Image
import PIL.ImageDraw

import matplotlib.pyplot as plt

def DisplayFractal(a, fmt='jpeg'):
  """顯示迭代計(jì)算出的彩色分形圖像绸栅。"""
  a_cyclic = (6.28*a/20.0).reshape(list(a.shape)+[1])
  img = np.concatenate([10+20*np.cos(a_cyclic),
                        30+50*np.sin(a_cyclic),
                        155-80*np.cos(a_cyclic)], 2)
  img[a==a.max()] = 0
  a = img
  a = np.uint8(np.clip(a, 0, 255))
  img1 = PIL.Image.fromarray(a)
  plt.imsave("image_tf.png", img1)
  plt.show()


sess = tf.InteractiveSession()
# 使用NumPy創(chuàng)建一個(gè)在[-2,2]x[-2,2]范圍內(nèi)的2維復(fù)數(shù)數(shù)組
Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
Z = X+1j*Y

xs = tf.constant(Z.astype("complex64"))
zs = tf.Variable(xs)
ns = tf.Variable(tf.zeros_like(xs, "float32"))
tf.global_variables_initializer().run()

# 計(jì)算一個(gè)新值z(mì): z^2 + x
zs_ = zs*zs + xs

# 這個(gè)新值會(huì)發(fā)散嗎僚碎?
not_diverged = tf.abs(zs_) < 4

# 更新zs并且迭代計(jì)算。
#
# 說(shuō)明:在這些值發(fā)散之后阴幌,我們?nèi)匀辉谟?jì)算zs,這個(gè)計(jì)算消耗特別大卷中!
#      如果稍微簡(jiǎn)單點(diǎn)矛双,這里有更好的方法來(lái)處理。
#
step = tf.group(
  zs.assign(zs_),
  ns.assign_add(tf.cast(not_diverged, "float32"))
  )

for i in range(200):
    step.run()

DisplayFractal(ns.eval())

這里對(duì)wiki上的源碼做了三處改動(dòng)

1. import matplotlib.pyplot as plt 

使用plt繪制二維數(shù)組圖

2.  img1 = PIL.Image.fromarray(a)
    plt.imsave("image_tf.png", img1)

用plt繪圖蟆豫,而不是IPython.display 

3. # 這個(gè)新值會(huì)發(fā)散嗎议忽?
not_diverged = tf.abs(zs_) < 4

原函數(shù)tf.complex_abs已經(jīng)在新版tf中棄用。

結(jié)果如下十减,在當(dāng)前目錄下生成一張圖片image_tf.png

image_tf.png
后記

還有其他繪制曼德勃羅集合的方式栈幸,這里就不展開(kāi)了愤估。

"""
本案例用來(lái)展示曼德布洛特迭代模型.
使用純粹的python 算法實(shí)現(xiàn)該模型, machine_10 使用tensorflow來(lái)實(shí)現(xiàn)該模型
繪圖使用PIL
"""

import time
from PIL import Image, ImageDraw

g_size = (400, 300) # 圖形最終尺寸
g_max_iteration = 256 # 最大迭代次數(shù)
g_bailout = 4 # 最大域
g_zoom = 2.5 / g_size[0] # 縮放參數(shù)
g_offset = (-g_size[0] * 0.25, 0) # 偏移量
g_HSL = (210, 80, 50) # HSL色彩基調(diào)

def draw(antialias = True):
    zi = 2 if antialias else 1 # antialias: 抗鋸齒 size = [i * zi
    size = [i * zi for i in g_size]
    zoom = g_zoom / zi
    offset = [i * zi  for i in g_offset]
    bailout = g_bailout * zi
    img = Image.new("RGB", size, 0xffffff)
    dr = ImageDraw.Draw(img)

    print("painting Mandelbrot Set..")
    for xy, color in getPoints(size, offset, zoom):
        dr.point(xy, fill = color)
    print("100%n")

    del dr
    if antialias:
        img = img.resize(g_size, Image.ANTIALIAS)
    img.show()
    img.save("mandelbrot_set_%dx%d.png" % g_size)

def getPoints(size, offset, zoom, ti = 0, tstep = 1):
    "生成需要繪制的點(diǎn)的坐標(biāo)及顏色"

    def getRepeats(c):
        z = c
        repeats = 0
        while abs(z) < g_bailout and repeats < g_max_iteration:
            z = z * z + c
            repeats += 1
        return repeats

    def getColor(r):
        color = "hsl(0, 0%, 0%)"
        if r < g_max_iteration:
            v = 1.0 * r / g_max_iteration
            h = ch * (1 - v)
            s = cs
            l = cl * (1 + v)
            color = "hsl(%d, %d%%, %d%%)" % (h, s, l)
        return color

    xs, ys = size
    xw, yh = xs / 2, ys / 2
    xo, yo = offset
    ch, cs, cl = g_HSL

    progress = 0
    for iy in range(ys):
        p = iy * 100 / ys
        if iy % 10 == 0 and p != progress:
            print ("%d%%..." % p) # 顯示進(jìn)度
            progress = p
        for ix in range(ti, xs, tstep):
            x = (ix - xw + xo) * zoom
            y = (iy - yh + yo) * zoom
            c = complex(x, y)
            r = getRepeats(c)
            yield (ix, iy), getColor(r)

def main():
    t0 = time.time()
    draw()
    t = time.time() - t0
    print("%dm%.3fs" % (t / 60, t % 60))

if __name__ == "__main__":
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市速址,隨后出現(xiàn)的幾起案子玩焰,更是在濱河造成了極大的恐慌,老刑警劉巖芍锚,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昔园,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡并炮,警方通過(guò)查閱死者的電腦和手機(jī)默刚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逃魄,“玉大人荤西,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵橄仆,是天一觀的道長(zhǎng)以清。 經(jīng)常有香客問(wèn)我,道長(zhǎng)焕议,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮舶胀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碧注。我一直安慰自己嚣伐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布萍丐。 她就那樣靜靜地躺著轩端,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逝变。 梳的紋絲不亂的頭發(fā)上基茵,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音壳影,去河邊找鬼拱层。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宴咧,可吹牛的內(nèi)容都是我干的根灯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烙肺!你這毒婦竟也來(lái)了纳猪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤桃笙,失蹤者是張志新(化名)和其女友劉穎氏堤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體怎栽,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽猬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熏瞄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚祟。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖强饮,靈堂內(nèi)的尸體忽然破棺而出由桌,到底是詐尸還是另有隱情,我是刑警寧澤邮丰,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布行您,位于F島的核電站,受9級(jí)特大地震影響剪廉,放射性物質(zhì)發(fā)生泄漏娃循。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一斗蒋、第九天 我趴在偏房一處隱蔽的房頂上張望捌斧。 院中可真熱鬧,春花似錦泉沾、人聲如沸捞蚂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姓迅。三九已至,卻和暖如春俊马,著一層夾襖步出監(jiān)牢的瞬間丁存,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工柴我, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柱嫌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓屯换,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彤悔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 場(chǎng)景(一) 昨天晚上睡覺(jué)之前他說(shuō):其實(shí)跟我結(jié)婚讓你生活在農(nóng)村嘉抓,我心里對(duì)你有愧疚,但是我會(huì)努力的晕窑。他能有這樣...
    遠(yuǎn)方SS閱讀 140評(píng)論 1 1
  • 1942年德國(guó)軍隊(duì)將列寧格勒圍得鐵桶一般抑片,居民饑寒交迫,餓得連路都走不動(dòng)杨赤,被稱為“活的幽靈”敞斋。與此同時(shí),列寧格勒著...
    卷啊卷啊卷卷毛閱讀 1,067評(píng)論 0 0
  • 晨曦中的茉莉疾牲,在印象中茉莉花都是比較柔軟植捎,我從這個(gè)角度來(lái)看來(lái)茉莉花也有堅(jiān)強(qiáng)的一面。
    天刀笑劍鈍閱讀 233評(píng)論 2 1
  • 最少我客觀的認(rèn)識(shí)自己了,還有就是舌剂。講究工作的方法
    lygly9閱讀 161評(píng)論 0 0