Matlab 教材:for 和 if

在 [用 Matlab 熟悉變數置換] 裡面, 我們看過 Matlab 做級數計算,也學了運用 Matlab 來執行牛頓法求方程式的根。 現在我們更進一步,希望 Matlab 更加自動化地為我們做計算, 並且自己檢查計算的結果夠不夠好,如果夠好就停下來。

考慮等比級數

\begin{displaymath} 1+\frac1{2} +\frac1{2^2} +\frac1{2^3} +\cdots
\end{displaymath}

我們知道極限是 2。但是計算到第幾項的時候,它的部份和「幾乎」是 2 呢? 首先我們用 for 叫 Matlab 做 N 項計算, 然後我們預定一個「容忍誤差」err,如果部份和與 2 的距離到了容忍誤差之內, 就停下來。否則就會做到第 N 項才停下來。以下是我們的程式:
N = 100;
err = 5e-15;
x = 0;
for k=0:N, x = x + 1/2^k; if (abs(x-2) <= err), break; end, end
k

在我們解釋上述程式以前,先抱怨那個程式寫得太醜了。 既然 Matlab 不在乎折到下一列,也不在乎空格,我們可以把上述程式寫得「整齊」一點, 例如:

N = 100;
err = 5e-15;
x = 0;
for k=0:N,
    x = x + 1/2^k;
    if (abs(x-2) <= err),
        break;
    end
end
k
這種排列的技術叫做「縮排」(indentation)。 對 Matlab 來說,有沒有縮排是沒差的;但是對人來說,看起來應該是清爽多了。 我們可以看清楚,那兩個 end 分別對應的是 for 迴圈和 if 結構。 我們也看清楚,for 迴圈裡面一共有四句計算指令,但是 if 結構內只有一句計算指令 (那就是 break; )。

雖然「縮排」之後比較好看,但是為了在 Matlab 中修改方便, 最好還是輸入成一整列,這樣將來用向上的箭頭修改指令,比較簡單。 但是為了您閱讀的方便,我將會在線上教材中,以「整齊」的方式排版。

現在我們介紹 break。它的意思是:從 for 迴圈中脫逃。 不管 k 做完了沒有 (按照 for 的設計,k 應該要依序代入 1,然後 2,然後 3, 一直到代入 N 為止),反正強迫結束這個 for 迴圈。 在上述程式中,不管 for 迴圈是正常結束 (也就是 k 被代入了 N), 還是它被強迫提早結束,Matlab 都會執行 end 的下一句指令,也就是 disp([k,x])。 這時候,如果我們看到 k 和 N 是一樣的,就要懷疑 for 迴圈沒有被強迫結束, 那就意味著 x 和 2 之間的誤差,可能沒有達到我們設定的「容忍誤差」。 如果 k < N,那就表示 for 迴圈是被強迫結束的, 那就意味著 x 和 2 之間的誤差,已經不大於我們預設的「容忍誤差」了。

前述範例蠻有趣的,但是沒什麼實用性。因為我們已經知道答案是 2。 Matlab 得要為我們計算不預知答案的級數,那才有趣嘛。 但是現在我們只是練習基本語法而已,以後再講比較實用的招式。 別急,你會學到的。

但是,在我們解決更實用的問題之前,最好先學習一個很實用的操作技巧: 撰寫 Matlab 腳本程式。這就是下一節的主題。

習題
單維彰 (2003/04/20) --- 03/04/23 (單) [Prev] [Next] [Up]