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

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的具体实现方法。

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

MIIM算法主体:

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

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

效果:

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

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

猜你喜欢

转载自blog.csdn.net/weixin_44873868/article/details/106411236