【 MATLAB 】通過案例學會編寫一個 matlab 函式(小貓掉進山洞問題)
這是關於matlab學習的第一篇博文,我是不願意承認自己不會MATLAB的,因為這東西大一的時候就學過,如果白駒過隙,都不好意思說自己研幾了,科研的過程中MATLAB是必須要會的,於是得系統的看一下了。自己什麼**水平自己又不是不清楚。
問題提出:
一隻失明的小貓掉進山洞裡,山洞有三個門,其中一個門進去後走2h後可以回到地面,第二個門進去後走4h又回到原始出發點,第三個門進去後走6h還是回到原始出發點。貓是隨機選擇的,求小貓走出山洞的期望時間?
解題的思路如下:
設小貓走出山洞的期望時間為t,如果小貓不幸進了第二個或第三個門,那麼它過4h或6h後又和進門之前面臨的狀況一樣了,只不過這兩種不幸的情況發生的概率都是1/3。而萬幸一次性走出去的概率也是1/3。於是可以得到如下的方程:
解得: t = 12。
驗證結果的正確性:
下面使用MATLAB編寫模擬小貓 n 次出洞時間的函式,該函式返回的結果T為n次出洞時間組成的陣列,程式碼如下:
function T = cat_in_holl(n) T = zeros(1,n); for k = 1:n c = unidrnd(3,1); while c ~= 1 if c == 2 T(k) = T(k) + 4; else T(k) = T(k) + 6; end c = unidrnd(3,1); end T(k) = T(k) + 2; end
在MATLAB命令視窗輸入edit命令,進入編輯器,將上述程式碼貼上進去,儲存檔案為 cat_in_holl.m檔案,並使之在MATLAB搜尋路徑上,之後在命令視窗輸入: Z = cat_in_holl(10000);來觀察模擬小貓 10 000次出洞的時間。
之後執行mean(Z)就可以觀察平均時間,隨著n的增大,mean(Z)也就越來越接近期望值12。
如下:
mean(Z)
ans =
11.8698
>> Z = cat_in_holl_function(100000); >> mean(Z)
ans =
12.0135
其實,說到這裡,單純這個問題已經解決了,可是我的目的並非僅有這些,重點在於對於程式的理解,上述程式沒有一個註釋,當然不好理解,下面來解釋這個程式:
上述程式是一個函式,程式的第一行是函式的宣告,函式體必須另起一行開始寫。
第一行:function 是函式宣告符,其後定義了函式的輸出變數T,函式名cat_in_holl,以及輸入變數n。
下面進入函式體部分,T = zeros(1,n);表示生成一個一行n列的全零行向量,這步主要就是預分配記憶體,因為最後得到的T是n次小貓出洞的時間組成的一個數組,陣列長度事先已知。給T預分配記憶體是基本的MATLAB高效程式設計準則之一。
接下來是一個for迴圈體(k從1迴圈到n),for迴圈體內部還有一個while迴圈體(當c不等於1時,執行while迴圈體內部的程式碼),while迴圈體內還有一個if——else選擇分支結構。這些迴圈以及選擇分支的意義和其他語言都類似,不同的就是格式,每一個迴圈體或者選擇分支結構結束時,以end結尾。
unidrnd是MATLAB自帶的函式,unidrnd(3,1)表示在1,2,3中等概率的生成一個數字。
在命令視窗輸入
help unidrnd
得到如下介紹:
unidrnd - Discrete uniform random numbers
This MATLAB function generates random numbers for the discrete uniform distribution with maximum N.
R = unidrnd(N) R = unidrnd(N,m,n,...) R = unidrnd(N,[m,n,...])
其他的都很好理解,這篇博文到此為止。本文參考資料為:《MATLAB高效程式設計技巧與應用》