http://www./blog/archives/292
考慮函數(shù)f(z)=z^2-0.75。固定z0的值后,我們可以通過不斷地迭代算出一系列的z值:z1=f(z0), z2=f(z1), z3=f(z2), ...。比如,當(dāng)z0 = 1時(shí),我們可以依次迭代出:
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值始終在某一范圍內(nèi),并將最終收斂到某一個(gè)值上。 但當(dāng)z0=2時(shí),情況就不一樣了。幾次迭代后我們將立即發(fā)現(xiàn)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 ...
經(jīng)過計(jì)算,我們可以得到如下結(jié)論:當(dāng)z0屬于[-1.5, 1.5]時(shí),z值始終不會超出某個(gè)范圍;而當(dāng)z0小于-1.5或大于1.5后,z值最終將趨于無窮。 現(xiàn)在,我們把這個(gè)函數(shù)擴(kuò)展到整個(gè)復(fù)數(shù)范圍。對于復(fù)數(shù)z0=x+iy,取不同的x值和y值,函數(shù)迭代的結(jié)果不一樣:對于有些z0,函數(shù)值約束在某一范圍內(nèi);而對于另一些z0,函數(shù)值則發(fā)散到無窮。由于復(fù)數(shù)對應(yīng)平面上的點(diǎn),因此我們可以用一個(gè)平面圖形來表示,對于哪些z0函數(shù)值最終趨于無窮,對于哪些z0函數(shù)值最終不會趨于無窮。我們用深灰色表示不會使函數(shù)值趨于無窮的z0;對于其它的z0,我們用不同的顏色來區(qū)別不同的發(fā)散速度。由于當(dāng)某個(gè)時(shí)候|z|>2時(shí),函數(shù)值一定發(fā)散,因此這里定義發(fā)散速度為:使|z|大于2的迭代次數(shù)越少,則發(fā)散速度越快。這個(gè)圖形可以編程畫出。和上次一樣,我用Pascal語言,因?yàn)槲也粫﨏的圖形操作。某個(gè)MM要過生日了,我把這個(gè)自己編程畫的圖片送給她^_^
{$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,F(xiàn)PC 2.0下通過編譯,麻煩大家?guī)兔?bào)告一下程序運(yùn)行是否正常(上次有人告訴我說我寫的繪圖程序不能編譯)。在我這里,程序運(yùn)行的結(jié)果如下:

這個(gè)美麗的分形圖形表現(xiàn)的就是f(z)=z^2-0.75時(shí)的Julia集??紤]復(fù)數(shù)函數(shù)f(z)=z^2+c,不同的復(fù)數(shù)c對應(yīng)著不同的Julia集。也就是說,每取一個(gè)不同的c你都能得到一個(gè)不同的Julia集分形圖形,并且令人吃驚的是每一個(gè)分形圖形都是那么美麗。下面的六幅圖片是取不同的c值得到的分形圖形。你可能不相信這樣一個(gè)簡單的構(gòu)造法則可以生成這么美麗的圖形,這沒什么,你可以改變上面程序代碼中c變量的值來親自驗(yàn)證。
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,那么對于不同的復(fù)數(shù)c,函數(shù)的迭代結(jié)果也不同。由于復(fù)數(shù)c對應(yīng)平面上的點(diǎn),因此我們可以用一個(gè)平面圖形來表示,對于某個(gè)復(fù)數(shù)c,函數(shù)f(z)=z^2+c從z0=0開始迭代是否會發(fā)散到無窮。我們同樣用不同顏色來表示不同的發(fā)散速度,最后得出的就是Mandelbrot集分形圖形: 
前面說過,分形圖形是可以無限遞歸下去的,它的復(fù)雜度不隨尺度減小而消失。Mandelbrot集的神奇之處就在于,你可以對這個(gè)分形圖形不斷放大,不同的尺度下你所看到的景象可能完全不同。放大到一定時(shí)候,你可以看到更小規(guī)模的Mandelbrot集,這證明Mandelbrot集是自相似的。下面的15幅圖演示了Mandelbrot集的一個(gè)放大過程,你可以在這個(gè)過程中看到不同樣式的分形圖形。
網(wǎng)上可以找到很多小程序?qū)崿F(xiàn)Mandelbrot集的放大過程。把上面給出的代碼改一改,你也可以寫出一個(gè)這樣的程序來。
Update:2011 年 8 月 31 日,我對這個(gè)話題做了更進(jìn)一步的討論 http://www./blog/archives/4570
|