目錄

20200718 想法源起 20200719 我們在做什麼(一) 20200722 我們在做什麼(二) 20200725 竟然成為數學家(一) 20200729 竟然成為數學家(二) 20200801 竟然成為數學家(三) 20200805 不同職級(一) 20200808 不同職級(二) 20200812 趕客系列(一)為什麼讀大學? 20200815 趕客系列(二)不同大學學位跟工作的關係 20200819 趕客系列(三)大學的目的 20200822 趕客系列(四)大學為什麼要有主修 20200826 趕客系列(五)要挑選一個什麼樣的主修 20200829 沒有無緣無故的恨(一) 20200831 科普系列 - 數學與電影動畫製作(一) 20200902 沒有無緣無故的恨(二) 20200905 沒有無緣無故的恨(三) 20200907 科普系列 - 數學與電影動畫製作(二) 20200909 終身職位的評核 20200912 學術界吸引人的地方 20200914 科普系列 - 數學與電影動畫製作 (三) 20200916 學術界辛苦的地方(一) 20200919 學術界辛苦的地方(二) 20200921 科普系列 - 數學與電影動畫製作 (四) 20200923 大學的讀書成績有多重要 20200926 本科生研究機會 20200928 科普系列 - 數學與圖像修復(一) 20200930 用創新的方法去教育科學 20201003 參加研討會的重要 20201005 科普系列 - 數學與圖像修復(二) 20201007 教授與教學 20201010 研究是什麼(一) 20201012 科普系列 - 數學與圖像修復(三) 20201014 研究是什麼(二) 20201017 研究是什麼(三) 20201019 科普系列 - 數學與圖像修復(四) 20201021 如何閱讀研究論文 20201024 研究生應該修什麼課 20201026 科普系列 - 數學與圖像修復(五) 20201029 本科生的多主修多副修 20201102 科普系列 - 數學與數獨(一) 20201105 幾位教授(一) 20201109 科普系列 - 數學與數獨(二) 20201112 幾位教授(二) 20201116 科普系列 - 數學與數獨(三) 20201119 幾位教授(三) 20...

計算數學入門系列 - 編寫程式模擬社會隔離(二)



上面的三種方法,沒有那一個是絕對的好,或者是那一個絕對不要學習。根據同學們自己的能力可以隨便使用任何一種方法。第一種方法無疑是最直接,程式的脈落看起來也最清楚。可是程式可能會非常冗長,在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。答案就錯誤了。


留言