第四章MATLAB程序流程控制(本章小節(jié)和課后習(xí)題)
本章小節(jié)
(1)條件語(yǔ)句是編程中的重要工具,用于根據(jù)不同的條件執(zhí)行不同的命令。我們介紹了兩種條件語(yǔ)句:
??if-elseif-else-end 語(yǔ)句:用于多個(gè)條件判斷,根據(jù)條件的不同執(zhí)行不同的代碼塊。
?switch-case-otherwise-end 語(yǔ)句:適用于多個(gè)條件的情況,根據(jù)不同的條件選擇執(zhí)行相應(yīng)的分支。
(2)循環(huán)語(yǔ)句是用于重復(fù)執(zhí)行某些操作的重要工具,它能提高代碼的復(fù)用性和效率。我們介紹了兩種循環(huán)語(yǔ)句:
??for-end 語(yǔ)句:用于已知循環(huán)次數(shù)的情況。
??while-end 語(yǔ)句:適用于未知循環(huán)次數(shù)的情況,根據(jù)條件判斷是否繼續(xù)執(zhí)行循環(huán)。
此外,我們介紹了break 和 continue的用法,它們可以更加靈活地控制循環(huán)過(guò)程的執(zhí)行。其中break語(yǔ)句用于終止執(zhí)行 for 或 while 循環(huán);continue語(yǔ)句用于跳過(guò)循環(huán)的當(dāng)前迭代,然后繼續(xù)下一次迭代。
(3)在編寫(xiě) MATLAB 程序時(shí),異常處理是關(guān)鍵的,因?yàn)槌绦蚩赡軙?huì)面臨不可避免的錯(cuò)誤或異常情況。try-catch 語(yǔ)句允許我們?cè)诔绦蛑胁东@和處理異常,而不會(huì)導(dǎo)致程序崩潰。
(4)除了條件語(yǔ)句、循環(huán)語(yǔ)句和異常處理,MATLAB 還提供了其他常用指令,用于控制程序的流程。這些指令包括:
??tic 和 toc:用于測(cè)量代碼塊的執(zhí)行時(shí)間,幫助評(píng)估程序性能。
??pause:用于暫停程序的執(zhí)行,可以指定暫停的時(shí)間長(zhǎng)度。
??input:用于用戶(hù)輸入數(shù)據(jù)。
??warning:用于在程序運(yùn)行時(shí)生成警告信息。
??error:用于終止程序并生成錯(cuò)誤信息。
?
課后習(xí)題
基礎(chǔ)篇


Q2. 下面這段判斷正負(fù)數(shù)的代碼有問(wèn)題嗎?應(yīng)該如何修改?

Q4. 給定一個(gè)包含3個(gè)元素的行向量a,使用if語(yǔ)句對(duì)向量a中的元素按照從小到大的順序排序,并將排序后的向量保存到sort_a中。例如原來(lái)a=[3,8,5],那么sort_a=[3,5,8]。
?
Q5. 在本章介紹break和continue的小節(jié)中,有一道判斷n是否是質(zhì)數(shù)的例題。當(dāng)時(shí)的思路是遍歷從2到n-1的所有整數(shù),檢查它們是否能夠整除n。如果找到任何一個(gè)能夠整除n的整數(shù),那么n就不是質(zhì)數(shù);否則,n就是質(zhì)數(shù)。事實(shí)上我們可以縮小循環(huán)遍歷的范圍來(lái)提高效率。一般來(lái)說(shuō),只需要檢查從2到n的平方根(sqrt(n))之間的整數(shù),因?yàn)槿绻鹡有一個(gè)大于sqrt(n)的因子,那么它必定有一個(gè)小于sqrt(n)的因子。請(qǐng)解決下面兩個(gè)問(wèn)題:(1)優(yōu)化遍歷的范圍,對(duì)于n=10000000991,比較優(yōu)化前后的代碼的運(yùn)行時(shí)間;(2)自然數(shù)2至10000中有多少個(gè)質(zhì)數(shù)。
Q6. 下面這兩段代碼輸出的結(jié)果分別是什么?

Q7. 一個(gè)五位正整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱(chēng)該數(shù)為五角星數(shù),請(qǐng)找出所有的五角星數(shù)并將其保存到向量S中。
?
Q8. 生成一個(gè)8行5列的矩陣,矩陣中每一個(gè)元素都是在區(qū)間[1,10]上取值的隨機(jī)整數(shù)。接下來(lái)請(qǐng)循環(huán)每一行,若發(fā)現(xiàn)同一行的五個(gè)元素中各不相同,則保留該行。
?
Q9. 在本章介紹break和continue的小節(jié)中,有一道和斗地主相關(guān)的例題。請(qǐng)使用蒙特卡羅模擬計(jì)算你作為農(nóng)民首次出現(xiàn)炸彈所需的輪數(shù)的期望值。
?

提高篇
Q1. 一張100元的人民幣要換成10元、5元和1元面值的零錢(qián),要求以上零錢(qián)的總張數(shù)為20張,且要求每張面值不少于一張,用一個(gè)矩陣表示所有可能的組合,矩陣中每一行的三個(gè)元素分別表示三種面值人民幣的張數(shù)。
?
Q2. 假設(shè)自然界中有一種動(dòng)物,它每天被天敵捕食的概率均為0.02,且每天是否被天敵捕食這個(gè)事件是獨(dú)立的。請(qǐng)使用蒙特卡羅模擬得到這種動(dòng)物能存活的天數(shù)的期望值。
?
Q3. 一個(gè)班上30個(gè)同學(xué),請(qǐng)使用蒙特卡羅模擬計(jì)算至少有兩人是同一天生日的概率。
Q4. 每隔0.5秒在界面上隨機(jī)的輸出0或1,當(dāng)連續(xù)出現(xiàn)三次1時(shí),停止輸出。
?
Q5. 扔一枚正常的硬幣,若要扔出連續(xù)的3個(gè)正面,所需扔骰子的期望次數(shù)是多少?請(qǐng)使用蒙特卡羅模擬進(jìn)行計(jì)算,精確的數(shù)學(xué)答案是14。
?

Q7. 隨機(jī)生成一個(gè)各行各列和均為1的5階方陣,且該方陣的元素僅為0或1。例如下面這個(gè)矩陣就符合要求。(大家也可以嘗試不使用循環(huán)語(yǔ)句得到這個(gè)隨機(jī)的方陣)

Q8. 將一根長(zhǎng)度為1米的木棍隨機(jī)的折成三段,請(qǐng)用蒙特卡洛模擬分別計(jì)算以下兩個(gè)概率:(1)每段長(zhǎng)度都不大于0.45的概率;(2)這三段能構(gòu)成一個(gè)三角形的概率。
?
Q9. 蝸牛從10米深的井底爬,白天爬一米,晚上下落x米,其中x為[0,2]米的均勻分布的隨機(jī)數(shù),那么爬上去的期望天數(shù)是多少?這個(gè)題目選自知乎,精確答案約為277天。
?
Q10.?給定一個(gè)1到1億之間的整數(shù),請(qǐng)判斷這個(gè)整數(shù)是否為回文數(shù)(如:1,121,1221都是回文數(shù))。
?
Q11. 二分搜索法不僅可以用于求函數(shù)的零點(diǎn),還可以用于尋找向量中的特定值。給定一個(gè)長(zhǎng)度為100且遞增排列的向量x和一個(gè)要查找的目標(biāo)值t,使用二分搜索法確定向量x中是否存在目標(biāo)值t,若存在則返回其下標(biāo),不存在則返回0。請(qǐng)回答下面兩個(gè)問(wèn)題:(1)為了方便,你可以使用下面兩句代碼隨機(jī)生成x和t:x = sort(randi(200,1,100));? t = 88; 若x中存在多個(gè)t,只需要返回任意一個(gè)t的下標(biāo)。(2)假設(shè)我們令x = sort(randi(50,1,200));? t = 5,那么x中出現(xiàn)多個(gè)t的次數(shù)將大大增加。請(qǐng)?jiān)谏弦粏?wèn)代碼的基礎(chǔ)上進(jìn)行調(diào)整,使得代碼能夠輸出t所在的所有下標(biāo)。(你可以和find函數(shù)找到的結(jié)果進(jìn)行比較:find(x == t),看看結(jié)果是否一致)
?
Q12. 一個(gè)人扔一枚均勻的六面骰子,數(shù)值1到6,從起點(diǎn)開(kāi)始,扔到幾就向前走幾格,可以無(wú)限次扔骰子,問(wèn)他恰好走過(guò)第100格的概率是多少? 這個(gè)題目選自知乎,精確答案約為2/7。
Q13. 編寫(xiě)一個(gè)猜數(shù)游戲的代碼,規(guī)則如下:程序隨機(jī)生成1~100內(nèi)的整數(shù),讓用戶(hù)去猜,用戶(hù)每猜一次程序都會(huì)做出相應(yīng)的提示。若用戶(hù)輸入所猜的數(shù)字小于電腦隨機(jī)生成的數(shù)字,則提示“你猜小了!”;若大于,則提示“你猜大了!”;若相等,則提示“恭喜你贏了!”,游戲結(jié)束。如果用戶(hù)猜的次數(shù)超過(guò)了六次,則提示“最多猜六次,你失敗了。”,此時(shí)游戲結(jié)束。
?
Q14. 知乎上有這樣一個(gè)問(wèn)題:

請(qǐng)使用蒙特卡羅模擬驗(yàn)證這個(gè)答案是否可行(假設(shè)有30個(gè)人玩這個(gè)游戲)。
Q15. 下面這題來(lái)自2022年阿里巴巴全球數(shù)學(xué)競(jìng)賽,請(qǐng)大家求解該題。

挑戰(zhàn)篇
Q1. 排序算法是一類(lèi)經(jīng)典的算法,它們能將一個(gè)無(wú)序的向量變成有序的向量。請(qǐng)大家在網(wǎng)上搜索插入排序、選擇排序和冒泡排序的視頻或者資料,并使用MATLAB復(fù)現(xiàn)。為了測(cè)試方便,你可以令x=randi(100,1,20),將x中的元素按照從小到大進(jìn)行排序。若你的代碼返回的結(jié)果和sort(x)的結(jié)果相同,則說(shuō)明你做對(duì)了。
?
Q2. parfor(Parallel for)是MATLAB中的一種并行編程工具,用于在多個(gè)處理核心上并行執(zhí)行循環(huán)迭代。它類(lèi)似于常規(guī)的 for 循環(huán),但是可以在多個(gè)工作進(jìn)程上同時(shí)執(zhí)行循環(huán)的迭代,從而加速代碼的執(zhí)行,特別是對(duì)于需要重復(fù)計(jì)算或處理大數(shù)據(jù)集的任務(wù)。請(qǐng)大家在MATLAB官網(wǎng)搜索parfor相關(guān)的內(nèi)容,并嘗試將你之前代碼中的for改成parfor,查看代碼能否正常運(yùn)行,若能運(yùn)行則比較for循環(huán)和parfor循環(huán)的運(yùn)行時(shí)間。
?
Q3. 某游戲中有一把武器,該武器的初始等級(jí)為1級(jí),在游戲開(kāi)始時(shí)玩家可以免費(fèi)領(lǐng)取。在游戲中,玩家可可以花費(fèi)金幣對(duì)該武器進(jìn)行升級(jí),每次升級(jí)需要花費(fèi)10000金幣,且該武器最多能被升至5級(jí)。各等級(jí)升級(jí)的成功率如下表所示:

以第一行和第三行為例,表格中各元素的解釋如下:
1級(jí)武器升級(jí)時(shí),有20%的概率升到2級(jí),10%概率升到3級(jí),5%的概率升到4級(jí),65%的概率不變。
?3級(jí)武器升級(jí)時(shí),10%概率跌到1級(jí),20%概率跌到2級(jí),20%概率升到4級(jí),10%概率升到 5 級(jí),40%的概率不變。
請(qǐng)使用蒙特卡羅模擬,計(jì)算打造一把5級(jí)的武器平均需要花費(fèi)多少金幣。
?
Q4. 某設(shè)備上安裝有四只型號(hào)規(guī)格完全相同的電子管,已知電子管壽命(假設(shè)為整數(shù))在1000至2000小時(shí)之間均勻分布。當(dāng)電子管損壞時(shí)有兩種維修方案,一是每次更換損壞的那一只;二是當(dāng)其中一只損壞時(shí)四只同時(shí)更換。已知更換時(shí)間為換一只時(shí)需要1小時(shí),4只同時(shí)更換需要2小時(shí)。若更換時(shí)機(jī)器因停止運(yùn)轉(zhuǎn)導(dǎo)致每小時(shí)的損失為200元,若每只電子管價(jià)格100元,試用蒙特卡羅模擬決定選擇哪一個(gè)維修方案更省錢(qián)(為了方便,你可以設(shè)置總的模擬時(shí)長(zhǎng)為10萬(wàn)小時(shí),比較該設(shè)備運(yùn)行10萬(wàn)小時(shí)后,哪種方案花費(fèi)更小)?
?
Q5. 三門(mén)問(wèn)題(Monty Hall problem)又稱(chēng)蒙提霍爾問(wèn)題或蒙提霍爾悖論,它是一道非常有趣的概率問(wèn)題,該問(wèn)題的答案違反大家的直覺(jué)。請(qǐng)大家自己搜索三門(mén)問(wèn)題的相關(guān)資料,并使用MATLAB驗(yàn)證三門(mén)問(wèn)題的答案。
Q6. 萊斯利矩陣是英國(guó)生態(tài)學(xué)家Leslie于1945年提出的一種數(shù)學(xué)方法,該方法能利用某一初始時(shí)刻種群的年齡結(jié)構(gòu)現(xiàn)狀,動(dòng)態(tài)地預(yù)測(cè)種群年齡結(jié)構(gòu)及數(shù)量隨時(shí)間的演變過(guò)程。請(qǐng)大家查閱相關(guān)資料學(xué)習(xí)該模型的建模過(guò)程,并解決下面這個(gè)問(wèn)題。
已知某動(dòng)物最長(zhǎng)壽命為10歲,且初始狀態(tài)下該動(dòng)物各年齡組的數(shù)據(jù)如下表所示:

假設(shè)該動(dòng)物的繁衍過(guò)程滿(mǎn)足以下條件:
該動(dòng)物在各個(gè)年齡段的雌雄比例都是2:1;
新出生的該動(dòng)物的雌雄比例也是2:1;
各年齡段內(nèi)該動(dòng)物的死亡率都相同。
請(qǐng)回答以下問(wèn)題:
(1)預(yù)測(cè)該動(dòng)物未來(lái)30年各年齡段的數(shù)量以及占比;
(2)若該動(dòng)物的天敵在第30年后開(kāi)始出現(xiàn),這將導(dǎo)致從下一年開(kāi)始各年齡段的死亡率均增加到原來(lái)的3倍。請(qǐng)問(wèn)該動(dòng)物從遭遇天敵開(kāi)始,需要多少年該動(dòng)物的數(shù)量會(huì)下降到1000只內(nèi)。
?
Q7. 本題來(lái)自2023年阿里巴巴全球數(shù)學(xué)競(jìng)賽,題目如下:A與B二人進(jìn)行“抽鬼牌”游戲。游戲開(kāi)始時(shí),A手中有n張兩兩不同的牌。B手上有n+1張牌,其中n張牌與A手中的牌相同,另一張為“鬼牌”,鬼牌與其他所有牌都不同。游戲規(guī)則為:
(1)??? 雙方交替從對(duì)方手中抽取一張牌,A 先從B手中抽取。
(2)??? 若某位玩家抽到對(duì)方的牌與自己手中的某張牌一致,則將兩張牌丟棄。
(3)??? 最后剩一張牌(鬼牌)時(shí),持有鬼牌的玩家為輸家。
假設(shè)每一次抽牌從對(duì)方手上抽到任一張牌的概率都相同,請(qǐng)用蒙特卡羅模擬n分別為31和32時(shí),A 獲勝的概率。(參考答案:n=31時(shí)為17/33,n=32時(shí)為9/17)。
?
Q8. 下面我們來(lái)看一道排隊(duì)論的題目。假設(shè)某銀行工作時(shí)間只有一個(gè)服務(wù)窗口,工作人員只能逐個(gè)接待客戶(hù)。當(dāng)來(lái)的顧客較多時(shí),一部分客戶(hù)就需要排隊(duì)等待。若假設(shè)下面四個(gè)條件成立:(1)從銀行開(kāi)始營(yíng)業(yè)起,客戶(hù)到來(lái)的間隔時(shí)長(zhǎng)(單位為分鐘)服從參數(shù)為0.1的指數(shù)分布;(2)每位客戶(hù)的服務(wù)時(shí)長(zhǎng)服從均值為10,方差為4的正態(tài)分布(單位為分鐘,若服務(wù)時(shí)長(zhǎng)小于1分鐘,則按1分鐘計(jì)算);(3)排隊(duì)按先到先服務(wù)的規(guī)則,且不限制隊(duì)伍的長(zhǎng)度;(4)銀行每天工作時(shí)長(zhǎng)為8小時(shí),若客戶(hù)開(kāi)始服務(wù)的時(shí)間比銀行下班的時(shí)間晚,銀行不提供服務(wù)。請(qǐng)模擬100個(gè)工作日,計(jì)算出平均每天接待客戶(hù)的人數(shù)以及每天客戶(hù)的平均等待時(shí)長(zhǎng)。
?
Q9. 在上一題的基礎(chǔ)上,解決下面兩個(gè)進(jìn)階的問(wèn)題:(1)若顧客抱怨等待時(shí)間太長(zhǎng),銀行準(zhǔn)備開(kāi)設(shè)第二個(gè)服務(wù)窗口,請(qǐng)計(jì)算有兩個(gè)服務(wù)窗口的情況下,這100個(gè)工作日內(nèi)銀行平均每天接待客戶(hù)的人數(shù)以及每天客戶(hù)的平均等待時(shí)長(zhǎng)。為了簡(jiǎn)化模擬,我們可以假設(shè):顧客會(huì)選擇當(dāng)前沒(méi)有在服務(wù)的窗口;若兩個(gè)窗口都有服務(wù),他們選擇結(jié)束時(shí)間較早的那個(gè)窗口(這和現(xiàn)實(shí)中的先取號(hào)再叫號(hào)的策略一樣)。(2)若銀行新開(kāi)設(shè)的第二個(gè)窗口每天僅在前四個(gè)小時(shí)提供服務(wù),請(qǐng)重新計(jì)算第一問(wèn)的結(jié)果(若客戶(hù)的到達(dá)時(shí)間超出了前四個(gè)小時(shí),則客戶(hù)只能去第一個(gè)窗口接受服務(wù))。