當前位置:
首頁 > 知識 > 自繪Mandelbrot集合(七)

自繪Mandelbrot集合(七)

十六、連續的迭代次數


還剩下的問題有兩個。一是靠近右邊斜線那裡的孔雀羽眼看起來和左邊那些有點不同,它們的中心是黑的。這其實是我們在第十節中遇到的老問題。我們把迭代次數上限定得太低,以至於許多不屬於Mandelbrot集合的點也被算在集合內部,於是被畫成了黑色。


第二個問題是,如果觀察左邊大色塊部分,會發現顏色呈不連續的條帶狀。這是因為迭代次數總是一個整數,所以逃逸次數(即第一次使得zn超出逃逸半徑的迭代次數n)函數是離散的。當然這還是一個口味問題,也許有人就是覺得平滑過渡的顏色沒有不連續的條帶狀顏色帶漂亮。但是如果我們希望消除這些條帶,希望顏色能夠平滑過渡,那該怎麼處理?


如果有兩個複數c1和c2,都花了n次迭代逃出規定的逃逸半徑(我們前面都取逃逸半徑為2,於是其平方為4),按照前面離散的迭代次數的定義,它們逃出逃逸半徑的速度是一樣的,於是在調色板中取到的顏色也完全相同。我們希望有一種方法更細緻地來區分出它們逃逸速度的快慢。


常見的處理方法是使用所謂的「連續的逃逸次數」函數來取代我們前面使用的離散的逃逸次數函數。先設定足夠大的逃逸半徑,對一個複數c,令n是第一次使得zn超出逃逸半徑的迭代次數,定義它的「連續的逃逸次數」為

d = n+1 - log(log(|zn|)) /log(2)


雖然這個定義取決於預先設定的逃逸半徑,但可以證明,當這個預先定義的逃逸半徑趨向於無窮大時,對於固定的複數c,上面這個式子趨向於一個固定值。所以如果我們只要確定一個較大的逃逸半徑,我們就能近似地計算出它的「連續的逃逸次數」,其值不取決於所選取的具體的逃逸半徑值。


假設在逃逸半徑為2時,對於某複數c,離散的逃逸次數為n,也就是說|zn|>2但並不超過很多,那麼如果我們取比較大的逃逸半徑比如說為2k,其中k是一個整數,那麼從zn開始還需要多少次才能超出這個大的逃逸半徑?|zn+1|=|zn2+c|,如果c的模較小的話,|zn+1|≈|zn2|=|zn|2;類似地|zn+k|約等於|zn|2k,也就是大約還要k次迭代才能超出逃逸半徑2k。按照上面的「連續的逃逸次數」的定義,


d = n+ k +1 - log(log(|zn+k|)) /log(2)


≈ n+ k +1 - log(log(|zn|2k)) /log(2)


= n + k + 1 - log(2klog(|zn|))/log(2)


= n + k + 1 - k - log(|zn|)/log(2)


= n + 1 - log(|zn|)/log(2)


≈ n + 1 - log(2)/log(2)


= n

所以這個「連續的逃逸次數」又是可以和原來的離散的逃逸次數可以相比的,可以看作是原來的定義的精細化。


按照上述公式,將逃逸半徑的平方ESCAPERADIUS增加到128.0,將迭代次數上限增加到10000,並將在源程序的第(7)部分中使用上述「連續的逃逸次數」函數:


Java版本


JavaScript版本


注意計算的其實是前面所說的|zn|的平方,所以在log中需要乘以0.5。


運行得到(因為增大了逃逸半徑和迭代次數上限,所需要的計算時間更長了,如有需要請耐心等待幾分鐘):

自繪Mandelbrot集合(七)



-0.743030 + 0.126433i @ 0.016110 /0.75


我們終於得到了符合要求的圖像。

十七、完整的源碼


為了防止在前面修改過程中可能有操作失誤,本節給出修改完成後最終完整的源碼。懶得看上述一步步修改過程的讀者也可以拿最後這個完整的版本來測試。容易驗證最終兩個版本的源程序長度均為一百五十行左右。


Java版本


JavaScript版本


十八、進一步的話題


關於Mandelbrot集合圖像繪製的具體編程的討論,本文到此已經全部完成了。下面給希望進一步了解這方面內容的讀者提供一些建議。


本文介紹的按照逃逸次數來繪製Mandelbrot集合圖像的方法也許是比較簡單的,但並不是最精細的。維基百科中還介紹了其他的演算法,最為精細的是「距離估計法」(Distance Estimation Method)。它通過Koebe定理來直接估計一個點到Mandelbrot集合的距離,而非象逃逸次數法那樣間接地通過逃逸次數來估計。這對於希望直接看到Mandelbrot集合圖像,而非通過看到其臨近結構從而間接看到它的人來說更有用。這一點在觀察所謂的「細絲」結構,以及驗證Mandelbrot集合圖像確為連通集合,而需要非黑即白地畫出Mandelbrot集合圖像時尤為明顯。

自繪Mandelbrot集合(七)


自繪Mandelbrot集合(七)


當然,要了解距離估計法繪圖則需要更進一步的數學工具,在此就不具體介紹了。


本文的程序沒有用戶交互功能,只能繪製指定區域坐標的圖像。如果事先不知道區域坐標而想自己探索Mandelbrot集合有趣的地點的話,本程序就很不實用了。好在網上有許多此類程序,比如英文維基百科中介紹的Web Mandelbrot網頁就是一個很好的工具,在本文的寫作過程中幫了我不少忙。具體鏈接請見參考文獻。


本文的分形圖像基本都是寬度為800個像素,最後的反鋸齒也只用3x3超級採樣。但分形圖像以大和精細為美,如果真要作裝飾(比如電腦桌面),需要增加寬度、逃逸半徑、迭代上限以及超級採樣次數的設置。此時的計算量將會大大增加。一般應該使用專業軟體繪製,但是自己動手也未嘗不可。我的建議是使用低設置來測試調色板和圖像的區域,確定以後再選擇高設置來繪製最終結果。另外我們注意到,在第(5)部分主程序的循環,以及第(6)部分計算顏色中,我們計算出一個像素中心點的逃逸次數後立刻使用它來計算出像素顏色並繪製。但其實一個像素中心點的逃逸次數和它的顏色是獨立的,後者隨著不同調色板而變,但前者總是一樣的。所以在象Java這樣有保存中間計算結果功能(比如使用Java序列化技術)的語言中,對固定的區域坐標,我們完全可以先計算好每個像素中心點逃逸次數並保存。在以後使用不同調色板時就無需再重複計算,只需直接讀取已完成的計算結果即可,這可以省下許多計算時間。而JavaScript這樣運行速度為弱項的語言來繪製大而精細的圖像則不太實用。

自繪Mandelbrot集合(七)



這是因為64比特雙精度浮點運算到了它的能力極限,這個極限大約在畫面寬度為1e-14處。所有隻使用64比特雙精度浮點運算的分形繪圖程序都有這個問題,包括上面所說的Web Mandelbrot網頁。要突破這個極限,就必須使用更高精度的浮點數運算。理論上我們有任意精度的浮點運算工具,但是如果對每一點都進行這樣的運算,計算時間會極其漫長。有一種微擾演算法,可以只需對一點進行高精度浮點運算,而對其周圍點只進行普通雙精度浮點運算而得到令人滿意的結果,第三節中提到的Kalles Fraktaler軟體就是利用這個演算法來達到令人乍舌的Mandelbrot集合超深放大的圖像。


更多的對程序的優化方法可參考維基百科Mandelbrot Set條「優化」一節。


(待續)


參考文獻:

[1] Javier Barrallo, and Damien M. Jones, Coloring Algorithms for Dynamical Systems in the Complex Plane,Visual Mathematics1.4 (1999)


[2] Karol Guciek, Web Mandelbrot guciek.github.io/web_mandelbrot.html


[3] 維基百科Mandelbrot set條目 https://en.wikipedia.org/wiki/Mandelbrot_set


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科學公園 的精彩文章:

轉基因作物便宜了誰?
崔永元終於賣食品了!他的套路你能看懂嗎?
趙南元:評「克隆人」所謂的倫理問題
長著「吸盤觸手」的神話海妖——大型頭足類 Cephalopoda

TAG:科學公園 |

您可能感興趣

Redis 集合(Set)
曝光 竟是iPad、iMac、MacBook Pro的集合體
PentestPackage-Pentesting腳本集合
Walkers 集合
Bank Holiday折扣集合:Coach, Topshop, La Mer, 小CK等都有驚喜折扣
Chinese Word Vectors:目前最全的中文預訓練詞向量集合
樂高新品:漫威全員集合《復仇者聯盟3:無限之戰》&Avengers:Infinity War 電影盒組
「冰港」the bigint 設計師集合品牌 開業首秀「icebreak
Marc Jacobs 新品上市 | IT Bag 大集合
巴黎世家(Balenciaga )Triple S老爹鞋,開會啦,集合完畢,請檢閱
國內基本沒有貨的supreme聯名NikeLab Air Max 98各配色大集合!
華碩Zenfone 5系列全體集合!Zenfone 5 Max跑分現身
"IT Girl " Petra Collins 攝影作品集合,少女系的復古氣息大片賞析!
MongoDB 刪除集合
第七屆GaonMusicAwards頒獎禮眾星雲集 紅毯照大集合
用Python 實現的機器人演算法示例集合——PythonRobotics
用TensorFlow 實現的模型集合
集合最強女Idol合唱《Wow Thing》28日公開
AJ4配色三巨頭集合,Air Jordan 4 "What the" 正面照來啦!
ajax傳遞list集合