1. 程式人生 > >【 MATLAB 】通過案例學會編寫一個 matlab 函式(小貓掉進山洞問題)

【 MATLAB 】通過案例學會編寫一個 matlab 函式(小貓掉進山洞問題)

這是關於matlab學習的第一篇博文,我是不願意承認自己不會MATLAB的,因為這東西大一的時候就學過,如果白駒過隙,都不好意思說自己研幾了,科研的過程中MATLAB是必須要會的,於是得系統的看一下了。自己什麼**水平自己又不是不清楚。

問題提出:

一隻失明的小貓掉進山洞裡,山洞有三個門,其中一個門進去後走2h後可以回到地面,第二個門進去後走4h又回到原始出發點,第三個門進去後走6h還是回到原始出發點。貓是隨機選擇的,求小貓走出山洞的期望時間?

解題的思路如下:

設小貓走出山洞的期望時間為t,如果小貓不幸進了第二個或第三個門,那麼它過4h或6h後又和進門之前面臨的狀況一樣了,只不過這兩種不幸的情況發生的概率都是1/3。而萬幸一次性走出去的概率也是1/3。於是可以得到如下的方程:

t = 2 \times(1/3) + (t + 4) \times (1/3) + (t + 6) \times (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高效程式設計技巧與應用》