Scratch & Math: 直線裡的宇宙觀(一)

直線是幾何學裡最基礎的概念,自古以來人類就以直線當作一種計量工具,用來量測直的物件。我們都知道直線是由點構成,但是一個直線的線段含有多少個點呢?這個看似簡單的問題卻牽涉到有限和無窮的概念論爭。在這個單元裡我們要用Scratch解決一個幾何問題:水平直線的同一側有兩個點, 要如何找到兩點和水平直線的最短路徑?

數學關鍵字: 直線、點的大小、飛箭悖論。

數學家: 畢達哥拉斯、芝諾。

程式關鍵字:蠻力搜尋。

Scratch程式:https://scratch.mit.edu/projects/158116299/

生活裡的直線

在我們的日常生活中處處可以見到直線:書本的邊是直線,房間牆面的轉折是直線,建築的樑柱是直線,城市裡的道路是直線。

我們可以依著尺畫出一條直線,但是在紙上的筆跡也只會是直線的近似物。真正的直線是想像的東西,在幾何學裡,直線只具有位置和長度,沒有粗細也沒有方向性,是點進行移動的軌跡。

但是仔細想想,大自然裡的線條卻鮮少有直線。山岳有起伏的稜線,雲朶有不規則的邊線,河流、葉脈和血管都是開展的碎形。較接近直線的是森林裡高聳的杉木樹幹,但是細看卻可能發現樹幹只是粗糙的直線近似物。大概只有光線可以被視為理想的直線。因此二十世紀初著名的西班牙建築師高第曾說過「直線屬於人類,曲線屬於上帝」。高第師法自然,他的作品當中幾乎找不到直線,代之以各式各樣的曲線與模擬自然界有機型態的物件來構成一棟棟建築。

直線是由什麼構成的?

歐幾里得稱呼直線為「沒有寬度的長度」,他在幾何原理中描述了直線的特性:兩點一線構成唯一的線段,沿著線段的兩端延伸成為一條直線。

直線可以看作是一個點的集合,集合中任一點都會在這個集合其他任意兩點所確定的直線上。但是歐幾里得特別強調出這個「點」沒有實際大小,是數學裡用來標示空間位置的抽象概念。

比歐幾里得早兩百年的數學家畢達哥拉斯對於直線的想法卻不是這樣,他認為整個宇宙是嚴格遵循整數比而產生。在這種觀念下,一條直線是由許多微小的點組成,點就是構成線的基本單位,點具有大小

如果用一個放大鏡看一條直線,畢達哥拉斯的直線會像左邊的圖,一個線段由有限個具有大小的點構成。歐幾里得的直線看起來會像右邊的圖,放大以後仍然看不出它可以分解成個別的點。

構成直線的點到底有沒有大小?要如何由點串連成線段?一個線段又含有多少個點?

古希臘的數學家對這個問題有諸多解答。畢達哥拉斯(Pythagoras,約西元前六世紀中)相信,在空間延伸的直線是由不可分割,且具有大小的點組成。

德謨克利特(Democritus,約西元前410年)的原子論認為自然世界由兩種基本部分構成:不可分割的原子和空無的虛空。原子(atom)一詞源自希臘語,它的意思就是「不可分割」,代表著物質在被無數次分割之後,最終會小到無法分割。

柏拉圖(Plato,西元前 427 — 前347年)結合了畢達哥拉斯的數學理論,為一切元素都可以還原為三角形,即宇宙的最基本物質,而一切物體都可以五種幾何正多面體構成。

亞里斯多德(Aristotle,西元前 384 — 前322年)在他的著作「論天體」中就提到數學中的點是不具大小的,駁斥了柏拉圖將幾何正多面體視為物體構成要素的理論。亞里斯多德認為數學的的平面沒有厚度,因此不能構成物體。如果數學平面有厚度,數學的線就要有寬度才能構成平面;數學的點就要有大小才能構成線,與數學的基本定義相違背。因此,一個幾何物件只能分割成相同型態的幾何物件;平面只能分成平面,不能分割成線。線只能分割成線,不能分割成點。亞里斯多德反對原子論者物件最後可以分割成原子的說法。

靜止不動的飛箭?

芝諾(Zeno of Elea)是西元前五世紀的希臘哲學家,他提出了幾個著名的悖論。所謂悖論,就是邏輯上無法判斷對錯,或是違背直覺導致矛盾的問題。芝諾最有名的悖論之一就是下面這個問題。

假如有一支飛箭射出,我們可以看到飛箭在直線上移動。

每一個瞬間,飛箭都占有空間裡的一個特定位置。在這一瞬間,我們把飛箭當成是靜止不動的。

數學上定義直義是由無窮多沒有大小的點構成,飛箭在每一個點上都可以視為是點靜止不動的。

如果每一個點上的飛箭都是靜止不動的,那麼為什麼我們又怎麼會看到飛箭在移動呢?

(取自維基百科Zeno’s_paradoxes CC BY-SA 3.0

這個問題就是芝諾提出的飛箭不動論。解釋這個問題的一種想法是,每一個點上飛箭雖然是靜止不動的,但是飛箭卻具有運動的性質,就像是一種瞬間移動的現象。也就是說,當時間的變動趨於無限小的瞬間,飛箭會從一個點跳到另一個點。這種想法對未來的微積分發展的提供了重要的邏輯理論基礎。

如果一個點的大小是0,即使有無窮多個點組成線段,線段長度應該仍然為0,那麼線段的長度又是怎麼來的呢?

數學家一直沒辦法合理解決像飛箭不動論或是沒有大小的點如何構成一直線這樣的問題,直到牛頓(Newton, 1642–1727)引入了無窮小的概念。牛頓將點的大小視為無窮小,線段的長度是由局部無窮小的變化量累積而得到。無窮小是經過無窮次的分割而得到,但無窮小並不是0,因為無窮多個0組成的線段長度仍然為0;無窮小也不能是一個有限正數,因為無窮多的點會累積成無窮長的線段。因此無窮小具有不等於0,但是要多小就有多小的特性。基於這樣的想法,漸漸發展出完整的微積分概念。

歐幾里得描述的直線是一個純粹思維的物件,直線是由無窮多個沒有大小的點所構成。古希臘人沒有足夠的數可以對應填滿直線上無窮多個點,一直到十九世紀康托爾(Cantor)推導出直線是由代數數和超越數這兩種無窮大的物件集合所構成,才有了足夠的點去「填滿」直線。

對於物質組成的討論到今天仍在繼續。物理學家在二十世紀認為基本粒子是質子、中子、電子、光子和各種介子。隨著量子場量的進展,又發現了更基本的夸克和膠子。在真實的世界裡,一條線的組成或許更接近古老的畢達哥拉斯的想法也未可知。

線是由什麼樣的構成的?點是連續的還是離散的?從古希臘到今天,這個論爭仍在繼續著。翻開數學史,我們可以看到數學家提出了各種答案,而這些答案和歐幾里得幾何、解析幾何、微積分、集合論和測度度的研究都具有密切的關係。連續和離散的論爭彷彿是拉扯著腳踏車的兩個踏板,一搭又一搭地拉著數學這門學問不斷進步和發展。

一個最短路徑的問題

兩個點之間的最短路徑就是連接兩點的直線。

如果有兩個點A和B,位於一條直線的同一側。那麼從點A到點B要碰觸到直線的最短路徑是什麼?

很明顯地,我們想找的最短路徑應該不是用曲線來連結。

比較會是像下面這張圖,點A連一條直線碰觸到水平的直線,再由同一個碰觸點連一條直線到點B。

現在的問題是,水平的直線上可以找到任一點當碰觸點,那要怎麼決定碰觸點的位置求得最短路徑呢?

我們不容易直接分辨上圖三種連線中那一種連線路徑較短,用尺量或許是最直接的判斷方法。但是有沒有想到什麼方法可以在水平線上要找出最短路徑連線呢?

動手做2–1 找出最短路徑

[程式設計需求規格]

用Scratch程式找出從點A到點B要碰觸到直線的最短路徑是什麼?點A和點B位在軸線同一側。

[程式設計角色和舞台]

在這個程式裡有四個角色。畫出三個小點分別代表點A、點B和在水平軸線上的一個可移動點。另外畫出一條水平軸線當做角色。舞台背景維持空白即可。

[程式設計解決方案:蠻力搜尋]

電腦的強項就是有很強大的計算能力。當我們寫好一段計算路徑長度的程式,電腦可以搜尋水平線段上的每一個點計算相對應的路徑長度。水平線段上點可能有好幾百個,如果我們用尺量再用手算,肯定會花費非常久的時間,同時也有算錯的可能。但是這樣的計算量對電腦來說大概只要幾秒鐘的時間就可以完成。

我們將解決這個問題的策略設想為,水平軸線上有一個可移動的點,對這個點設定一個移動範圍,計算每一次移動位置到點A和點B的路徑長度。最後從中挑選出最小的值就是我們想找的答案。

現在關鍵就在怎麼設定水平軸線上移動點的搜尋範圍。下面的圖顯示水平軸線上有兩個點,點C是點B垂直投射在水平軸線上的點,點D則在點C的右邊。看明顯連接到點C的路徑較連接到點D的路徑短。

因此我們可以設定搜尋範圍是從點A對水平軸線的垂直投影,一直到點C對水平軸線的垂直投影。超過搜尋範圍的連接路徑都一定不會是最短路徑。

接下來的程式裡紅點代表點A,藍點代表點B,黑點在軸線上由左到右移動,計算路徑長度。

觀念平台:蠻力搜尋(brute-force search)
蠻力搜尋是一種常用的解決問題技巧。應用蠻力搜尋時會系統性地列舉所有可能的候選物件,再一一檢查每一個候選物件是否滿足問題解決的條件。一般來說,蠻力搜尋會有幾個主要的步驟,
1. 找到第一個候選物件。
2. 利用迴圈依序產生下一個候選物件。
3. 檢查每一個候選物件是否合乎問題解決條件。
4. 輸出所有合乎問題解決條件的物件。
程式[黑點2–1.2]移動黑點就是一種蠻力搜尋,對於搜尋範圍內的每一個點都計算並且記錄對應的路徑長度,最後找到問題要求解的最小路徑長度。
蠻力搜尋是一種簡單有效的問題解決方法,但是當候選物件數目太多,蠻力搜尋可能會變得太慢而沒有效率。

[程式檢視]

程式[藍點2–1.1]、[紅點2–1.1]和[軸線2–1.1]將我們的命題畫出來。每一次按下綠旗都會隨機產生不同的紅點和藍點位置,但是會確保紅點和藍點都在軸線上方同一側。

程式[黑點2–1.2]最主要的任務是讓黑點在搜尋範圍一步一步的移動,一開始設定在紅點的x座標,再一步步移動到下一個位置,直到抵達藍點的x座標。每走一步程式都會計算黑點到紅點和藍點的距離,存入距離清單中。也就是應用蠻力搜尋對每一個可能的點做路徑距離計算。

在scratch裡的清單由兩個部分組成,分別是索引和相對應的項目值。勾選距離清單顯示在舞台,可以看見索引從1開始順序編排,每一個索引都對應到一個路徑距離的數字。

「最小距離」是一個重要的變數,一開始故意設成一個很大(1000000)的起始值。之後每一次移動黑點計算的路徑長度都要和變數「最小距離」做比較,只要小於變數「最小距離」就更新變數值。如此一來,程式[黑點2–1.2]完的時候,變數「最小距離」存的值就是最小的路徑距離。

程式[黑點2–1.3]是負責輸出的部份,畫出距離分佈長條圖,並且標示出水平軸線上能夠產生最小距離的點。

從距離分佈長條圖我們可以看到,最小路徑距離不會發生在搜尋範圍的兩端,而是在中間的某個位置。

舞台左側顯示的兩個數字由上而下分別是「最小距離索引」和「最小距離」。在這個例子裡最小距離索引為105,代表了是在紅點x座標開始算起第105個點會產生最小路徑距離322.025078。勾選距離清單顯示在舞台上,可以看到相同的結果,清單索引105的項目值為322.025078。

延伸閱讀:

Scratch & Math: 天花板上的蜘蛛(一) Scratch & Math: 天花板上的蜘蛛(二)

Scratch & Math: 直線裡的宇宙觀(一) Scratch & Math: 直線裡的宇宙觀(二)

Scratch & Math: 不能說的祕密(一) Scratch & Math: 不能說的祕密(二)