Tính định thức ma trận Python

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
				
			
Các yếu tố quyết định của thứ tự thứ ba

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

Làm cách nào để tìm định thức của ma trận trong Python mà không cần NumPy?

Làm cách nào để tìm định thức của ma trận 3x3 trong Python mà không có NumPy? .
def det[ma trận]
order=len[ma trận]
posdet=0
cho tôi trong phạm vi [thứ tự]
posdet+=reduce[[lambda x, y. x * y], [ma trận[[i+j]%thứ tự][j] cho j trong phạm vi[thứ tự]]]
negdet=0
cho tôi trong phạm vi [thứ tự]

Làm thế nào để tìm định thức của ma trận?

Mở rộng để tìm định thức .
Chọn bất kỳ hàng hoặc cột nào trong ma trận. Không quan trọng bạn sử dụng hàng nào hoặc cột nào, câu trả lời sẽ giống nhau cho bất kỳ hàng nào. .
Nhân mọi phần tử trong hàng hoặc cột đó với đồng sáng lập của nó và cộng. Kết quả là yếu tố quyết định

Yếu tố quyết định của ma trận 3x3 là gì?

Định thức của công thức ma trận 3 x 3 được cho bởi, [ a b c d e f g h i ] = [ 2 − 3 9 2 0 − 1 1 4 5 ]

Làm cách nào để tìm định thức của ma trận 3x3 trong C?

Chương trình C tìm định thức của ma trận .
#include.
int main[]{
int a[3][3], i, j;
định thức dài;
printf["Nhập 9 phần tử của ma trận. "];
cho[i = 0 ;i < 3;i++]
cho[j = 0;j < 3;j++]
scanf["%d", &a[i][j]];

Chủ Đề