我們從一個雞兔同籠的問題說起:
據《孫子算經》記載:今有雉兔同籠,上有35頭,下有94足,問雉兔各有幾何
這是二年級奧林匹克數學競賽的題目,大人用二元一次方程來解就沒意思了,本文關注numpy如何通過矩陣求解。
假設,雞:x只 ;兔 : y 只,列二元一次方程為
1x + 1y = 35(頭) 2x + 4y = 94(足)
列矩陣為:A * w = b
| 1 1 | | x | | 35 | | 2 4 | * | y | = | 94 |
求得未知數 w = b / A
因為矩陣不支持矩陣除法,但是可以通過A的逆矩陣(A_)來計算 : w = b *A_
import numpy as np import numpy.linalg as ll A = np.array([[1, 1], [2, 4]]) b = np.array([[35], [94]]) A_ = ll.inv(A) # 求A的逆矩陣 w = np.dot(A_, b) # A_ x b
結果為
In [67]: [[23.] [12.]]
numpy.linalg提供了solve方法可以直接求解,參見如下代碼
import numpy as np import numpy.linalg as ll A = np.array([[1, 1], [2, 4]]) b = np.array([[35], [94]]) w = ll.solve(A, b) print(w)
對於更多元的解法也是一樣的,在線性代數里,這個方法叫:克拉默法則
numpy.matlib提供了矩陣matirx的處理,ndarray是處理多為數組,matrix只是二維,在matrix里可以直接求逆矩陣
import numpy as np # 可以通過字符串格式構造一個矩陣 A = np.mat("1 1 ; 2 4") b = np.mat("35 ; 94") # .I是求逆矩陣 w = np.dot(A.I, b) print(w)