Matlab 教材:邏輯算子

四則運算 (加減乘除) 這種最基本的計算有對應符號,亦即 + - * /, 這種符號學名是「算子」operator (子要唸三聲)。 Matlab 還有次方、轉置 (同時也是共軛) 算子,分別是 ^' 。 這裡我們再添一批:邏輯算子。 就是「問」某種數值的關係「是否」成立的意思。

譬如我們要問 23 是否等於 2*2*2?

2^3 == 2*2*2
其中 == 就是一種邏輯算子,它是問「是否相等」的意思。 計算的結果,如果「是」,答案是 1;如果「否」,答案是 0。 同理,也可以問 23 與 2*2*2 「是否不相等」:
2^3 ~= 2*2*2

有沒有人知道 $e^\pi$ 比較大還是 $\pi^e$ 比較大?問 Matlab:

exp(pi) > pi^exp(1)
(注意這個指令的寫法) 答案是 1,也就是 $e^\pi$ 比較大。 很直覺地,> 就是問「是否大於」的算子。 不大於就是小於或等於嘛,因此相反地問題就是
exp(pi) <= pi^exp(1)
這裡 <= 就是問「是否小於或等於」的算子。

類似地,< 就是問「是否小於」, 而 >= 就是問「是否大於或等於」。

此外還有標準的 AND 和 OR 邏輯算子。 AND 是 & 而 OR 是 |。 例如,如果您喜歡「窗前有兩棵樹,一棵是柳樹,另一棵也是柳樹」這種修辭, 那麼您可能也會喜歡用

(exp(pi) < pi^exp(1)) | (exp(pi) == pi^exp(1))
來代替 exp(pi) <= pi^exp(1)

數學中常寫的 $x\in [a,b]$ 意思就是 $a\leq x\leq b$,用 Matlab 語法不能寫成 a <= x <= b,而要寫成

(a <= x) & (x <= b)
同理,如果要詢問是否 $x\not\in [a,b]$ 就要問
(x < a) | (x > b)

獨立的 ~ 就是「非」的意思,如果一定要問「是否不大於」, 可以這樣說:

~(exp(pi) > pi^exp(1))
Matlab 先執行括號裡面的 exp(pi) > pi^exp(1) 得出來的結果再被 ~ 「逆轉」,也就是 1 變成 0、0 變成 1。

同理,如果要詢問是否 $x\not\in [a,b]$ 也可以這麼問:

~( (a <= x) & (x <= b) )

因為浮點數的數值計算,有 不可避免的誤差, 因此要比較兩個浮點數是否相等,是很危險的動作。 譬如我們知道 sin(pi) 應該是 0,但是如果問

sin(pi) == 0
卻得到否定答案。原來 Matlab 計算的 sin(pi)
1.2246 * 10-16
它幾乎是零,可就差一點。差那一點,Matlab 就認為它倆不相等。

因為計算上不可避免的誤差,我們經常將差異極微的兩個浮點數視為相等。 至於要多「微小」的差異才可以忽略呢? 那是「數值分析」這門數學課題的主題之一了,我們不在此深入。 原則上,當我們要問兩個浮點數是否相等的時候, 都是改問「它們的差的絕對值是否夠小」?例如

abs(sin(pi)) <= 1e-15
1e-15 就是 10^(-15) 的意思,也就是 10-15

最後提醒您,在 Matlab 裡面,=指派==是否相等。別搞混了。

習題

  1. 問 Matlab 23 是否等於 e3 ln(2) 的指令是什麼? 嘗試解釋答案何以如此?該怎樣修改?
  2. 計算
    \begin{displaymath}
\Bigl\vert \bigl(1 + \frac1{2^4} + \frac1{3^4} + \cdots + \frac1{1000^4}\bigr)
- \frac{\pi^4}{90} \Bigr\vert\end{displaymath}

    (注意要算絕對值)
單維彰 (2003/04/15) --- [Prev] [Next] [Up]