python分形几何

Mandelbrot(曼德布洛特)集合是在复平面上组成分形的点的集合。

Mandelbrot集合的定义(摘自维基百科)

Mandelbrot集合可以用下面的复二次多项式定义:

其中c是一个复参数。对于每一个c,从z=0开始对函数 

 进行迭代。

序列 

 的值或者延伸到无限大,或者只停留在有限半径的圆盘内。

Mandelbrot集合就是使以上序列不发散的所有c点的集合。

从数学上来讲,Mandelbrot集合是一个复数的集合。一个给定的复数c或者属于Mandelbrot集合,或者不是。

用程序绘制Mandelbrot集合时不能进行无限次迭代,最简单的方法是使用逃逸时间(迭代次数)进行绘制,具体算法如下:

  • 判断每次调用函数 

     得到的结果是否在半径R之内,即复数的模小于R
  • 记录下模大于R时的迭代次数
  • 迭代最多进行N次
  • 不同的迭代次数的点使用不同的颜色绘制
import numpy as np
import pylab as pl
import time
from matplotlib import cm
def inter_point(c):
    z=c
    for i in range(1,100):
        if abs(z)>2:
            break
        z=z*z+c
    return i
def draw_mandelbrot(cx,cy,d):
    x0,x1,y0,y1=cx-d,cx+d,cy-d,cy+d
    y,x=np.ogrid[y0:y1:200j,x0:x1:200j]
    c=x+y*1j
    start=time.perf_counter()
    mandelbrot=np.frompyfunc(inter_point,1,1)(c).astype(np.float)
    print("time=",time.perf_counter()-start)
    pl.imshow(mandelbrot,cmap=cm.Blues_r,extent=[x0,x1,y0,y1])
    pl.gca().set_axis_off()
x,y=0.27322626,0.595153338
pl.subplot(231)
draw_mandelbrot(-0.5,0,1.5)
for i in range(2,7):
    pl.subplot(230+i)
    draw_mandelbrot(x,y,0.2**(i-1))
pl.subplots_adjust(0.02,0,0.98,1,0.02,0)
pl.show()

time= 0.2717320999999999
time= 0.31482999999999994
time= 0.4434923000000002
time= 0.5119992999999998
time= 0.6302547000000001
time= 0.7690006

import numpy as np
import pylab as pl
import time
from matplotlib import cm
def draw_mandelbrot(cx,cy,d,N=200):
    global mandelbrot
    x0,x1,y0,y1=cx-d,cx+d,cy-d,cy+d
    y,x=np.ogrid[y0:y1:N*1j,x0:x1:N*1j]
    c=x+y*1j
    ix,iy=np.mgrid[0:N,0:N]
    mandelbrot=np.ones(c.shape,dtype=np.int)*100
    ix.shape=-1
    iy.shape=-1
    c.shape=-1
    z=c.copy()

    start=time.perf_counter()
    for i in range(1, 100):
        z*=z
        z+=c
        tmp=abs(z)>2.0
        mandelbrot[ix[tmp],iy[tmp]]=i
        np.logical_not(tmp,tmp)
        ix,iy,c,z=ix[tmp],iy[tmp],c[tmp],z[tmp]
        if len(z)==0:
            break
    print("time=",time.perf_counter()-start)
    pl.imshow(mandelbrot,cmap=cm.Blues_r,extent=[x0,x1,y0,y1])
    pl.gca().set_axis_off()
x,y=0.27322626,0.595153338
pl.subplot(231)
draw_mandelbrot(-0.5,0,1.5)
for i in range(2,7):
    pl.subplot(230+i)
    draw_mandelbrot(x,y,0.2**(i-1))
pl.subplots_adjust(0.02,0,0.98,1,0.02,0)
pl.show()

time= 0.04651939999999932
time= 0.030365299999999706
time= 0.04211450000000028
time= 0.0633827999999994
time= 0.10660480000000128
time= 0.1617885000000001

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值