Ghi chú. có hai phương pháp để tìm định thức, smartDetNxN
chạy nhanh hơn 35 lần so với detNxN
trong trường hợp tốt nhất trên một ma trận lớn
import numpy as np
# compute partial determinant terms
def terms[M, col = 1, row = 1]:
return [x[:col-1] + x[col:] for x in M[0:row-1] + M[row:]]
# compute determinant using first row
def detNxN[M]:
N = len[M[0]]
# Recursion Base: 2x2 determenant
if [N == 2]:
M = np.array[M]
return M[0][0] * M[1,1] - M[0][1] * M[1][0]
# Recursion Loop
else:
rowValues = M[:1][0]
colsSigns = [1 if [col % 2 == 0] else -1 for col in range[N]]
colsDets = [detNxN[terms[M, col + 1]] for col in range[N]]
return sum[[rowValues[col] * colsSigns[col] * colsDets[col] for col in range[N]]]
# compute determinant using optimum row while skipping zero value columns
def smartDetNxN[M]:
N = len[M[0]]
# Recursion Base: 2x2 determenant
if [N == 2]:
M = np.array[M]
return M[0][0] * M[1,1] - M[0][1] * M[1][0]
# Recursion Loop
else:
# find optimun row
flatM = [len[np.flatnonzero[x]] for x in M]
row = flatM.index[min[flatM]]
rowSign = 1 if [row % 2 == 0] else -1
rowValues = M[row]
# compute partial determinants
colsSigns = [1 if [col % 2 == 0] else -1 for col in range[N]]
colsDets = [smartDetNxN[terms[M, col + 1, row + 1]] if [rowValues[col] != 0] else 0 for col in range[N]]
return sum[[rowValues[col] * rowSign * colsSigns[col] * colsDets[col] for col in range[N]]]
# test case for matrix
def testCase[M]:
print[]
N1 = len[M[0]]
N2 = len[M[0]]
A = smartDetNxN[M]
B = round[np.linalg.det[M]]
print["Matrix %ix%i:" % [N1, N2]]
print["Actual detM = %d, Expected detM = %d " % [A, B]]
print["Test Pass:", A == B]
# main
def main[]:
# Matrix 2 x 2
M1 = [[1,2,],[0,1]]
testCase[M1]
# Matrix 3 x 3
M2 = [[1,2,3],[2,1,2],[3,2,1]]
testCase[M2]
# Matrix 4 x 4
M3 = [[1,2,3,4], [2,1,0,3], [3,0,1,2], [4,0,0,1]]
testCase[M3]
# Matrix 10 x 10
M4 = [
[0,1,2,3,4,5,6,7,8,9],
[1,1,0,0,0,0,0,0,0,8],
[2,0,1,0,0,0,0,0,0,7],
[3,0,0,1,0,0,0,0,0,6],
[4,0,0,0,1,0,0,0,0,5],
[5,0,0,0,0,1,0,0,0,4],
[6,0,0,0,0,0,1,0,0,3],
[7,0,0,0,0,0,0,1,0,2],
[8,0,0,0,0,0,0,0,1,1],
[9,0,0,0,0,0,0,0,0,0],
]
testCase[M4]
main[]
đầu ra
Matrix 2x2:
Actual detM = 1, Expected detM = 1
Test Pass: True
Matrix 3x3:
Actual detM = 8, Expected detM = 8
Test Pass: True
Matrix 4x4:
Actual detM = 20, Expected detM = 20
Test Pass: True
Matrix 10x10:
Actual detM = 999, Expected detM = 999
Test Pass: True
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách tính giá trị của một yếu tố quyết định trong Python bằng cách sử dụng gói số Hàm numpy.linalg.det[]
của NumPy
Chúng tôi xem xét một vài phương trình tuyến tính thuần nhất trong hai biến $x$ và $y$
$$ a_{1}x + b_{1}y = 0 \\ a_{2}x + b_{2}y = 0 $$
Nhân phương trình thứ nhất với $b_{2}$ và phương trình thứ hai với $b_{1}$ ta được
$$ a_{1}b_{2}x + b_{1}b_{2}y = 0 \\ a_{2}b_{1}x + b_{2}b_{1}y = 0 $$
Trừ phương trình thứ hai từ phương trình thứ nhất, chúng ta nhận được
$$ a_{1}b_{2}x - a_{2}b_{1}x = 0 $$
Chia cho $x$, phương trình trở thành
$$ a_{1}b_{2} - a_{2}b_{1} = 0 $$
Kết quả này thường được ký hiệu là
$$ \begin{vmatrix} a_{1} & b_{1} \\ a_{2} & b_{2} \\ \end{vmatrix} = 0 $$
và biểu thức bên trái được gọi là định thức. Như bạn có thể thấy, kết quả là một số duy nhất
Định thức trên bao gồm hai hàng và hai cột, và khi khai triển, mỗi số hạng của nó là tích của hai đại lượng. Do đó, định thức này được gọi là bậc hai. Các đại lượng $a_{1}$, $b_{1}$, $a_{2}$ và $b_{2}$ được gọi là thành phần của định thức và số hạng tích $a_{1}b_{2}$
Python có một thư viện số gọi là NumPy có chức năng gọi là numpy.linalg.det[]
để tính giá trị của một định thức
Chúng ta sẽ tính giá trị của định thức bậc hai bên dưới trong NumPy
$$ \begin{vmatrix} 1 & 2 \\ 3 & 4 \\ \end{vmatrix} $$
import numpy as np
a = np.array[[[1, 2], [3, 4]]]
d = np.linalg.det[a]
print[d]
Khi chạy tập lệnh Python, chúng tôi nhận được giá trị
-2.0
Bây giờ chúng ta xem xét một tập hợp các phương trình tuyến tính thuần nhất trong ba biến $x$, $y$ và $z$
$$ a_{1}x + b_{1}y + c_{1}z = 0 \\ a_{2}x + b_{2}y + c_{2}z = 0 \\ a_{3}x +
Bằng cách loại bỏ $x$, $y$ và $z$, ta có
$$ a_{1}[b_{2}c_{3} - b_{3}c_{2}] + b_{1}[c_{2}a_{3} - c_{3}a_{2}] +
hoặc
$$ a_{1} \begin{vmatrix} b_{2} & c_{2} \\ b_{3} & c_{3} \\ \end{vmatrix} + b_{1} \begin{vmatrix} c_{
Loại bỏ này thường được viết là
$$ \begin{vmatrix} a_{1} & b_{1} & c_{1} \\ a_{2} & b_{2} & c_{2} \\ a_{3} & b_{3} & c_
và biểu thức bên trái gồm ba hàng và ba cột là định thức bậc ba
Dưới đây, chúng tôi chọn một định thức bậc ba từ văn bản Đại số cổ điển Đại số cao hơn1 của Hall & Knight