首页/文章/ 详情

使用Python实现MIIM方法绘制Julia set

4年前浏览2250

Julia set是一种用简单的表达式生成的复杂分型,一般的Julia set只需要使用

的表达式反复迭代便可以得到这样的图像。

虽然这个表达式很简单,但是具体要怎么使用这个表达式来生成Julia set的图像呢,今天来介绍下Python的实现方式。

关于Julia set有很多种实现方式,这篇文章介绍的是反向迭代法(Inverse Iteration Method,简称IIM)的一种改进方案。IIM的原理就是,我们从一个已知存在于Julia set的点中开始反向迭代。正常来说我们是把表达式的结果带入下一个表达式迭代,而反向迭代则是我们不断地解x的值带入下一次迭代。这种方法的好处就是,每一次迭代出来的点都一定是存在于Julia set中的。

IIM方法的性能比传统的BSM高很多,但是存在一些问题,IIM方法对于特定的c值给出的图像质量很差,因为原理限制,它很难迭代到“内部”的点,看起来有些发虚。下图是对比,左边是IIM,右边是质量较高的图像。

而又因为IIM方法每次迭代都会产生两个新的根,这个根生成的过程就好像二叉树一样。导致IIM的迭代次数是呈指数上升的,我们没办法简单通过增加迭代层数来获得更好的图像。如果迭代层数是N,那么实际迭代次数就是2^N。这个代价实在太高了,我们必须找一个别的方法。

这里就引入了我们主题中提到的MIIM,MIIM实际上就是Modified IIM。是对原有的IIM进行改进,解决了图像质量问题的IIM。下面的文章来介绍MIIM的具体实现方法。

我们需要首先获得Z0,Z0就是我们起始的迭代位置。这个值可以通过解方程获得

。正常情况下会获得两个根,获得根之后使用公式判断根是否有效,如果
,则这是一个有效的根,返回这个值即可,代码表达如下:


然后是一个把复数映射到平面上的工具函数。


MIIM算法主体:


MIIM维护一个矩阵,每当有点被迭代到,都会使对应的矩阵项值加1。但是这里我们人为设置了一个上限bailout。某个点被迭代的次数过多,对应矩阵点值超过了bailout,就会放弃从这个点继续迭代。由于bailout的设置,程序最终会因为没有点可以继续迭代停止,因此不需要设置迭代层数。

IIM的问题就在于迭代过程中访问的重复点太多,而MIIM解决了这个问题。提供了一个性能和质量的平衡。

效果:

最后 欢迎通过微信公众号联系我们。

微信公众号:320科技工作室。


更多行业
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2020-05-29
最近编辑:4年前
320科技工作室
硕士 | 结构工程师 lammps/ms/vasp/
获赞 222粉丝 346文章 304课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈