科學月刊【數‧生活與學習】專欄 96 年 4 月

數學著色公式

用數學公式來著色嗎?那會畫出什麼東西? 相信讀者早在其他地方,或許不只一次,看過所謂的「碎形」彩色圖片。 所以我也不賣關子,現在我就是要解釋它的製作程序。 而我的目的其實並非介紹碎形,而是用它來推介一個常數。 兩個月前曾說,按照教育體制中的學習順序, 五個最重要的數學常數依序是 1, 0, $\pi$, ie。其中 i 是單位虛數, 還記得它的讀者,大概立即反應的心像是:根號 -1,或者是 $x^2+1=0$ 的解 (或說「根」)。 那是代數的看法,也是教育體制中的正規起手式。 在代數看法之後, 高中數學教育其實也舉出了虛數的幾何看法, 即所謂的「複數平面」。 但是,可能是教材過於緊湊,而考試又不常出現, 幾何看法最後還是變成代數操作 (例如計算單位次方根)。

像 1+i, 2-i, 3+4i 這樣的數學物件, 稱為「複數」(complex number)。 因為在口語上與「負數」同音,所以我們經常用英語說複數。 一般而言,只要 xy 是兩個「實數」, 也就是普通使用的那些數啦,則 $x+yi$ 就是一個複數。 在本質上,複數其實是平面向量;這就是複數不能比大小的根本原因。 高中學生要分別理解 (並內化) 複數和平面向量兩種 (對他們來說) 全新的數學物件, 已經非常勞神費力,更何況這兩者在短期內接踵而至, 也真難為他們了。我認為,學生們難以連結複數和平面向量, 恐怕是課程設計的問題,而不能苛責學生。

我們知道向量有兩個屬性:方向和長度。 向量所在的位置,也就是它的起點和終點,並非屬性; 我們不在乎向量放在哪裡,只在乎它的方向和長度。 這個設計的理由是為了討論物理的方便,眾人皆知「力」可以用向量來表徵, 在討論施力的物理效應時,我們當然只在乎力的方向和強度, 不在乎是在家裡施力還是在國際機場施力。 因此,所有的平面向量可以全部移到起點在原點來討論, 而它的兩個屬性就可以用終點的兩個坐標值來推算,記作 $(x,y)$。 所以,平面上的每個點就代表一個向量。

將向量的長度記作 r, 它的方向可以用它與 x 軸的夾角來表示,記作 $\theta$, 而且 $0^\circ\leq\theta<360^\circ$。 那麼,一個平面向量的兩個屬性也可以寫成 $(r,\theta)$。 知道到這裡,其實向量也可以用「字典排法」來比大小: 兩個向量先比長度,長度大的就是大;如果長度相等就比夾角, 夾角大的就是大;如果長度和夾角都一樣,兩個向量當然就相等。 既然複數本質上就是平面向量,當然也可以記作 $(r,\theta)$, 這就稱為複數的「極式」;其中的「極」字來自於「極坐標」。 不過,上述比大小的方法,雖然合乎邏輯, 卻不同於我們直覺上對「兩個數比大小」的認知。 因此,除非經過特別解釋,我們還是說:複數 (或者平面向量) 不能比大小。

平面向量可以相加減,但是不能相乘除,當然也就沒有次方計算。 附帶說明一下,內積不算一種向量乘法,因為計算的結果不再是一個向量; 外積雖然將向量算成向量,但是它定義在空間向量上,我們不岔過去討論了。 一個非常偉大而美妙的數學內部連結,就是將平面向量的終點表示法 $(x,y)$ 轉換成複數 $x+yi$。 如此轉換之後,複數不但保持了平面向量的屬性 (長度和方向), 更可以做加減乘除的計算 (所以也有次方和開根號)。 除了比大小以外,我們能對實數做甚麼,就能對複數做甚麼, 複數的運算還保持了實數運算的所有規律:像交換律、分配律之類的。 事實上,複數帶進來更豐富、更美妙、甚至說是更神秘的性質, 曼德布洛特 (Mandelbrot) 碎形即為一例。

岔開一段話。 將空間向量連結成某種數,使得那種數盡量像實數一樣能夠做四則運算的企圖, 雖然有些成就,但是並不像平面向量與複數的連結那麼成功。 對於更高維度的向量,那種連結的企圖就可以說是失敗了; 或者說,至今尚未成功。 數學的主流思想,逐漸放棄了將高維度向量類化成實數的企圖, 而發展了現在所謂的線性代數和泛函分析。

如果我們想像實數運算讓對應的點在數線上跑來跑去, 則複數運算可以讓對應的點在平面上跑來跑去。 複數的加減就是向量的加減,假設我們已經知道它在平面上造成的對應關係。 在乘除計算中,我們舉最簡單的「自乘」為例。 從一個複數 z 開始,觀察 $z^2$, $z^3$, $z^4$..., 它們大約像是繞成了螺旋狀,但是如果 z 的長度不及 1,就繞向原點, 如果超過 1,就越繞越遠,如果等於 1,就在圓周上面繞。 我特別為科月的讀者準備了圖片,請看 http://libai.math.ncu.edu.tw/~shann/Lite/essay/9604/multi.html。 此後,當我再說圖片的網址,就只寫最後的檔案名, 讀者自行添上前面的字串 (從 http9604/)。

但是,稍微改變計算規則,先固定一個複數 c,一開始令 z=c, 然後做 $z^2+c$; 令這個計算結果是新的 z, 對這個新的 z$z^2+c$ (請忍耐一下,讀下去); 再令這個計算結果是另一個新的 z, 再對這個新的 z$z^2+c$。 如此重複地做下去,每次計算的結果對應在平面上的點,就不再有顯然的變化規則。 例如,在 seq.html 裡面,為您表現 c=-1+0.30i 的變化情況, 和 c=-1+0.37i。 兩者的變化都沒有明顯的規則,但是,如果忽略那些細節, 只看計算的過程是否讓新的 z 變得越來越「長」, 也就是跑得離原點越來越「遠」,那倒是蠻明顯的: 從 (-1, 0.30) 這一點出發,按照上述規則計算的 z 不會越跑越遠, 但是從差之毫釐的 (-1, 0.37) 這一點出發,就跑得越來越遠。

現在,我們規定一個簡單的著色公式。 先在坐標平面上決定一個矩形區域, 譬如根據我的經驗 (任何人寫了程式去算算看,都能獲得同樣的經驗, 這裡沒有神秘之處),選橫邊從 -2 到 0.5,縱邊從 -1.25 到 1.25 的矩形。 其實它是一個邊長為 2.5 的正方形,左下角頂點坐標是 (-2, -1.25)。 把這個正方形等分成 100 份,也就是橫邊等分成十份,縱邊也等分成十份。 從每個正方形的左下角頂點出發,各做前一段描述的計算 10 遍, 得到 100 個最後的 z。 如果那個 z 的長度超過一萬,就把它出發的小正方形塗白色, 否則就塗黑色。 這個數學公式決定了一百個小正方形的顏色:黑色或白色。 簡單地說,從黑色格子出發的 z 不會越跑越遠, 從白色格子出發的 z 會越跑越遠。 如果您真的很閒而且興趣高昂,可以自己做這個實驗。 按照上述公式畫出來的 100 個小格子,放在 mandel.html 裡面的第一張圖。

如果您覺得那張圖沒什麼意思,我們可以提高解析度, 把正方形的橫邊和縱邊各等分成 400 段,這樣就造成了十六萬個小格子, 從每個小格子的左下角頂點出發,執行上一段的程序十遍, 取得十六萬個最新的 z。 如果它的長度超過一萬,把它出發的那個格子塗上白色,否則塗上黑色。 這可就不是一般人願意嘗試的實驗了, 這也就是電腦該進場的時候。 其實,我只是在提高「解析度」,看 mandel.html 裡面的第二張圖。

雖然還是黑白剪影,但是它的外形是不是已經有點迷人了呢? 如果讓 $z^2+c$ 的重複次數增加一些, 再把 z 跑遠的程度區別出來 (我們確實要讓五十步笑百步): 譬如我們劃定 10000 這個界線,看看從每個方格出發的 z, 在幾步之後越過界線? 從來不曾越過的,塗上黑色,但是那些會越過的,就記下它們是在第幾步越過, 而指定它出發的小方格塗上那一號顏色。 所以,譬如說,我們就有 1 號色、2 號色、3 號色等等。 最後,只要決定所謂 1 號色是甚麼顏色、2 號色是甚麼顏色...就完成了著色。

這麼沒人性的著色規則,會好看嗎? 您以前或許已經看過,如果沒有的話, 有幾幅學生的作品放在 mandel3.htmlmandel4.html 給大家欣賞。它們都是「隔壁男孩」按照上述規則用電腦程式畫的, 並不是遙遠某處藝術家的作品。

【後記】96年4月28日在台北教育大學舉辦的2007張昭鼎研討會, 以此專欄作為演講底稿,配合兩篇網路教材使用:
  1. 數學觸發的視覺藝術
  2. 數位圖像導論
  3. Escher 的 Image Impossibles
  4. Escher 的 Print Gallery 及其數位化完成動畫

[ 回上層 ]


Created: Mar 23, 2007
Last Revised: 2007-04-29
© Copyright 2007 Wei-Chang Shann

shann@math.ncu.edu.tw