目錄

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

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



所以這裏的問題,在於中心一點是否等於0。如果中心一點是0就沒有問題,不等於0的話答案就錯了。再仔細看一下,就是說,如果第一行count2 中心點是1,第二行就需要「-1」;如果第一行count2 中心點是0,第二行就不需要「-1」,就是說只需要「-0」。所以,要解決這個bug,我們可以把第二行改成


count2=[X~=0];

count2=sum(count2(:))-count2(2,2);


這樣子就可以了。


當然,就算我們不改正這一個bug,其實對整個程式不會有太大影響。因為如果中心一格等於0,我們根本不需要考慮居住在這一格的人是否滿意自己居住的環境然後考慮會否搬離這一格。所以無論答案是對還是錯,其實不會對整個程式有太大影響。甚至乎,同學在編寫這個程式時並沒有發現這個bug也沒關係,最後的模擬應該看不出來。 


但是,這個例子就可以看出為什麼我們在編寫程式時有時會發現,程式越改越複雜,越來越難debug。因為很多時一小部份的錯誤並不會在整體上顯示出來。只有當我們將不同部份拼湊起來,作出改動,有些時候才會發現計算出來的答案和想像中好像有點落差,答案好像總是有點不對頭。有些同學在這個地方已經放棄,一直跟我們說找不到bug,跟我們說每一部份計出來的答案都和想像中的一樣。這可能是在編寫大型程式時最有挑戰的地方,同學們必須要回頭再去嘗試找出這些邏輯錯誤(Logical Error)。


這個模擬社會隔離的程式內,最重要的部份基本上已經完成,剩下來的是把需要搬來的人隨機放到一些空格來。針對着「隨機」, MATLAB 有兩個來自函數rand 和randn。可是他們都是用來產生一些隨機數,並不是可以直接使用在我們現在的應用上。那我們應該如何使用隨機函數rand 編寫我們的程式呢?我們可以簡化一點討論,假設我們現在有10個空格,用矩陣Y來表示。然後我們有5個人,要隨機放進這10個空格內。 聽起來好像有點複雜,但是其實我們只需要在矩陣Y內隨機放入1至5,代表着5個人的標記,餘下來的5格都放0,代表還是空置着。更簡單的方法,我們可以先將1至10隨機放入矩陣Y裏面,然後將6到10這些數字更改為0。這就完成了。所以剩下來最重要的問題,就是如何用隨機函數rand「隨機將1至10隨機放入矩陣Y裏面」。 這裏沒有一個最好的方法,同學可以運用自己的想像力,設計不同的方法達到這個效果。自己覺得這個是編寫程式解決數學問題最有趣的地方,同一個問題,其實可以有很多不同的數學方法解決,也有很多不同的編寫程式的方法,我們可以按着自己的喜好,天馬行空,編寫出一些有效率的方法。


其中一個可以提供的方法,是運用MATLAB另外一個內置函數sort。他本來的目的是去排列一些數字,可是如果仔細看一下這個內置函數的功用,會發覺,除了把排列好了的數字顯示出來,這個函數還可以把這些數字原來的地方報告給我們。所以我們可以用下面三行程式


Y=rand(10,1);

[~,Y]=sort(Y);

Y(Y>=6)=0;


第一行我們運用了MATLAB內置函數rand 去產生一個10×1的矩陣。然後第二行用了另外一個內置函數sort 去把矩陣Y排列起來。第一個返回的變量我們並不需要,用「~」去表示。然後第二個返回的變量就是我們需要的排列來源的地方。同學們如果看一下就會見到數字1至10隨機放在這個矩陣Y 裏面。最後一行,只是把Y大於或者等於六的地方找出來然後把那些地方的數字變成0。


說到這裏,這個模擬社會隔離的程式,大致上已經完成。同學們如果有興趣,可以把整個程式編寫出來。只要對程式編寫有一點基礎認識,相信不會太過困難。


留言