lab3: det Gauss
This commit is contained in:
68
Л3-В6/Программа/src/main.py
Normal file
68
Л3-В6/Программа/src/main.py
Normal file
@@ -0,0 +1,68 @@
|
||||
import numpy as np
|
||||
|
||||
|
||||
def det(matrix: np.matrix):
|
||||
if matrix.shape[0] != matrix.shape[1]:
|
||||
return None
|
||||
if matrix.shape[0] == 1:
|
||||
return matrix[0, 0]
|
||||
|
||||
return _det(matrix)
|
||||
|
||||
|
||||
def _det(matrix: np.matrix):
|
||||
matrix, swaps = triangle(np.copy(matrix))
|
||||
if matrix is None:
|
||||
return 0.0
|
||||
|
||||
n = matrix.shape[0]
|
||||
determinant = (-1) ** swaps
|
||||
for i in range(n):
|
||||
determinant *= matrix[i, i]
|
||||
|
||||
return determinant
|
||||
|
||||
|
||||
def triangle(matrix: np.matrix):
|
||||
swaps = 0
|
||||
n = matrix.shape[0]
|
||||
|
||||
for i in range(n):
|
||||
if matrix[i, i] == 0:
|
||||
if not swap_first_non_zero(matrix, i):
|
||||
return None, swaps
|
||||
swaps += 1
|
||||
|
||||
for j in range(i + 1, n):
|
||||
matrix[j, :] = matrix[j, :] - matrix[i, :] * (matrix[j, i] / matrix[i, i])
|
||||
|
||||
return matrix, swaps
|
||||
|
||||
|
||||
def swap_first_non_zero(matrix, i):
|
||||
n = matrix.shape[0]
|
||||
for j in range(i + 1, n):
|
||||
if matrix[j, i] != 0:
|
||||
matrix[[i, j], :] = matrix[[j, i], :]
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
A = np.matrix(
|
||||
[
|
||||
[4.3, -12.1, 23.2, -14.1],
|
||||
[2.4, -4.4, 3.5, 5.5],
|
||||
[5.4, 8.3, -7.4, 12.7],
|
||||
[6.3, -7.6, 1.34, 3.7],
|
||||
],
|
||||
dtype=np.float64,
|
||||
)
|
||||
|
||||
print(det(A))
|
||||
print(np.linalg.det(A))
|
||||
|
||||
print(A)
|
||||
|
||||
B = np.matrix([[-14.4, 6.6, 9.4, 7.3]], dtype=np.float64).T
|
||||
|
||||
# X = np.linalg.inv(A) * B
|
||||
Reference in New Issue
Block a user