光的世界︰派生科學計算四

詩經‧國風‧豳風‧伐柯

伐柯如何?匪斧不克。

取妻如何?匪媒不得。

伐柯伐柯,其則不遠。

我覯之子,籩豆有踐。

 

伐『柯』柯即是製作斧柄,卻是非斧不行??將之比作娶『妻』

※《説文解字》: 柯,斧柄也。从木,可聲。

實在費疑猜??若思善用『工具』能夠創造更好的『工具』,那麼『伐柯伐柯,其則不遠。』果真『有理有則』的乎!?因此假借 SymPy 『符號矩陣』學習『矩陣』,也是『順理而行』的了?!

這裡僅以『基本矩陣』之法,求解一般 2x2 矩陣之『反矩陣』M 為例,演義這則『伐柯取妻』有趣之事︰

if

E \cdot M = (E_n \cdot \cdots E_2 \cdot E_1)  \cdot M = I

then

E = M^{-1}

M = {E_1}^{-1} \cdot {E_2}^{-1} \cdot \cdots {E_n}^{-1} = E^{-1}

 

望可消消暑氣也!!??

pi@raspberrypi:~ $ ipython3
Python 3.4.2 (default, Oct 19 2014, 13:31:11) 
Type "copyright", "credits" or "license" for more information.

IPython 2.3.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from sympy import *

In [2]: init_printing()

In [3]: a11, a12, a21,a22 = symbols('a11, a12, a21,a22')

# 一般 2x2 矩陣 M
⎡a₁₁ a₁₂⎤
⎢       ⎥
⎣a₂₁ a₂₂⎦
In [4]: M = Matrix([[a11, a12], [a21,a22]])

# 試以『基本矩陣』求解其『反矩陣』
# 消去 a21
In [5]: E1 = Matrix([[1, 0], [-a21, a11]])

In [6]: E1
Out[6]: 
⎡ 1     0 ⎤
⎢         ⎥
⎣-a₂₁  a₁₁⎦

In [7]: E1 * M
Out[7]: 
⎡a₁₁         a₁₂       ⎤
⎢                      ⎥
⎣ 0   a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

# 消去 a12
In [8]: E2 = Matrix([[a11*a22 - a12*a21, -a12], [0, 1]])

In [9]: E2
Out[9]: 
⎡a₁₁⋅a₂₂ - a₁₂⋅a₂₁  -a₁₂⎤
⎢                       ⎥
⎣        0           1  ⎦

In [10]: E2 * E1 * M
Out[10]: 
⎡   2                                     ⎤
⎢a₁₁ ⋅a₂₂ - a₁₁⋅a₁₂⋅a₂₁          0        ⎥
⎢                                         ⎥
⎣          0             a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

# 歸一化
In [11]: E3 = Matrix([[1/(a11*(a11*a22 - a12*a21)), 0], [0, 1/(a11*a22 - a12*a21)]])

In [12]: E3
Out[12]: 
⎡           1                              ⎤
⎢───────────────────────          0        ⎥
⎢a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)                   ⎥
⎢                                          ⎥
⎢                                 1        ⎥
⎢           0             ─────────────────⎥
⎣                         a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

In [13]: E3 * E2 * E1 * M
Out[13]: 
⎡    ⎛        a₁₂⋅a₂₁            1 ⎞        a₁₂⋅a₂₁              a₁₂⋅a₂₂      
⎢a₁₁⋅⎜─────────────────────── + ───⎟ - ─────────────────  - ───────────────── 
⎢    ⎝a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)   a₁₁⎠   a₁₁⋅a₂₂ - a₁₂⋅a₂₁    a₁₁⋅a₂₂ - a₁₂⋅a₂₁ 
⎢                                                                             
⎢                                                                        a₁₁⋅a
⎢                           0                                       ──────────
⎣                                                                   a₁₁⋅a₂₂ - 

      ⎛        a₁₂⋅a₂₁            1 ⎞⎤
+ a₁₂⋅⎜─────────────────────── + ───⎟⎥
      ⎝a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)   a₁₁⎠⎥
                                     ⎥
₂₂             a₁₂⋅a₂₁               ⎥
─────── - ─────────────────          ⎥
a₁₂⋅a₂₁   a₁₁⋅a₂₂ - a₁₂⋅a₂₁          ⎦

# 驗證化作『單位矩陣』
In [14]: (E3 * E2 * E1 * M)[0,0]
Out[14]: 
    ⎛        a₁₂⋅a₂₁            1 ⎞        a₁₂⋅a₂₁     
a₁₁⋅⎜─────────────────────── + ───⎟ - ─────────────────
    ⎝a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)   a₁₁⎠   a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [15]: (E3 * E2 * E1 * M)[0,0].simplify()
Out[15]: 1

In [16]: (E3 * E2 * E1 * M)[1,1]
Out[16]: 
     a₁₁⋅a₂₂             a₁₂⋅a₂₁     
───────────────── - ─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁   a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [17]: (E3 * E2 * E1 * M)[1,1].simplify()
Out[17]: 1

# 簡化『反矩陣』
In [18]: E3 * E2 * E1
Out[18]: 
⎡        a₁₂⋅a₂₁            1         -a₁₂       ⎤
⎢─────────────────────── + ───  ─────────────────⎥
⎢a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)   a₁₁  a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎥
⎢                                                ⎥
⎢            -a₂₁                      a₁₁       ⎥
⎢      ─────────────────        ─────────────────⎥
⎣      a₁₁⋅a₂₂ - a₁₂⋅a₂₁        a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

In [19]: (E3 * E2 * E1)[0,0].simplify()
Out[19]: 
       a₂₂       
─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [20]: (E3 * E2 * E1)[0,1].simplify()
Out[20]: 
      -a₁₂       
─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [21]: (E3 * E2 * E1)[1,0].simplify()
Out[21]: 
      -a₂₁       
─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [22]: (E3 * E2 * E1)[1,1].simplify()
Out[22]: 
       a₁₁       
─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [23]: E = Matrix([[a22/(a11*a22 -a12*a21), -a12/(a11*a22 -a12*a21)], [-a21/(a11*a22 -a12*a21), a11/(a11*a22 -a12*a21)]])

In [24]: E
Out[24]: 
⎡       a₂₂               -a₁₂       ⎤
⎢─────────────────  ─────────────────⎥
⎢a₁₁⋅a₂₂ - a₁₂⋅a₂₁  a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎥
⎢                                    ⎥
⎢      -a₂₁                a₁₁       ⎥
⎢─────────────────  ─────────────────⎥
⎣a₁₁⋅a₂₂ - a₁₂⋅a₂₁  a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

In [25]: E * M
Out[25]: 
⎡     a₁₁⋅a₂₂             a₁₂⋅a₂₁                                            ⎤
⎢───────────────── - ─────────────────                    0                  ⎥
⎢a₁₁⋅a₂₂ - a₁₂⋅a₂₁   a₁₁⋅a₂₂ - a₁₂⋅a₂₁                                       ⎥
⎢                                                                            ⎥
⎢                                            a₁₁⋅a₂₂             a₁₂⋅a₂₁     ⎥
⎢                  0                    ───────────────── - ─────────────────⎥
⎣                                       a₁₁⋅a₂₂ - a₁₂⋅a₂₁   a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

# 探索這些『基本矩陣』的性質
In [26]: E1
Out[26]: 
⎡ 1     0 ⎤
⎢         ⎥
⎣-a₂₁  a₁₁⎦

In [27]: E1.det()
Out[27]: a₁₁

In [28]: E1.inv()
Out[28]: 
⎡ 1    0 ⎤
⎢        ⎥
⎢a₂₁   1 ⎥
⎢───  ───⎥
⎣a₁₁  a₁₁⎦

In [29]: E2
Out[29]: 
⎡a₁₁⋅a₂₂ - a₁₂⋅a₂₁  -a₁₂⎤
⎢                       ⎥
⎣        0           1  ⎦

In [30]: E2.det()
Out[30]: a₁₁⋅a₂₂ - a₁₂⋅a₂₁

In [31]: E2.inv()
Out[31]: 
⎡        1                 a₁₂       ⎤
⎢─────────────────  ─────────────────⎥
⎢a₁₁⋅a₂₂ - a₁₂⋅a₂₁  a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎥
⎢                                    ⎥
⎣        0                  1        ⎦

In [32]: E3
Out[32]: 
⎡           1                              ⎤
⎢───────────────────────          0        ⎥
⎢a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)                   ⎥
⎢                                          ⎥
⎢                                 1        ⎥
⎢           0             ─────────────────⎥
⎣                         a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

In [33]: E3.det()
Out[33]: 
                      1                       
──────────────────────────────────────────────
   3    2        2                      2    2
a₁₁ ⋅a₂₂  - 2⋅a₁₁ ⋅a₁₂⋅a₂₁⋅a₂₂ + a₁₁⋅a₁₂ ⋅a₂₁ 

In [34]: E3.det().simplify()
Out[34]: 
                       1                       
───────────────────────────────────────────────
    ⎛   2    2                          2    2⎞
a₁₁⋅⎝a₁₁ ⋅a₂₂  - 2⋅a₁₁⋅a₁₂⋅a₂₁⋅a₂₂ + a₁₂ ⋅a₂₁ ⎠

In [35]: E3.det().simplify().factor()
Out[35]: 
           1            
────────────────────────
                       2
a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁) 

In [36]: E3.inv()
Out[36]: 
⎡a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)          0        ⎤
⎢                                          ⎥
⎣           0             a₁₁⋅a₂₂ - a₁₂⋅a₂₁⎦

In [37]: E1.det() * E2.det() * E3.det()
Out[37]: 
           a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)            
──────────────────────────────────────────────
   3    2        2                      2    2
a₁₁ ⋅a₂₂  - 2⋅a₁₁ ⋅a₁₂⋅a₂₁⋅a₂₂ + a₁₁⋅a₁₂ ⋅a₂₁ 

In [38]: (E1.det() * E2.det() * E3.det()).simplify()
Out[38]: 
        1        
─────────────────
a₁₁⋅a₂₂ - a₁₂⋅a₂₁

# 確定 M 可用『基本矩陣』作表達
In [39]: E1.inv() * E2.inv() * E3.inv()
Out[39]: 
⎡a₁₁                          a₁₂                        ⎤
⎢                                                        ⎥
⎢                         ⎛        a₁₂⋅a₂₁            1 ⎞⎥
⎢a₂₁  (a₁₁⋅a₂₂ - a₁₂⋅a₂₁)⋅⎜─────────────────────── + ───⎟⎥
⎣                         ⎝a₁₁⋅(a₁₁⋅a₂₂ - a₁₂⋅a₂₁)   a₁₁⎠⎦

In [40]: (E1.inv() * E2.inv() * E3.inv())[1,1].simplify()
Out[40]: a₂₂