封存 Archive
封存 Archive
計算數學入門系列 - 編寫程式模擬社會隔離(二)
- 取得連結
- X
- 電子郵件
- 其他應用程式
上面的三種方法,沒有那一個是絕對的好,或者是那一個絕對不要學習。根據同學們自己的能力可以隨便使用任何一種方法。第一種方法無疑是最直接,程式的脈落看起來也最清楚。可是程式可能會非常冗長,在copy-and-paste 的時候可能也要精神一點,不要忘記將其中一些內容更改。第三種方法,編寫要用最多腦力,也需要對MATLAB有更好的掌握。但是熟能生巧,當你習慣了MATLAB這套語言,這個兩行程式是最乾淨,而且程式執行起來也會更快捷。我自己對入門同學的建議,是先寫一個沒有錯誤bug-free 的程式,這比起是否有效率,是否乾淨更其重要。當同學對軟件更加純熟,才慢慢的想方法把for-loop 移除,想像一下如何可以用MATLAB的一些內置函數將程式簡化和加速。
在模擬社會隔離的這個數學模型裏面,還有另外一個相關的計算問題。由於我們需要看一下在我旁邊八個格裏面一共有多少人跟我同一標籤,再看一下這佔據所有鄰居的多少個百分比,所以除了上面的計算外,還需要看一下旁邊有多少空格有人居住。做法其實同上面的那個問題基本上一樣,唯一要注意的,是矩陣X所儲存的是0,1和2,代表着冇人居住,標籤A和標籤B。所以如果我們要計算有多少鄰居的話,我們如果只將上面的程式更改成為
count2=[X~=0];
count2=sum(count2(:))-1;
這樣就「差不多」可以了。第一項裏面我們只需要將conditional statement 改變為X~=0,就是說他不等於0的地方,就用1代表,有了標籤A或B,那一個對應的地方就放入0。 然後第二句,就只需要計一下count2 這個變量裏面有多少個1,我們就知道這個3×3矩陣裏面有多少個鄰居。
前面為什麼說是「差不多」呢?因為這個程式計算出來的答案有機會是錯誤的。當同學如果把不同的矩陣放入這個程式內跑,會發覺大部份情況都沒有太大的問題,程式也不會有任何錯誤訊息顯示。可是,有些簡單情況,程式出現的答案會是錯誤的。這一種程式的bug 是相當難被發現。他不是一些語法錯誤(Syntax Error),MATLAB是可以執行這兩項程式,他也不會告訴你計算出來的答案和你想象中顯示的不相符。
這兩項程式的問題,是在於第二行「-1」這個行為。上面我們需要在第二行「-1」,是由於我們知道在中心那一格重複計算了一次。可是在這個計算裏面,中心一格並不一定等於0,所以程式第二行「-1」這個行為不一定需要。舉一些例子,
• 如果矩陣X 裏面9格都是0,第一行count2 這個矩陣將會是9格都是1,所以最後count2 這個變量就等於8。答案是正確的。
• 可是,如果矩陣X中心的一格是1,其他8格都是0的話,第一行count2 這個矩陣中心的一格將會是0其餘8格都是1,所以最後count2 這個變量就等於7。答案就錯誤了。
- 取得連結
- X
- 電子郵件
- 其他應用程式
留言
發佈留言