詩經‧國風‧豳風‧伐柯
伐柯如何?匪斧不克。
取妻如何?匪媒不得。
伐柯伐柯,其則不遠。
我覯之子,籩豆有踐。
伐『』柯即是製作斧柄,卻是非斧不行??將之比作娶『妻』
※《説文解字》: 柯,斧柄也。从木,可聲。
實在費疑猜??若思善用『工具』能夠創造更好的『工具』,那麼『伐柯伐柯,其則不遠。』果真『有理有則』的乎!?因此假借 SymPy 『符號矩陣』學習『矩陣』,也是『順理而行』的了?!
這裡僅以『基本矩陣』之法,求解一般 矩陣之『反矩陣』 為例,演義這則『伐柯取妻』有趣之事︰
if
then
望可消消暑氣也!!??
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₂₂