1. 程式人生 > >神奇的分形藝術(二):一條連續的曲線可以填滿整個平面

神奇的分形藝術(二):一條連續的曲線可以填滿整個平面


    雖然有些東西似乎是顯然的,但一個完整的定義仍然很有必要。比如,大多數人並不知道函式的連續性是怎麼定義的,雖然大家一直在用。有人可能會說,函式是不是連續的一看就知道了嘛,需要定義麼。事實上,如果沒有嚴格的定義,你很難把下面兩個問題說清楚。
    你知道嗎,除了常函式之外還存在其它沒有最小正週期的周期函式。考慮一個這樣的函式:它的定義域為全體實數,當x為有理數時f(x)=1,當x為無理數時f(x)=0。顯然,任何有理數都是這個函式的一個最小正週期,因為一個有理數加有理數還是有理數,而一個無理數加有理數仍然是無理數。因此,該函式的最小正週期可以任意小。如果非要畫出它的圖象,大致看上去就是兩根直線。請問這個函式是連續函式嗎?如果把這個函式改一下,當x為無理數時f(x)=0,當x為有理數時f(x)=x,那新的函式是連續函式嗎?
    Cauchy定義專門用來解決這一類問題,它嚴格地定義了函式的連續性。Cauchy定義是說,函式f在x=c處連續當且僅當對於一個任意小的正數ε,你總能找到一個正數δ使得對於定義域上的所有滿足c-δ< x <c+δ的x都有f(c)-ε<f(x)<f(c)+ε。直觀地說,如果函式上有一點P,對於任意小的ε,P點左右一定範圍內的點與P的縱座標之差均小於ε,那麼函式在P點處連續。這樣就保證了P點兩旁的點與P無限接近,也就是我們常說的“連續”。這又被稱作為Epsilon-Delta定義,可以寫成“ε-δ定義”。
    有了Cauchy定義,回過頭來看前面的問題,我們可以推出:第一個函式在任何一點都不連續,因為當ε< 1時,δ範圍內總存在至少一個點跳出了ε的範圍;第二個函式只在x=0處是連續的,因為此時不管ε是多少,只需要δ比ε小一點就可以滿足ε-δ定義了。
    在拓撲學中,也有類似於ε-δ的連續性定義。假如一個函式f(t)對應空間中的點,對於任意小的正數ε,總能找到一個δ使得定義域(t-δ,t+δ)對應的所有點與f(t)的距離都不超過ε,那麼我們就說f(t)所對應的曲線在點f(t)處連續。


    回到我們的話題,如何構造一條曲線使得它可以填滿整個平面。在這裡我們僅僅說明存在一條填滿單位正方形的曲線就夠了,因為將此單位正方形平鋪在平面上就可以得到填滿整個平面的曲線。大多數人可能會想到下面這種構造方法:先畫一條單位長的曲線,然後把它變成一個幾字形,接著把每一條水平的小橫線段變成一個幾字形,然後不斷迭代下去,最後得到的圖形一定可以填滿整個單位正方形。我們甚至可以遞迴地定義出一個描述此圖形的函式:將定義域平均分成五份,第二和第四份對應兩條豎直線段上的點,並繼續對剩下的三個區間重複進行這種操作。這個函式雖然分佈得有些“不均勻”,但它確實是一個合法的函式。最後的圖形顯然可以填充一個正方形,但它是不是一條曲線我們還不知道呢。稍作分析你會發現這條“曲線”根本不符合前面所說的ε-δ定義,考慮任何一個可以無限細分的地方(比如x=1/2處),只要ε<1/2,δ再小其範圍內也有一條豎線捅破ε的界線。這就好像當n趨於無窮時sin(nx)根本不是一條確定的曲線一樣,因為某個特定的函式值根本不能匯聚到一點。考慮到這一點,我們能想到的很多可以填滿平面的“曲線”都不是真正意義上的連續曲線。為了避免這樣的情況出現,這條曲線必須“先把自己周圍填滿再延伸出去”,而填滿自己周圍前又必須先填滿“更小規模的周圍”。這讓我們聯想到分形圖形。


    德國數學家David Hilbert發現了這樣一種可以填滿整個單位正方形的分形曲線,他稱它為Hilbert曲線。我們來看一看這條曲線是怎麼構造出來的。首先,我們把一個正方形分割為4個小正方形,然後從左下角的那個小正方形開始,畫一條線經過所有小正方形,最後到達右下角。現在,我們把這個正方形分成16個小正方形,目標同樣是從左下角出發遍歷所有的格子最後到達右下角。而在這之前我們已經得到了一個2x2方格的遍歷方法,我們正好可以用它。把兩個2x2的格子原封不動地放在上面兩排,右旋90度放在左下,左旋90度放在右下,然後再補三條線段把它們連起來。現在我們得到了一種從左下到右下遍歷4x4方格的方法,而這又可以用於更大規模的圖形中。用剛才的方法把四個4x4的方格放到8x8的方格中,我們就得到了一條經過所有64個小方格的曲線。不斷地這樣做下去,無限多次地迭代後,每個方格都變得無窮小,最後的圖形顯然經過了方格上所有的點,它就是我們所說的Hilbert曲線。下圖是一個迭代了n多次後的圖形,大致上反映出Hilbert曲線的樣子。
        



    根據上面這種方法,我們可以構造出函式f(t)使它能對映到單位正方形中的所有點。Hilbert曲線首先經過單位正方形左下1/4的所有點,然後順勢北上,東征到右上角,最後到達東南方的1/4正方形,其中的每一個階段都是一個邊長縮小了一半的“小Hilbert曲線”。函式f(t)也如此定義:[0,1/4]對應左下角的小正方形中所有的點,[1/4,1/2]就對應左上角,依此類推。每個區間繼續劃分為四份,依次對應面積為1/16的正方形,並無限制地這麼細分下去。注意這裡的定義域劃分都是閉區間的形式,這並不會發生衝突,因為所有m/4^n處的點都是兩個小Hilbert曲線的“交接處”。比如那個f(1/4)點就是左上左下兩塊1/4正方形共有的,即單位正方形正左邊的那一點。這個函式是一條根正苗紅的連續曲線,完全符合ε-δ定義,因為f(t-δ)和f(t+δ)顯然都在f(t)的周圍。
    Hilbert曲線是一條經典的分形曲線。它違背了很多常理。比如,把Hilbert曲線平鋪在整個平面上,它就成了一條填滿整個平面的曲線。兩條Hilbert曲線對接可以形成一個封閉曲線,而這個封閉曲線竟然沒有內部空間。回想我們上次介紹的Hausdorff維度,你會發現這條曲線是二維的,因為它包含自身4份,每一份的一維大小都是原來的一半,因此維度等於log(4)/log(2)。這再一次說明了它可以填滿整個平面。

    Hilbert曲線的價值在於建立一維空間與二維空間一一對應的關係。Hilbert曲線可以看作是一個一維空間到二維空間的對映,也就是說我們證明了直線上的點和平面上的點一樣多(集合的勢相同)。Hilbert曲線也是一種遍歷二維格點的方法,它同樣可以用來證明自然數和有理數一樣多。如果你已經知道此結論的Cantor證明,你會立刻明白Hilbert遍歷法的證明,這裡就不再多說了。當然,Hilbert曲線也可以擴充套件到三維空間,甚至更高維的空間,從而建立一維到任意多維的對映關係。下圖就是一個三維Hilbert曲線(在迭代過程中)的樣子。



Matrix67原創
轉貼請註明出處