封存 Archive
封存 Archive
計算數學入門系列 - 編寫程式模擬社會隔離(三)
- 取得連結
- X
- 電子郵件
- 其他應用程式
所以這裏的問題,在於中心一點是否等於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。
說到這裏,這個模擬社會隔離的程式,大致上已經完成。同學們如果有興趣,可以把整個程式編寫出來。只要對程式編寫有一點基礎認識,相信不會太過困難。
- 取得連結
- X
- 電子郵件
- 其他應用程式
留言
發佈留言