# 線性代數 {%hackmd @themes/orangeheart %} <style> .likecoin-button { position: relative; width: 100%; max-width: 485px; max-height: 240px; margin: 0 auto; } .likecoin-button > div { padding-top: 49.48454%; } .likecoin-button > iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } </style> ###### tags: `Numerical Methods` 對於數值分析領域的研究者來說,線性代數是一個非常好的工具。它不僅可以協助我們將繁雜的數學式進行化簡(例如方程組轉換成矩陣的形式,並利用 Cramer's Rule 求解),同時也能夠利用線性代數的各種性質推廣數值分析上重要的內涵。 ## `Symbolics`套件與變數設定 在安裝完套件後,我們可以先對符號進行定義,也就是將其令為**變數(variables)**。 ```julia using Symbolics @variables a b c d e f g h i j k l m n; ``` 不過,為什麼要進行上面的步驟呢?我們來做個實驗,如果在 kernel 上面打上 `p` 會出現什麼呢? ```julia UndefVarError: p not defined Stacktrace: [1] top-level scope @ :0 [2] eval @ .\boot.jl:373 [inlined] [3] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String) @ Base .\loading.jl:1196 ``` 很明顯的,因為我們還未定義 `p` 在這個程式裡面的意義,因此 $\texttt{Julia}$ 不會知道這個 `p` 是一個變數。設定完成之後,我們可以隨意打上我們剛剛設定的那些符號,它就會顯示為數學符號(也就是 $\LaTeX$)的形式了。 ```julia a ``` 它就會跑出 $$ a $$ ## 向量(vector) 給定兩個欄向量(column vector) $M_1$ 與 $N_1$, ```julia a = [m₁; m₂; m₃] b = [n₁; n₂; n₃] a |> display b |> display ``` $$ a = \begin{bmatrix} m_1\\m_2\\m_3 \end{bmatrix}, \qquad b = \begin{bmatrix} n_1\\n_2\\n_3 \end{bmatrix} $$ ### 內積(inner product) 若將兩向量進行內積,就會得到一個純量,即 ```julia a' * b |> display ``` $$ a \cdot b = \begin{bmatrix} m_1&m_2&m_3 \end{bmatrix} \begin{bmatrix} n_1\\n_2\\n_3 \end{bmatrix} = m_1n_1 + m_2n_2 + m_3n_3 $$ 上述的結果也可以透過逐元的方式計算: ```julia sum(m1 .* n1) |> display ``` ### 正交(orthogonal) 如果說兩個向量的內積為 $0$,則我們說這兩個向量相互垂直(orthogonal),或稱為正交的。 ```julia u = [3; 2; 1] v = [-2; 3; 0] u'v |> display ## 0 ``` ![](https://i.imgur.com/N1KIqLI.png) ### 範數(norm) 而向量的範數是一個計算向量長度的方式,其計算方式為 $$ \|m\| = \sqrt{M'M}\\ $$ ```julia m1_norm = sqrt(m1' * m1) ``` 會得到 $$ \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} $$ 若其長度為 $1$,則我們稱該向量為標準化向量。 ```julia m1_normalized = m1 ./ m1_norm m1_normalized_norm = sqrt(m1_normalized' * m1_normalized) m1_normalized |> display m1_normalized_norm |> display ``` 會得到標準化過後的向量為 $$ \begin{bmatrix} \frac{m{_1}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\ \frac{m{_2}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\ \frac{m{_3}}{\sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}} \\ \end{bmatrix} $$ 其長度為 $$ \sqrt{\frac{m{_1}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}} + \frac{m{_2}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}} + \frac{m{_3}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}}} $$ 經過化簡可得其長度為 $1$ ```julia simplify.(expand.(m1_normalized_norm)) ``` $$ \sqrt{\frac{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}}{\left( \sqrt{m{_1}^{2} + m{_2}^{2} + m{_3}^{2}} \right)^{2}}} = 1 $$ 而在計量經濟學中,我們最常使用的性質是**標準正交(orthonormal)**:若兩個向量相互垂直且均經過標準化,則稱這兩個向量具有標準正交的性質。 ### 外積(outer product) 若將兩向量進行外積,就會得到一個張量(tensor),即 ```julia a * b' |> display ``` $$ a \times b' = \begin{bmatrix} m_1\\m_2\\m_3 \end{bmatrix} \begin{bmatrix} n_1 & n_2 & n_3 \end{bmatrix}= \begin{bmatrix} m_{1} n_{1} & m_{1} n_{2} & m_{1} n_{3} \\ m_{2} n_{1} & m_{2} n_{2} & m_{2} n_{3} \\ m_{3} n_{1} & m_{3} n_{2} & m_{3} n_{3} \end{bmatrix} $$ ## 矩陣(matrix) 根據維基百科的定義,數學上,一個${m\times n}$的矩陣是一個由$m$列(row)$n$行(column)元素排列成的矩形陣列,如果用英文表達,就是一個 $m$ by $n$ 的矩陣。矩陣裡的元素可以是數字、符號或數學式。[^1]我們來看看下面的例子: ```julia ## 2 x 2 的矩陣 A = [a b; c d] ## 2 x 3 的矩陣 B = [a b c d e f] ## 3 x 2 的矩陣 C = [a b; c d; e f] A |> display B |> display C |> display ``` 它便會顯示 $$ \begin{bmatrix} a & b \\ c & d \\ \end{bmatrix}\\ \begin{bmatrix} a & b & c\\ d & e & f \end{bmatrix}\\ \begin{bmatrix} a & b \\ c & d \\ e & f \end{bmatrix} $$ ### 矩陣的符號表示 我們會以大寫(或粗體)的字母表示矩陣,例如 $\mathbf{A}$;利用小寫的字母代表矩陣內的元素,例如 $a$。注意到,在矩陣中為了清楚定義是哪一個元素,我們會利用以下的方式進行註記。 $$ \mathbf{A}_{i,j} $$ 其中下標(subscript) $i$ 代表行,$j$ 代表列。如果我們要找到上面設定的矩陣 $\mathbf{B}$ 中第二列第三個元素,也就是 $f$,要怎麼輸入呢? ```julia @show B[2, 3] ``` 顯示 $$ f $$ ### 矩陣的四則運算 如果我們要將兩個矩陣進行相加,我們可寫成: ```julia [a b c d] + [e f g h] ``` 其計算結果很直觀地可以猜想到是 $$ \begin{bmatrix} a + e & b + f\\ c + g & d + h \end{bmatrix} $$ 而有趣地是,在 $\texttt{Julia}$ 中,我們可以將兩個不同維度(dimension)的矩陣進行相加總,不過必須利用**逐元(element-wise)**的方式進行運算。[^2]例如 ```julia [a b c d] .+ [e g] ``` 結果會是 $$ \begin{bmatrix} a + e & b + e \\ c + g & d + g \\ \end{bmatrix} $$ 接著我們來看一下乘積。首先定義兩個矩陣,$\mathbf{A}_1$ 與 $\mathbf{A}_2$。 ```julia A1 = [a b; c d] A2 = [e f; g h] ``` 如果我們要計算兩個矩陣相乘,即 $\mathbf{A}_1 \cdot \mathbf{A}_2$;或是在矩陣前方乘上一個純量(scalar),也就是 $c \cdot \mathbf{A}_1$,我們可以這麼做: ```julia A12 = A1 * A2 # 兩個矩陣相乘 A3 = 3 * A1 # 純量乘上矩陣 ``` 結果就是 $$ \mathbf{A}_1 \cdot \mathbf{A}_2 = \begin{bmatrix} a e + b g & a f + b h \\ c e + d g & c f + d h \\ \end{bmatrix}\\ 3 \cdot \mathbf{A}_1 = \begin{bmatrix} 3 a & 3 b \\ 3 c & 3 d \\ \end{bmatrix}\\ $$ 同樣地,我們也可以運用 $\texttt{Julia}$ 中逐元的性質對矩陣進行乘積。例如 ```julia A3 = A1 .* A2 # 進行逐元乘積 ``` 則 $\mathbf{A}_3$ 會等於 $$ \begin{bmatrix} a e & b f \\ c g & d h \\ \end{bmatrix} $$ 注意到,如果我們對 $\mathbf{A}_1$ 與 $\mathbf{A}_2$ 的乘積進行交換,其結果在數學上與在 $\texttt{Julia}$ 上均是不成立的,這部分就留給讀者自行證明。 ```julia A21 = A2 * A1 ``` 會得到 $$ \mathbf{A}_2 \cdot \mathbf{A}_1 = \begin{bmatrix} a e + c f & b e + d f \\ a g + c h & b g + d h \\ \end{bmatrix} $$ 值得一提的是,給定兩個矩陣,其中 $\mathbf{X}_1$ 為一個 $p \times q$ 的矩陣,$\mathbf{X}_2$ 則是一個 $s \times t$ 的矩陣。而只有在 $q = s$時,兩個矩陣才能進行乘積,並得到一個新的矩陣 $\mathbf{X}_3$,且為一 $p \times t$ 的矩陣。 ### 行列式 行列式(determinant),記作 $\det(\mathbf{A})$ 或 $|\mathbf{A}|$,是一個在方陣上計算得到的純量。[^3]如果要進行計算的話,首先要引入套件 `LinearAlgebra`,接著利用指令 `det()` 計算行列式。 ```julia using LinearAlgebra A |> display @show det(A) ``` 結果會是 $$ \begin{bmatrix} a & b \\ c & d \\ \end{bmatrix}\\ \texttt{det}(\mathbf{A}) = ad - bc $$ 如果考慮以下矩陣 $\mathbf{D}$ $$ \begin{bmatrix} a & b & c \\ d & e & f \\ g & h & i \\ \end{bmatrix} $$ 則其行列式為 $$ \texttt{det}(\mathbf{D}) = c \left( d h - e g \right) + a \left( e i - f h \right) - b \left( d i - f g \right) $$ 其實到了高維的矩陣,可以看到行列式的計算變得複雜,因此我們可以利用 `expand.()` 的指令,將計算過程展開,了解其背後的運作、計算過程與原理。 ```julia @show expand.(det(D)) ## b*f*g + a*e*i + c*d*h - b*d*i - c*e*g - a*f*h ``` 有關乘法,我們要注意一件事:$\mathbf{AB = AC}$ 並不隱含 $\mathbf{B = C}$。 ```julia a1 = [1 2; 2 4] b1 = [2 1; 1 3] c1 = [4 3; 0 2] @show a1 * b1 @show a1 * c1 ## a1 * b1 = [4 7; 8 14] ## a1 * c1 = [4 7; 8 14] ``` 另外給定 $\mathbf{A}$、$\mathbf{B}$ 與 $\mathbf{C}$ 三個矩陣,如果 $\mathbf{A}(\mathbf{BC}) = (\mathbf{AB})\mathbf{C}$,那麼我們就稱其符合結合律。 ```julia A*(B*C) |> display (A*B)*C |> display ``` 輸出的結果如下: $$ \begin{bmatrix} a \left( a^{2} + b c + c e \right) + b \left( a d + c e + e f \right) & a \left( a b + b d + c f \right) + b \left( b d + d e + f^{2} \right) \\ c \left( a^{2} + b c + c e \right) + d \left( a d + c e + e f \right) & c \left( a b + b d + c f \right) + d \left( b d + d e + f^{2} \right) \\ \end{bmatrix}\\ \begin{bmatrix} a \left( a^{2} + b d \right) + c \left( a b + b e \right) + e \left( a c + b f \right) & b \left( a^{2} + b d \right) + d \left( a b + b e \right) + f \left( a c + b f \right) \\ a \left( a c + d^{2} \right) + c \left( b c + d e \right) + e \left( c^{2} + d f \right) & b \left( a c + d^{2} \right) + d \left( b c + d e \right) + f \left( c^{2} + d f \right) \\ \end{bmatrix} $$ 但基本上由上面的結果我們很難看出兩者到底是不是相同的,因此我們可利用 `simplify.()` 的指令,配合上面使用過的 `expand.()`,將其進行展開後化簡成最易讀的形式。 ```julia simplify.(expand.(A*(B*C))) |> display simplify.(expand.((A*B)*C)) |> display ``` $$ \begin{bmatrix} a^{3} + a b \left( c + d \right) + b e f + c e \left( a + b \right) & b \left( a^{2} + f^{2} \right) + b^{2} d + a b d + b d e + a c f \\ d^{2} a + a^{2} c + c^{2} \left( b + e \right) + c d e + d e f & c^{2} f + d^{2} \left( b + e \right) + f^{2} d + a b c + b c d \\ \end{bmatrix}\\ \begin{bmatrix} a^{3} + a b \left( c + d \right) + b e f + c e \left( a + b \right) & b \left( a^{2} + f^{2} \right) + b^{2} d + a b d + b d e + a c f \\ d^{2} a + a^{2} c + c^{2} \left( b + e \right) + c d e + d e f & c^{2} f + d^{2} \left( b + e \right) + f^{2} d + a b c + b c d \\ \end{bmatrix} $$ ### 單位矩陣(identity matrix) 單位矩陣就是一個 $n \times n$ 的方陣,其主對角線(main diagonal)上的元素均為 $1$,其餘元素為 $0$。以一個 $4 \times 4$ 的單位矩陣 $\mathbf{I}_4$ 為例,其可寫作 $$ \begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix} $$ 注意到,如果我們將單位矩陣與其他矩陣相乘,其是具有交換律的,且結果會等於被乘矩陣,即 $\mathbf{AI = A = IA}$。 ```julia Imat = [1 0; 0 1] A * Imat |> display Imat * A |> display ``` $$ \begin{bmatrix} a & b\\ c & d \end{bmatrix}\\ \begin{bmatrix} a & b\\ c & d \end{bmatrix} $$ ### 對角矩陣(diagonal matrix) 若一個矩陣主對角線之外的元素皆為 $0$,那麼我們就稱其為對角矩陣。例如 ```julia d = [a 0 0; 0 b 0; 0 0 c] ``` $$ \begin{bmatrix} a & 0 & 0\\ 0 & b & 0\\ 0 & 0 & c \end{bmatrix} $$ 如果兩個對角矩陣相乘,其結果也會是一個對角矩陣。 ```julia D1 = [1 0 0; 0 2 0; 0 0 3] D2 = [4 0 0; 0 5 0; 0 0 6] D1D2 = D1 * D2 D1 |> display D2 |> display D1D2 |> display ``` 結果會是 $$ \begin{bmatrix} 4 & 0 & 0\\ 0 & 10 & 0\\ 0 & 0 & 18 \end{bmatrix} $$ ### 三角矩陣(triangular matrix) 其分為上三角與下三角矩陣,前者的對角線左下方元素為 $0$,後者則是對角線右上方元素為 $0$。 ```julia UT = [a b c; 0 d e; 0 0 f] LT = [a 0 0; b c 0; d e f] UT |> display LT |> display ``` 得到上三角矩陣 $$ \begin{bmatrix} a & b & c\\ 0 & d & e\\ 0 & 0 & f \end{bmatrix} $$ 與下三角矩陣 $$ \begin{bmatrix} a & 0 & 0\\ b & c & 0\\ d & e & f \end{bmatrix} $$ 同樣地,我們將三角矩陣相乘的結果仍會是三角矩陣。 ```julia UT * UT |> display ``` $$ \begin{bmatrix} a^{2} & a b + b d & a c + b e + c f \\ 0 & d^{2} & d e + e f \\ 0 & 0 & f^{2} \\ \end{bmatrix} $$ ### 轉置矩陣(transpose of matrix) 簡單來說,轉置矩陣就是將行、列進行交換。下面定義 $\mathbf{M}$ 與 $\mathbf{N}$ 兩個矩陣,並對 $\mathbf{M}$ 取轉置矩陣,在數學上我們記做 $\mathbf{M}^{\top}$ 或 $\mathbf{M}'$。 ```julia @variables m₁₁ m₁₂ m₁₃ m₂₁ m₂₂ m₂₃ m₁ m₂ m₃ M = [ m₁₁ m₁₂ m₁₃ m₂₁ m₂₂ m₂₃ ] @variables n₁₁ n₁₂ n₁₃ n₂₁ n₂₂ n₂₃ n₃₁ n₃₂ n₁ n₂ n₃ N = [ n₁₁ n₁₂ n₂₁ n₂₂ n₃₁ n₃₂ ] M |> display M' |> display ``` $$ \begin{bmatrix} m{_{11}} & m{_{12}} & m{_{13}} \\ m{_{21}} & m{_{22}} & m{_{23}} \\ \end{bmatrix}\\ \begin{bmatrix} m{_{11}} & m{_{21}} \\ m{_{12}} & m{_{22}} \\ m{_{13}} & m{_{23}} \\ \end{bmatrix} $$ 而轉置矩陣有下列的性質。如果將矩陣進行轉置,再對其進行一次轉置,我們會得到原本的矩陣: $$ (\mathbf{M}')' = \mathbf{M} $$ 如果我們將兩個矩陣相加再轉置,可以寫成兩個矩陣先進行轉置後再進行相加 $$ (\mathbf{M} + \mathbf{N})' = \mathbf{M}' + \mathbf{N}' $$ 而兩個矩陣先進行相乘再轉至,其結果為 $$ (\mathbf{MN})' = \mathbf{N}'\mathbf{M}' $$ 道理很簡單,我們令 $\mathbf{M}$ 為一個 $m \times n$ 的矩陣,$\mathbf{N}$ 為一個 $n \times m$ 的矩陣,兩者相乘的結果會是 $m \times m$ 的結果。而如果將 $\mathbf{M}$ 轉置,會得到一個 $n \times m$ 的矩陣,將$\mathbf{N}$ 進行轉置則會得到一個 $m \times n$ 的矩陣,故若為 $\mathbf{M}'\mathbf{N}'$,其結果會是一個 $n \times n$ 的矩陣;如果是 $\mathbf{N}'\mathbf{M}'$,則會是 $m \times m$ 的矩陣。 ```julia (M*N)' |> display N'M' |> display M'N' |> display ``` $$ \begin{bmatrix} m{_{11}} n{_{11}} + m{_{12}} n{_{21}} + m{_{13}} n{_{31}} & m{_{21}} n{_{11}} + m{_{22}} n{_{21}} + m{_{23}} n{_{31}} \\ m{_{11}} n{_{12}} + m{_{12}} n{_{22}} + m{_{13}} n{_{32}} & m{_{21}} n{_{12}} + m{_{22}} n{_{22}} + m{_{23}} n{_{32}} \\ \end{bmatrix}\\ \begin{bmatrix} m{_{11}} n{_{11}} + m{_{12}} n{_{21}} + m{_{13}} n{_{31}} & m{_{21}} n{_{11}} + m{_{22}} n{_{21}} + m{_{23}} n{_{31}} \\ m{_{11}} n{_{12}} + m{_{12}} n{_{22}} + m{_{13}} n{_{32}} & m{_{21}} n{_{12}} + m{_{22}} n{_{22}} + m{_{23}} n{_{32}} \\ \end{bmatrix}\\ \begin{bmatrix} m{_{11}} n{_{11}} + m{_{21}} n{_{12}} & m{_{11}} n{_{21}} + m{_{21}} n{_{22}} & m{_{11}} n{_{31}} + m{_{21}} n{_{32}} \\ m{_{12}} n{_{11}} + m{_{22}} n{_{12}} & m{_{12}} n{_{21}} + m{_{22}} n{_{22}} & m{_{12}} n{_{31}} + m{_{22}} n{_{32}} \\ m{_{13}} n{_{11}} + m{_{23}} n{_{12}} & m{_{13}} n{_{21}} + m{_{23}} n{_{22}} & m{_{13}} n{_{31}} + m{_{23}} n{_{32}} \\ \end{bmatrix} $$ ### 對稱矩陣與反對稱矩陣 若一個矩陣之轉置矩陣仍是其自己本身,那麼其便符合對稱矩陣的性質,即 $A' = A$。 ```julia S = [a b c; b d e; c e f] S |> display S' |> display ``` $$ \begin{bmatrix} a & b & c \\ b & d & e \\ c & e & f \\ \end{bmatrix}\\ \begin{bmatrix} a & b & c \\ b & d & e \\ c & e & f \\ \end{bmatrix} $$ 而反對稱矩陣則是其轉置矩陣與自身的加法反元素相等,即 $$ \mathbf{A}' = -\mathbf{A} $$ ```julia SS = [0 b c; -b 0 e; -c -e 0] SS |> display SS' |> display ``` $$ \begin{bmatrix} 0 & b & c \\ -b & 0 & e \\ -c & -e & 0 \\ \end{bmatrix}\\ \begin{bmatrix} 0 & -b & -c \\ b & 0 & -e \\ c & e & 0 \\ \end{bmatrix} $$ 注意到,如果一個矩陣的轉置矩陣乘上該矩陣,結果會是一個對稱矩陣,即 $$ \mathbf{A}'\mathbf{A} $$ ```julia A' * A |> display B' * B |> display ``` $$ \begin{bmatrix} a^{2} + c^{2} & a b + c d \\ a b + c d & b^{2} + d^{2} \\ \end{bmatrix}\\ \begin{bmatrix} a^{2} + d^{2} & a b + d e & a c + d f \\ a b + d e & b^{2} + e^{2} & b c + e f \\ a c + d f & b c + e f & c^{2} + f^{2} \\ \end{bmatrix} $$ ### 反矩陣(inverse matrix) 給定一個 $n$ 階方陣 $\mathbf{A}$,若存在一 $n$ 階方陣 $\mathbf {B}$,使得 $\mathbf{AB}=\mathbf{BA}=\mathbf{I}_n$,其中 $\mathbf{I}_n$ 為 $n$ 階單位矩陣,則稱 $\mathbf{A}$ 是可逆的,且 $\mathbf {B}$ 是 $\mathbf{A}$ 的逆矩陣,記作 $\mathbf {A} ^{-1}$。但並非所有矩陣都可以取反矩陣,如果其行列式等於 $0$時,便不能取反矩陣。原因是因為如果矩陣 $\mathbf{A}$ 可逆,則 $\mathbf{A}^{-1} = \frac{\operatorname{adj}(A)}{\det(A)}$,其中 $\operatorname{adj}(A)$ 為矩陣 $\mathbf{A}$ 的伴隨矩陣(adjugate matrix),故若行列式的值為 $0$,此等式就會無意義。根據上述性質,可得出以下小結論:若矩陣 $\mathbf{A}$ 可逆,則 $$ \mathbf{A}\mathbf{A}^{-1} = \mathbf{I} = \mathbf{A}^{-1}\mathbf{A} $$ ```julia A * inv(A) ``` 得到 $$ \begin{bmatrix} 1 & 0 \\ \frac{c \left( true + \frac{b \frac{c}{a}}{d + \frac{ - b c}{a}} \right)}{a} + \frac{ - d \frac{c}{a}}{d + \frac{ - b c}{a}} & \frac{d}{d + \frac{ - b c}{a}} + \frac{ - c \frac{b}{d + \frac{ - b c}{a}}}{a} \\ \end{bmatrix} $$ 經過化簡可以得到 ```julia simplify.(expand.(A * inv(A))) |> display simplify.(expand.(inv(A) * A)) |> display ``` 兩者結果均是 $$ \mathbf{I} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ \end{bmatrix} $$ 而反矩陣有以下性質: $$ \begin{aligned} (\mathbf{AB})^{-1} = \mathbf{B}^{-1}\mathbf{A}^{-1}\\ (\mathbf{A}^{\top})^{-1} = (\mathbf{A}^{-1})^{\top} \end{aligned} $$ ```julia simplify.(expand.(inv(A'))) |> display simplify.(expand.(inv(A)')) |> display ``` 輸出結果均為 $$ \begin{bmatrix} \frac{d}{a d - b c} & \frac{ - c}{a d - b c} \\ \frac{ - b}{a d - b c} & \frac{a}{a d - b c} \\ \end{bmatrix} $$ 那我們要怎麼手刻反矩陣呢?根據上面的定義, $$ \mathbf{A}\mathbf{A}^{-1} = \mathbf{I} $$ 其實可以把反矩陣令為一個未知矩陣 $\mathbf{X}$,因此可以寫成 $$ \mathbf{A}\mathbf{X}=\mathbf{I} $$ 而利用反斜線(backslash)的運算符,我們可以計算出反矩陣,即 ```julia X = A\I ``` 結果會是 $$ \begin{bmatrix} \frac{1 + \frac{b \frac{c}{a}}{d + \frac{ - b c}{a}}}{a} & \frac{ - \frac{b}{d + \frac{ - b c}{a}}}{a} \\ \frac{ - \frac{c}{a}}{d + \frac{ - b c}{a}} & \frac{1}{d + \frac{ - b c}{a}} \\ \end{bmatrix} $$ 經過化簡與檢查,確定該算法可得出反矩陣: ```julia simplify.(expand.(inv(A))) |> display simplify.(expand.(A \ I_mat)) |> display ``` $$ \begin{bmatrix} \frac{d}{a d - b c} & \frac{ - b}{a d - b c} \\ \frac{ - c}{a d - b c} & \frac{a}{a d - b c} \\ \end{bmatrix} $$ [^1]:參考自[維基百科──矩陣](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5) [^2]:注意到在數學上這件事是不成立的。 [^3]:參考自[維基百科──行列式](https://zh.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E5%BC%8F) <div class="likecoin-embed likecoin-button"> <div></div> <iframe scrolling="no" frameborder="0" src="https://button.like.co/in/embed/xiaolong70701/button?referrer=hackmd.io"></iframe> </div>