神奇的分形艺术(四):Julia集和Mandelbrot集
icon2 Brain Storm | icon4 2007-08-17 12:55| icon336 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

    考虑函数f(z)=z^2-0.75。固定z0的值后,我们可以通过不断地迭代算出一系列的z值:z1=f(z0), z2=f(z1), z3=f(z2), ...。比如,当z0 = 1时,我们可以依次迭代出:

z1 = f(1.0) = 1.0^2 - 0.75 = 0.25
z2 = f(0.25) = 0.25^2 - 0.75 = -0.6875
z3 = f(-0.6875) = (-0.6875)^2 - 0.75 = -0.2773
z4 = f(-0.2773) = (-0.2773)^2 - 0.75 = -0.6731
z5 = f(-0.6731) = (-0.6731)^2 - 0.75 = -0.2970
...

    可以看出,z值始终在某一范围内,并将最终收敛到某一个值上。
    但当z0=2时,情况就不一样了。几次迭代后我们将立即发现z值最终会趋于无穷大:

z1 = f(2.0) = (2.0)^2 - 0.75 = 3.25
z2 = f(3.25) = (3.25)^2 - 0.75 = 9.8125
z3 = f(9.8125) = (9.8125)^2 - 0.75 = 95.535
z4 = f(95.535) = (95.535)^2 - 0.75 = 9126.2
z5 = f(9126.2) = (9126.2)^2 - 0.75 = 83287819.2
...

    经过计算,我们可以得到如下结论:当z0属于[-1.5, 1.5]时,z值始终不会超出某个范围;而当z0小于-1.5或大于1.5后,z值最终将趋于无穷。
    现在,我们把这个函数扩展到整个复数范围。对于复数z0=x+iy,取不同的x值和y值,函数迭代的结果不一样:对于有些z0,函数值约束在某一范围内;而对于另一些z0,函数值则发散到无穷。由于复数对应平面上的点,因此我们可以用一个平面图形来表示,对于哪些z0函数值最终趋于无穷,对于哪些z0函数值最终不会趋于无穷。我们用深灰色表示不会使函数值趋于无穷的z0;对于其它的z0,我们用不同的颜色来区别不同的发散速度。由于当某个时候|z|>2时,函数值一定发散,因此这里定义发散速度为:使|z|大于2的迭代次数越少,则发散速度越快。这个图形可以编程画出。和上次一样,我用Pascal语言,因为我不会C的图形操作。某个MM要过生日了,我把这个自己编程画的图片送给她^_^

{$ASSERTIONS+}

uses graph;

type
   complex=record
      re:real;
      im:real;
   end;

operator * (a:complex; b:complex) c:complex;
begin
   c.re := a.re*b.re - a.im*b.im;
   c.im := a.im*b.re + a.re*b.im;
end;

operator + (a:complex; b:complex) c:complex;
begin
   c.re := a.re + b.re;
   c.im := a.im + b.im;
end;

var
   z,c:complex;
   gd,gm,i,j,k:integer;
begin
   gd:=D8bit;
   gm:=m640x480;
   InitGraph(gd,gm,'');
   Assert(graphResult=grOk);

   c.re:=-0.75;
   c.im:=0;
   for i:=-300 to 300 do
   for j:=-200 to 200 do
   begin
      z.re:=i/200;
      z.im:=j/200;
      for k:=0 to 200 do
      begin
         if sqrt(z.re*z.re + z.im*z.im) >2 then break
         else z:=(z*z)+c;
      end;
      PutPixel(i+300,j+200,k)
   end;

   readln;
   CloseGraph;
end.


    代码在Windows XP SP2,FPC 2.0下通过编译,麻烦大家帮忙报告一下程序运行是否正常(上次有人告诉我说我写的绘图程序不能编译)。在我这里,程序运行的结果如下:



    这个美丽的分形图形表现的就是f(z)=z^2-0.75时的Julia集。考虑复数函数f(z)=z^2+c,不同的复数c对应着不同的Julia集。也就是说,每取一个不同的c你都能得到一个不同的Julia集分形图形,并且令人吃惊的是每一个分形图形都是那么美丽。下面的六幅图片是取不同的c值得到的分形图形。你可能不相信这样一个简单的构造法则可以生成这么美丽的图形,这没什么,你可以改变上面程序代码中c变量的值来亲自验证。

c = 0.45, -0.1428
  

c = 0.285, 0.01
  

c = 0.285, 0
  

c = -0.8, 0.156
  

c = -0.835, -0.2321
  

c = -0.70176, -0.3842
  



    类似地,我们固定z0=0,那么对于不同的复数c,函数的迭代结果也不同。由于复数c对应平面上的点,因此我们可以用一个平面图形来表示,对于某个复数c,函数f(z)=z^2+c从z0=0开始迭代是否会发散到无穷。我们同样用不同颜色来表示不同的发散速度,最后得出的就是Mandelbrot集分形图形:
    

    前面说过,分形图形是可以无限递归下去的,它的复杂度不随尺度减小而消失。Mandelbrot集的神奇之处就在于,你可以对这个分形图形不断放大,不同的尺度下你所看到的景象可能完全不同。放大到一定时候,你可以看到更小规模的Mandelbrot集,这证明Mandelbrot集是自相似的。下面的15幅图演示了Mandelbrot集的一个放大过程,你可以在这个过程中看到不同样式的分形图形。







网上可以找到很多小程序实现Mandelbrot集的放大过程。把上面给出的代码改一改,你也可以写出一个这样的程序来。

Update:2011 年 8 月 31 日,我对这个话题做了更进一步的讨论 http://www.matrix67.com/blog/archives/4570

36 条回复

  • 楼层: 沙发 | | edwin89102 说:

    很难坐沙发,现在先坐一下

  • 楼层: 板凳 | | bear 说:

    c语言如何绘图呢?

  • 楼层: 地毯 | | dailongao 说:

    刚想说RP这么好有沙发,谁知道还是没有,晕

  • 楼层: 地板 | | dailongao 说:

    很漂亮!能运行,XP SP2,FPC 1.0.6

  • 楼层: 地下室 | | Eagle_Fantasy 说:

    实在是太强了!这么漂亮!由衷的对数学产生一种敬仰。。。

  • 楼层: 地基 | | Eagle_Fantasy 说:

    怎样放大?把代码写出来好么?我没学过operator这种东西,看不太懂你的源程序。

  • 楼层: 地壳 | | yiyi 说:

    newbee!

  • 楼层: 地幔 | | 狗狗 说:

    orz the Math

  • 楼层: 地核 | | Sean38 说:

    用lazarus编译似乎应该改为smallint.........

  • 楼层: 10楼 | | 胡青阳 说:

    犹如醍醐灌顶,太感谢这个论坛了!
    我以前只知道固定z0的值,却不知道把z0作为复平面!
    总之太感谢了!!!!!!

  • 楼层: 11楼 | | ! 说:

    LS不要说这是个论坛,知道不?
    知道不?知道不?知道不?

  • 楼层: 12楼 | | Freeze 说:

    “对于有些z0,函数值约束在某一范围内;而对于另一些z0,函数值则发散到无穷。”还有第三种情况,f[x]=-x,当z0=1时,会不满足上面的两个条件
    刚才还看了Mandelbrot集和Julia集的关系,前者如果是本书的话,后者就是其中的一页,就是说每个Mandelbrot集放大后都会成为一个Julia集……
    我只是现学现卖,大牛不要BS我……

    回复:函数只能是x^2+c的形式

  • 楼层: 12a楼 | | lgy0790 说:

    狂汗中,大牛竟然能玩出这种东西

  • 楼层: 14楼 | | Snowhj 说:

    k的颜色怎么调,有表吗?

    graph可以支持16bit及800*600吗?

  • 楼层: 15楼 | | iceberg 说:

    像发霉一样的图片……我不觉得漂亮的说……

  • 楼层: 16楼 | | lp 说:

    请问,你是怎么把图形拷下的啊??
    用什么方法,请快回复为谢!谢谢!谢谢!谢谢

    回复:截屏啊

  • 楼层: 17楼 | | menie 说:

    (楼上有点冷……)
    太神奇了。。

  • 楼层: 18楼 | | mjj 说:

    15楼只会说,有本事搞几幅新鲜的……

  • 楼层: 19楼 | | Luodog 说:

    在FP2.1.4,Windows vista home basic 下编译没通过啊……

  • 楼层: 20楼 | | suibian 说:

    混沌学的初级原理竟然......

  • 楼层: 21楼 | | hfly 说:

    实在美丽,妙不可言

  • 楼层: 22楼 | | altyu 说:

    为什么我做出来颜色一点都不好看????图形一样的。用你的程序。
    我用fp 2.2.4

  • 楼层: 23楼 | | 小岛 说:

    好象不能编译的原因的是因为smallint的缘故..
    如果遇到不能编译的编译器按照提示把相应的integer类型改成
    smallint应该就可以...
    ------------------------------------
    ..以前还没用过Pascal画过图呢...

  • 楼层: 24楼 | | 七七 说:

    请问有无想过做penrose拼砌的东西……本人学艺不精,CAD不上手,想问下大牛

  • 楼层: 25楼 | | guzh 说:

    FP死活找不到GRAPH单元

  • 楼层: 26楼 | | 转牛 说:

    M集里面的小M集只是类似,细节是不一样的。

  • 楼层: 27楼 | | Lab-7,OpenCV …  | `Alice Scarlett 的绝妙小屋 ., 说:

    [...] OpenCV 中文站 M67 Pascal 的绘图程序.. [...]

  • 楼层: 28楼 | | Matrix67: My Blog » Blog Archive » 兔年快乐,送大家分形兔子一只 说:

    [...] Douady 兔子,是由法国数学家 Adrien Douady 发现的。它是一种 Julia 集。 Posted in Brain Storm Tags: 艺术, 节日, Mathematica, 分形, 图形Trackback: [...]

  • 楼层: 29楼 | | Redfield Fractalius – 分形滤镜 | My Blog | 浅栖 说:

    [...] 话说前不久看了几篇Matrix67大牛介绍关于Julia集和Mandelbrot集的文章,虽然以我高一的学历看着还是云里雾里,但激发了我对这些东西的兴趣。鉴于这句话“网上可以找到很多小程序实现Mandelbrot集的放大过程”,然后我就找到了一个名字很奇怪的软件——数值异常混沌,不过没关系,功能挺不错的,可以放大、缩小等等。研究半天无果后继续搜索,于是乎就发现了这个副产品——Redfield Fractalius。 [...]

  • 楼层: 30楼 | | 数之思 – Thinking in math » 神奇的分形艺术解析与实例 说:

    [...] 3.神奇的分形艺术 [...]

  • 楼层: 31楼 | | aaa 说:

    這裡有徒手畫Mandelbrot set的教學
    http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand

  • 楼层: 32楼 | | Matrix67: My Blog » Blog Archive » 再谈Julia集与Mandelbrot集 说:

    [...]     很早以前,我简单介绍过 Julia 集和 Mandelbrot 集,文章在此。这可以说是数学中最神秘、最令人敬畏的研究对象之一。不过,那时我对这个话题了解还不太深。今天见到这个网页,让我对 Julia 集和 Mandelbrot 集有了更深的了解。我查阅了一些其他的资料,然后写下这篇长文,与大家一同分享。继续阅读以前,建议先看看我原来那篇文章(很短),那里面有很多漂亮的 Julia 集和 Mandelbrot 集的图片,这篇文章就不再展示了。 [...]

  • 楼层: 33楼 | | mooner 说:

    matrix大神,后面那些图是不是你画的啊,放大那么多次应该要使用高精度才能进行计算吧,并且颜色也太专业了啊。

  • 楼层: 34楼 | | Matrix67.com三周年精选回顾 - 紅吞吞 说:

    [...] matrix67大牛的blog今天三周年了~~这是他推出的三周年的精选回顾全是精华阿 看看下面的这些文章,谁能看出这是个文科生(传说中去北大中文系泡妞?!)原文的地址: http://www.matrix67.com/blog/archives/5581. 原创科普说明文:递归假期的一篇作文,叫我们写任一说明文。我把这篇作文发到了我的Blog上。这可能是我Blog最早的技术文章,它确定了我以后类似文章的写作风格。2. 非常奇妙的证明:图形必在格点之外翻译的cut-the-knot上的一篇文章。这是我所见到的最elegant的证明之一,在饭桌上提到证明问题时我经常会举这个例子。几个好友很早就开始阅读我的Blog,他们一致认为这是最令人难忘的一篇日志。3. 几个把平面几何问题的辅助线做到空间去的数学趣题也是翻译的cut-the-knot上的系列文章,当时觉得确实非常神奇。后来的学习发现,其实射影几何中有更多有趣的例子。4. 追溯羊与车:Monty Hall Dilemma问题的故事我们数学老师提到了Monty Hall问题,他的说法是错误的,因此才写下这篇文章。当时写这篇文章主要是给我的同学看,因为那时这个Blog几乎只有我们同学才上。5. 几个很强的数列这是我在The On-Line Encyclopedia of Integer Sequences找到的,非常强。不是经常有考什么数列找规律的么?从这里面随便挑一个来,不查数列百科全书的话别人几乎不可能找出规律来。6. 爱的方程式惊奇函数图像系列文章的第一辑。后来渐渐有了3D桃心函数、阴阳图函数、公式生成的色情图片等一系列的东西。7. 什么是P问题、NP问题和NPC问题这可能是我写的最长的一篇原创文章了。很多网友都说,在类似的文章中这一篇是讲解最清楚、最通俗易懂的。8. KMP算法详解可能是这个Blog最经典的文章了。不少朋友最初都是找KMP算法找到这个Blog来的。9. 位运算讲解系列文章应该是这个Blog里第二经典的文章了。10. 无限小却无限大的集合 & 阶梯状的连续函数前段时间我和一帮人在饭桌上提到了诡异的函数,比如处处连续处处不可导的函数、除常函数外没有最小正周期的周期函数、导数为正却找不出单增区间的函数、平面上任意小的范围内均能找到一点的单值函数、在有理点处处不连续在无理点处处连续的函数(俗称爆米花函数)。但处处连续的阶梯函数,很多人可能还是第一次听说。挺好玩的。11. 令人称奇的简单证明:五种方法证明根号2是无理数牛!这个牛!想看一些精妙的证明,体会到数学证明的神奇之处的话,从这里开始是一个不错的选择。12. 从零开始学算法:十种排序算法介绍(上)这个也牛!同样地,如果想看一些精妙的算法和复杂度的分析证明,体会CS的乐趣,从这里开始是一个不错的选择。13. 从零开始学算法:十种排序算法介绍(中)这篇日志里讲了快速排序的平均复杂度的分析和证明,很强大很科学。初学算法的人经常会忽略复杂度分析这一步,学过一段时间后回过头来看看经典算法的复杂度分析是很有益的。14. 从零开始学算法:十种排序算法介绍(下)没啥好介绍的……以后有些没什么特别背景的日志我就不附加文字介绍了,不然写着好累。15. 无题 于2007年5月16日现在我已经很少在自己的Blog里写我的感情生活了。这是我在19岁生日那天写的。16. 数论部分第一节:素数与素性测试17. 神奇的分形艺术(一):无限长的曲线可能围住一块有限的面积分形艺术系列的开篇。分形这个东西其实挺好玩的。18. 十大另类程序语言(上)19. 十大另类程序语言(下)哈哈,这个好玩!!有几个语言相当搞笑,挺佩服老外的想象力的。20. 令人敬畏的十维空间出人意料的结论。对应的几何图像太难以想像了。我一直想写一篇描述四维几何形状的文章,至今仍未动键盘。21. 十个有趣的英文文字游戏(上)22. 十个有趣的英文文字游戏(下)很早就对英文文字游戏感兴趣,看到过不少,记了各种性质独特的英文句子。有一天突然想整理出来写一下,于是有了这两篇日志。中文其实也有很多好玩的东西,比如对联啊,灯谜啊,拆字啊,断句啊,回文句啊等等。23. 神奇的分形艺术(四):Julia集和Mandelbrot集还是在饭桌上,每次提到数学神秘得令人恐惧时我都会讲起这个。真是太神奇了,一个如此简单的过程竟然可以生成这般复杂玄妙的分形图形。24. Tupper自我指涉公式:图象里竟然包含式子本身数学中的魔术,非常有意思。本以为非常神奇,揭秘之后恍然大悟——不过如此。25. 编辑距离、拼写检查与度量空间:一个有趣的数据结构26. Poincaré圆盘模型:一个神奇的双曲世界进北大时恰逢数学文化节十周年,数院开了一系列精彩的讲座。我去听了其中三个讲座,这是我听过的最精彩一次。看《什么是数学》时看到了相关的内容,再结合这里的一些东西仔细品味了一下,真是科学得无与伦比。以后我还将引用到这篇日志。27. 等高线模式:解决极大极小问题的另类策略Pólya的《数学与猜想》确实是一本好书。我在这本书里学到了好多东西,其中一个最主要的收获就是这套诡异的极大极小问题解决办法。28. 趣题:直觉 VS 理性思考 经典概率问题29. 另类搞笑:自我指涉例句不完全收集AboutMe里就提到,我喜欢带有递归和自我指涉的句子。一直收集着很多这样的句子,终于决定整理出来和大家分享。30. 物理方法解决数学问题(二):Archimedes与球体积公式31. 趣题:n为奇数时,正n边形的三角形剖分内有且仅有一个锐角三角形从EagleFantasy那里挖来的,是我目前最喜欢的“一句话证明”。跟别人提到“一句话证明”时我必然会拿它当例子。32. 物理方法解决数学问题(四):Fermat-Torricelli问题33. 证明实数区间不可数的新方法我喜欢讲课,喜欢听每次揭晓“谜底”后下面的人恍然大悟的感叹声,喜欢从基本结论出发一步步推出不可思议的结论。在所有科学的东西里,我最爱讲的,最具悬念,最有戏剧性,结论最令人惊讶,最能颠覆传统观念就是对无穷集合势的分析了。从有限到无限,从可数到不可数,以及直线和平面上的点一一对应等等,每一个证明都令人拍案叫绝。这里提到了实数区间不可数与博弈游戏的关系,从一个全新的角度来看连续统,分析证明过程实在巧妙。34. 趣题:一个与Hamilton回路有关的问题35. 100囚犯问题、100囚犯问题加强版与选择公理(上)36. 100囚犯问题、100囚犯问题加强版与选择公理(下)37. 趣题:构造函数使得平面上任意小的圆内均包含函数上的点有一天突发奇想,到豆瓣的数学小组去逛了一圈,然后发现了这个神奇的东西。38. 很诡异的博弈问题分析方法39. 趣题:猜帽子游戏与Hamming编码40. 趣题:构造游戏初始状态使得后行者必胜41. 物理方法解决数学问题(五):一个与椭圆有关的性质42. 趣题:量子计算机、另类编程语言和幂函数的解释43. 趣题:对数字进行编码使其按字典序排列后仍然有序这两篇日志是相当科学的算法题。很长时间没看到这么经典有趣的题目了,特别是前面那篇。44. 神奇的锈规作图:单用一个只能画单位圆的圆规如何作等边三角形这个精彩,强烈推荐一下。45. 矩阵、随机化与分形图形某留学Stetson大学的MM一次在校内上发日志链接到了我的Blog,我回访回去时认识了她。我和Stetson MM网恋了一段时间,发国际短信花了我不少钱。后来Stetson MM有了男朋友了,这段故事就此告终。这告诉我们:建网站来吸引MM终究是不可靠的。Stetson MM是我所见过的最适合我的MM,其思维的相似程度达到了令人惊讶的地步,世界上居然有一个如此像我的异性真是不可思议!这篇日志与Stetson MM在线性代数课上的一个课题研究有关。Stetson MM告诉我,她一个同学看到这篇日志后问她我Blog里的Stetson MM是不是指的她,她惊呼“你也订阅了这个Blog”呀。Small world。当时这篇日志在抓虾上的推荐数很是让我吃惊。46. 分享一些有趣的面试智力题(上)47. 分享一些有趣的面试智力题(下)48. 20年的时间里你可以做些什么?今年我20岁生日时写下的一篇特别的日志。神奇的是,这篇日志的ID正好也是我的生日——516。49. 趣题:空间四边形外切于给定球,求证四切点共面50. 趣题:直尺不够长时如何作出连接两点的直线?《什么是数学》中与射影几何相关的一个习题。当时我曾经在古汉课上大叫“太科学了”。 M12 Puzzle 传Google2亿美元收购Digg  [...]

  • 楼层: 35楼 | | 万毒狂魔 说:

    我玩了很多年Mandelbrot集了。

  • 楼层: 36楼 | | LPrayer 说:

    为什么我这里能跑出来但是颜色不一样?求速回……
    FPC 2.4.2

您也随便说几句吧:

您可以在 Gravatar 设置您的头像。