In [1]:
# 巫術
%run magic.ipynb
assert 'np' in locals()
print("巫術準備完成")


巫術準備完成

In [4]:
A=Matrix([0, 2, 4],[2, 4, 2],[3,3,1])
A


Out[4]:
\begin{pmatrix}0&2&4\\ 2&4&2\\ 3&3&1\end{pmatrix}

In [8]:
A[2,0]


Out[8]:
$3$

In [9]:
b = Vector(2,3,1)
b


Out[9]:
\begin{pmatrix}2\\ 3\\ 1\end{pmatrix}

擴增矩陣 $S = (A|b)$


In [10]:
S = np.hstack([A,b])
S


Out[10]:
\begin{pmatrix}0&2&4&2\\ 2&4&2&3\\ 3&3&1&1\end{pmatrix}

In [17]:
show_equations(S)


Out[17]:
\[\left\{ \begin{array}{}&& &2 x_1&+&4 x_2&=&2\\ &2 x_0&+&4 x_1&+&2 x_2&=&3\\ &3 x_0&+&3 x_1&+&1 x_2&=&1\end{array}\right.\]

$i$, $j$ 兩列交換


In [11]:
def T(i,j):
    def op(M):
        R = M.copy()
        R[[i,j]]=R[[j,i]]
        return R
    return op
T(0,1)(S)


Out[11]:
\begin{pmatrix}2&4&2&3\\ 0&2&4&2\\ 3&3&1&1\end{pmatrix}

因為有巫術,可以寫成矩陣乘法 @ 的形式 不然括號太多不容易對齊


In [12]:
T(0,1) @ S


Out[12]:
\begin{pmatrix}2&4&2&3\\ 0&2&4&2\\ 3&3&1&1\end{pmatrix}

把第 $i$ 列乘上 $m$ 倍


In [15]:
def D(i, m):
    assert m!=0
    def op(M):
        R= M.copy()
        R[i] = m * R[i]
        return R
    return op
D(2, 1/5)(S)


Out[15]:
\begin{pmatrix}0&2&4&2\\ 2&4&2&3\\ \frac{3}{5}&\frac{3}{5}&\frac{1}{5}&\frac{1}{5}\end{pmatrix}

把第 $j$ 列乘上 $m$ 倍,加入第 $i$ 列


In [16]:
def L(i, j, m):
    def op(M):
        R = M.copy()
        R[i] = R[i] + m*R[j]
        return R
    return op
L(0, 1, 1)(S)


Out[16]:
\begin{pmatrix}2&6&6&5\\ 2&4&2&3\\ 3&3&1&1\end{pmatrix}

用基本列運算來化簡 $S$

再看一下 $S$


In [18]:
S


Out[18]:
\begin{pmatrix}0&2&4&2\\ 2&4&2&3\\ 3&3&1&1\end{pmatrix}

In [19]:
show_equations(S)


Out[19]:
\[\left\{ \begin{array}{}&& &2 x_1&+&4 x_2&=&2\\ &2 x_0&+&4 x_1&+&2 x_2&=&3\\ &3 x_0&+&3 x_1&+&1 x_2&=&1\end{array}\right.\]

先讓第二列首項變成 1


In [20]:
D(1, 1/2) @ S


Out[20]:
\begin{pmatrix}0&2&4&2\\ 1&2&1&\frac{3}{2}\\ 3&3&1&1\end{pmatrix}

然後消去第三列


In [21]:
L(2,1,-3) @ _


Out[21]:
\begin{pmatrix}0&2&4&2\\ 1&2&1&\frac{3}{2}\\ 0&-3&-2&\frac{-7}{2}\end{pmatrix}

最後再交換第二列和第一列,紀錄起來,叫做 S1


In [22]:
S1 = T(0,1) @ _
S1


Out[22]:
\begin{pmatrix}1&2&1&\frac{3}{2}\\ 0&2&4&2\\ 0&-3&-2&\frac{-7}{2}\end{pmatrix}

In [23]:
show_equations(S1)


Out[23]:
\[\left\{ \begin{array}{} &1 x_0&+&2 x_1&+&1 x_2&=&\frac{3}{2}\\ && &2 x_1&+&4 x_2&=&2\\ &&-&3 x_1&-&2 x_2&=&\frac{-7}{2}\end{array}\right.\]

再來處理第二行,一樣,把第二列的首項變成 $1$,然後去消第一列和第三列的第二行


In [24]:
D(1, 1/2) @ S1


Out[24]:
\begin{pmatrix}1&2&1&\frac{3}{2}\\ 0&1&2&1\\ 0&-3&-2&\frac{-7}{2}\end{pmatrix}

In [25]:
L(2,1,3) @ _


Out[25]:
\begin{pmatrix}1&2&1&\frac{3}{2}\\ 0&1&2&1\\ 0&0&4&\frac{-1}{2}\end{pmatrix}

In [26]:
L(0,1,-2) @ _


Out[26]:
\begin{pmatrix}1&0&-3&\frac{-1}{2}\\ 0&1&2&1\\ 0&0&4&\frac{-1}{2}\end{pmatrix}

In [27]:
S2 = _ # 用 S2 紀錄第二步驟

In [28]:
show_equations(S2)


Out[28]:
\[\left\{ \begin{array}{} &1 x_0&&&-&3 x_2&=&\frac{-1}{2}\\ && &1 x_1&+&2 x_2&=&1\\ &&&& &4 x_2&=&\frac{-1}{2}\end{array}\right.\]

In [29]:
S2


Out[29]:
\begin{pmatrix}1&0&-3&\frac{-1}{2}\\ 0&1&2&1\\ 0&0&4&\frac{-1}{2}\end{pmatrix}

最後處理第三行


In [30]:
D(2, 1/4) @ S2


Out[30]:
\begin{pmatrix}1&0&-3&\frac{-1}{2}\\ 0&1&2&1\\ 0&0&1&\frac{-1}{8}\end{pmatrix}

In [31]:
L(1,2, -2) @ _


Out[31]:
\begin{pmatrix}1&0&-3&\frac{-1}{2}\\ 0&1&0&\frac{5}{4}\\ 0&0&1&\frac{-1}{8}\end{pmatrix}

In [32]:
L(0,2,3) @ _


Out[32]:
\begin{pmatrix}1&0&0&\frac{-7}{8}\\ 0&1&0&\frac{5}{4}\\ 0&0&1&\frac{-1}{8}\end{pmatrix}

In [33]:
S3 = _  # 用 S3 紀錄第二步驟

In [34]:
show_equations(S3)


Out[34]:
\[\left\{ \begin{array}{} &1 x_0&&&&&=&\frac{-7}{8}\\ && &1 x_1&&&=&\frac{5}{4}\\ &&&& &1 x_2&=&\frac{-1}{8}\end{array}\right.\]

把最後一行取出來當成解 $x$


In [37]:
S3


Out[37]:
\begin{pmatrix}1&0&0&\frac{-7}{8}\\ 0&1&0&\frac{5}{4}\\ 0&0&1&\frac{-1}{8}\end{pmatrix}

In [46]:
Vector(S3[:,-1])


Out[46]:
\begin{pmatrix}\frac{-7}{8}\\ \frac{5}{4}\\ \frac{-1}{8}\end{pmatrix}

In [47]:
x  = Vector(S3[:, -1])
x


Out[47]:
\begin{pmatrix}\frac{-7}{8}\\ \frac{5}{4}\\ \frac{-1}{8}\end{pmatrix}

In [48]:
# 或者這樣也行
x = S3[:, [-1]]
x


Out[48]:
\begin{pmatrix}\frac{-7}{8}\\ \frac{5}{4}\\ \frac{-1}{8}\end{pmatrix}

代入原來方程式


In [49]:
A @ x


Out[49]:
\begin{pmatrix}2\\ 3\\ 1\end{pmatrix}

In [50]:
b


Out[50]:
\begin{pmatrix}2\\ 3\\ 1\end{pmatrix}

檢查是不是每一列都相等


In [51]:
A @ x  == b


Out[51]:
\begin{pmatrix}True\\ True\\ True\end{pmatrix}

In [53]:
np.all((A @ x  == b))


Out[53]:
True

In [59]:
np.any([False,False, False])


Out[59]:
False

練習

隨機生成的練習,試試看


In [103]:
def generate_A_b(n=4):
    while True:
        A = Matrix(np.random.randint(-10, 10, size=(n,n)))
        if True or np.linalg.matrix_rank(A)==n:
            x = Vector(np.random.randint(-5,5, size=n))
            x /= Vector(np.random.randint(1,5, size=n))
            b = A@x
            display(Latex("$A=$"), A)
            display(Latex("$b=$"), b)
            return A, b
A, b = generate_A_b() 
S = np.hstack([A,b])
show_equations(S)


$A=$
\begin{pmatrix}-1&-5&8&-9\\ -1&9&-7&8\\ 3&3&0&5\\ 7&-1&1&-10\end{pmatrix}
$b=$
\begin{pmatrix}\frac{185}{12}\\ \frac{-181}{12}\\ \frac{-21}{4}\\ \frac{349}{12}\end{pmatrix}
Out[103]:
\[\left\{ \begin{array}{}-&1 x_0&-&5 x_1&+&8 x_2&-&9 x_3&=&\frac{185}{12}\\ -&1 x_0&+&9 x_1&-&7 x_2&+&8 x_3&=&\frac{-181}{12}\\ &3 x_0&+&3 x_1&&&+&5 x_3&=&\frac{-21}{4}\\ &7 x_0&-&1 x_1&+&1 x_2&-&10 x_3&=&\frac{349}{12}\end{array}\right.\]

In [104]:
S


Out[104]:
\begin{pmatrix}-1&-5&8&-9&\frac{185}{12}\\ -1&9&-7&8&\frac{-181}{12}\\ 3&3&0&5&\frac{-21}{4}\\ 7&-1&1&-10&\frac{349}{12}\end{pmatrix}

In [105]:
D(0, -1/5) @ S


Out[105]:
\begin{pmatrix}\frac{1}{5}&1&\frac{-8}{5}&\frac{9}{5}&\frac{-37}{12}\\ -1&9&-7&8&\frac{-181}{12}\\ 3&3&0&5&\frac{-21}{4}\\ 7&-1&1&-10&\frac{349}{12}\end{pmatrix}

In [106]:
L(1, 0, -1) @ _


Out[106]:
\begin{pmatrix}\frac{1}{5}&1&\frac{-8}{5}&\frac{9}{5}&\frac{-37}{12}\\ \frac{-6}{5}&8&\frac{-27}{5}&\frac{31}{5}&-12\\ 3&3&0&5&\frac{-21}{4}\\ 7&-1&1&-10&\frac{349}{12}\end{pmatrix}

In [107]:
L(2, 0, 7) @ _


Out[107]:
\begin{pmatrix}\frac{1}{5}&1&\frac{-8}{5}&\frac{9}{5}&\frac{-37}{12}\\ \frac{-6}{5}&8&\frac{-27}{5}&\frac{31}{5}&-12\\ \frac{22}{5}&10&\frac{-56}{5}&\frac{88}{5}&\frac{-161}{6}\\ 7&-1&1&-10&\frac{349}{12}\end{pmatrix}

In [108]:
L(3, 0, -4) @ _


Out[108]:
\begin{pmatrix}\frac{1}{5}&1&\frac{-8}{5}&\frac{9}{5}&\frac{-37}{12}\\ \frac{-6}{5}&8&\frac{-27}{5}&\frac{31}{5}&-12\\ \frac{22}{5}&10&\frac{-56}{5}&\frac{88}{5}&\frac{-161}{6}\\ \frac{31}{5}&-5&\frac{37}{5}&\frac{-86}{5}&\frac{497}{12}\end{pmatrix}

In [109]:
S0 = _
S0


Out[109]:
\begin{pmatrix}\frac{1}{5}&1&\frac{-8}{5}&\frac{9}{5}&\frac{-37}{12}\\ \frac{-6}{5}&8&\frac{-27}{5}&\frac{31}{5}&-12\\ \frac{22}{5}&10&\frac{-56}{5}&\frac{88}{5}&\frac{-161}{6}\\ \frac{31}{5}&-5&\frac{37}{5}&\frac{-86}{5}&\frac{497}{12}\end{pmatrix}

In [110]:
S1 = L(3,1, 76/5) @ L(2, 1, -88/5) @ L(0, 1, -9/5) @ D(1, -5/59) @ S0
S1


Out[110]:
\begin{pmatrix}\frac{1}{59}&\frac{131}{59}&\frac{-143}{59}&\frac{162}{59}&\frac{-3479}{708}\\ \frac{6}{59}&\frac{-40}{59}&\frac{27}{59}&\frac{-31}{59}&\frac{60}{59}\\ \frac{154}{59}&\frac{1294}{59}&\frac{-1136}{59}&\frac{1584}{59}&\frac{-15835}{354}\\ \frac{457}{59}&\frac{-903}{59}&\frac{847}{59}&\frac{-1486}{59}&\frac{40267}{708}\end{pmatrix}

In [111]:
L(3, 2, -796/59) @ L(1, 2, -12/59) @ L(0, 2, 116/59) @ D(2, -59/1344) @ S1


Out[111]:
\begin{pmatrix}\frac{-5}{24}&\frac{55}{168}&\frac{-16}{21}&\frac{3}{7}&\frac{-2123}{2016}\\ \frac{1}{8}&\frac{-27}{56}&\frac{2}{7}&\frac{-2}{7}&\frac{415}{672}\\ \frac{-11}{96}&\frac{-647}{672}&\frac{71}{84}&\frac{-33}{28}&\frac{15835}{8064}\\ \frac{223}{24}&\frac{-389}{168}&\frac{62}{21}&\frac{-65}{7}&\frac{61249}{2016}\end{pmatrix}

In [112]:
S2 = _
S2


Out[112]:
\begin{pmatrix}\frac{-5}{24}&\frac{55}{168}&\frac{-16}{21}&\frac{3}{7}&\frac{-2123}{2016}\\ \frac{1}{8}&\frac{-27}{56}&\frac{2}{7}&\frac{-2}{7}&\frac{415}{672}\\ \frac{-11}{96}&\frac{-647}{672}&\frac{71}{84}&\frac{-33}{28}&\frac{15835}{8064}\\ \frac{223}{24}&\frac{-389}{168}&\frac{62}{21}&\frac{-65}{7}&\frac{61249}{2016}\end{pmatrix}

In [113]:
S3 = L(2,3,89/336)@L(1,3,17/28)@L(0,3, -73/84) @ D(3, -84/863) @ S2
S3


Out[113]:
\begin{pmatrix}\frac{997}{1726}&\frac{227}{1726}&\frac{-442}{863}&\frac{-308}{863}&\frac{31417}{20712}\\ \frac{-366}{863}&\frac{-298}{863}&\frac{96}{863}&\frac{227}{863}&\frac{-2033}{1726}\\ \frac{-2445}{6904}&\frac{-6235}{6904}&\frac{2655}{3452}&\frac{-1621}{1726}&\frac{32597}{27616}\\ \frac{-1561}{1726}&\frac{389}{1726}&\frac{-248}{863}&\frac{780}{863}&\frac{-61249}{20712}\end{pmatrix}

In [114]:
show_equations(S3)


Out[114]:
\[\left\{ \begin{array}{} &\frac{997}{1726} x_0&+&\frac{227}{1726} x_1&-&\frac{442}{863} x_2&-&\frac{308}{863} x_3&=&\frac{31417}{20712}\\ -&\frac{366}{863} x_0&-&\frac{298}{863} x_1&+&\frac{96}{863} x_2&+&\frac{227}{863} x_3&=&\frac{-2033}{1726}\\ -&\frac{2445}{6904} x_0&-&\frac{6235}{6904} x_1&+&\frac{2655}{3452} x_2&-&\frac{1621}{1726} x_3&=&\frac{32597}{27616}\\ -&\frac{1561}{1726} x_0&+&\frac{389}{1726} x_1&-&\frac{248}{863} x_2&+&\frac{780}{863} x_3&=&\frac{-61249}{20712}\end{array}\right.\]

In [115]:
x = S3[:, [-1]]
x


Out[115]:
\begin{pmatrix}\frac{31417}{20712}\\ \frac{-2033}{1726}\\ \frac{32597}{27616}\\ \frac{-61249}{20712}\end{pmatrix}

In [116]:
# 檢查答案
check_answer(A @ x == b)


Try again
Out[116]:
\begin{pmatrix}False\\ False\\ False\\ False\end{pmatrix}

In [ ]: