曼德布洛特集合绘制

[toc]

初衷

曼德布洛特集合是在李善友老师的混沌大学公开课上听到的,在极客学院使用TensorFlow也可以实现该集合,将其可视化时,于是尝试模拟该模型。

参考文档

Numpy、matplotlib实现二维数据到图像的转换,添加colormap,无边距显示:https://blog.csdn.net/u010105243/article/details/76695400

极客学院源码曼德布洛特集合源码(较老):http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mandelbrot.html

源码实现曼德勃罗集合
"""
本案例来展示偏微分方程
使用tensorflow来实现该模型
"""

import tensorflow as tf
import numpy as np

import PIL.Image
import PIL.ImageDraw

import matplotlib.pyplot as plt

def DisplayFractal(a, fmt='jpeg'):
  """显示迭代计算出的彩色分形图像。"""
  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创建一个在[-2,2]x[-2,2]范围内的2维复数数组
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()

# 计算一个新值z: z^2 + x
zs_ = zs*zs + xs

# 这个新值会发散吗?
not_diverged = tf.abs(zs_) < 4

# 更新zs并且迭代计算。
#
# 说明:在这些值发散之后,我们仍然在计算zs,这个计算消耗特别大!
#      如果稍微简单点,这里有更好的方法来处理。
#
step = tf.group(
  zs.assign(zs_),
  ns.assign_add(tf.cast(not_diverged, "float32"))
  )

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

DisplayFractal(ns.eval())

这里对wiki上的源码做了三处改动

1. import matplotlib.pyplot as plt 

使用plt绘制二维数组图

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

用plt绘图,而不是IPython.display 

3. # 这个新值会发散吗?
not_diverged = tf.abs(zs_) < 4

原函数tf.complex_abs已经在新版tf中弃用。

结果如下,在当前目录下生成一张图片image_tf.png

image_tf.png
后记

还有其他绘制曼德勃罗集合的方式,这里就不展开了。

"""
本案例用来展示曼德布洛特迭代模型.
使用纯粹的python 算法实现该模型, machine_10 使用tensorflow来实现该模型
绘图使用PIL
"""

import time
from PIL import Image, ImageDraw

g_size = (400, 300) # 图形最终尺寸
g_max_iteration = 256 # 最大迭代次数
g_bailout = 4 # 最大域
g_zoom = 2.5 / g_size[0] # 缩放参数
g_offset = (-g_size[0] * 0.25, 0) # 偏移量
g_HSL = (210, 80, 50) # HSL色彩基调

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):
    "生成需要绘制的点的坐标及颜色"

    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) # 显示进度
            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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 场景(一) 昨天晚上睡觉之前他说:其实跟我结婚让你生活在农村,我心里对你有愧疚,但是我会努力的。他能有这样...
    远方SS阅读 130评论 1 1
  • 1942年德国军队将列宁格勒围得铁桶一般,居民饥寒交迫,饿得连路都走不动,被称为“活的幽灵”。与此同时,列宁格勒著...
    卷啊卷啊卷卷毛阅读 999评论 0 0
  • 晨曦中的茉莉,在印象中茉莉花都是比较柔软,我从这个角度来看来茉莉花也有坚强的一面。
    天刀笑剑钝阅读 228评论 2 1
  • 最少我客观的认识自己了,还有就是。讲究工作的方法
    lygly9阅读 154评论 0 0