-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlab1main.py
More file actions
157 lines (127 loc) · 4.88 KB
/
lab1main.py
File metadata and controls
157 lines (127 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
FILE_IN = "iofiles/input.txt"
def getmat_file():
""" Получить матрицу из файла """
with open(FILE_IN, 'rt') as fin:
try:
n = int(fin.readline())
matrix = []
for line in fin:
new_row = list(map(float, line.strip().split()))
if len(new_row) != (n + 1):
raise ValueError
matrix.append(new_row)
if len(matrix) != n:
raise ValueError
except ValueError:
return None
return matrix
def getmat_input():
""" Получить матрицу с клавиатуры """
print("Вводите коэффициенты матрицы через пробел строка за строкой.")
while True:
try:
n = int(input("Порядок матрицы: "))
if n <= 0:
print("Порядок матрицы должен быть положительным.")
else:
break
except ValueError:
print("Порядок матрицы должен быть целым числом.")
matrix = []
print("Коэффициенты матрицы:")
try:
for i in range(n):
matrix.append(list(map(float, input().strip().split())))
if len(matrix[i]) != (n + 1):
raise ValueError
except ValueError:
return None
return matrix
def solve_minor(matrix, i, j):
""" Найти минор элемента матрицы """
n = len(matrix)
return [[matrix[row][col] for col in range(n) if col != j] for row in range(n) if row != i]
def solve_det(matrix):
""" Найти определитель матрицы """
n = len(matrix)
if n == 1:
return matrix[0][0]
det = 0
sgn = 1
for j in range(n):
det += sgn * matrix[0][j] * solve_det(solve_minor(matrix, 0, j))
sgn *= -1
return det
def solve(matrix):
""" Метод Гаусса с выбором главного элемента по столбцам """
n = len(matrix)
det = solve_det([matrix[i][:n] for i in range(n)])
if det == 0:
return None
# Прямой ход
for i in range(n - 1):
# Поиск максимального элемента в столбце
max_i = i
for m in range(i + 1, n):
if abs(matrix[m][i]) > abs(matrix[max_i][i]):
max_i = m
# Перестановка строк
if max_i != i:
for j in range(n + 1):
matrix[i][j], matrix[max_i][j] = matrix[max_i][j], matrix[i][j]
# Исключение i-того неизвестного
for k in range(i + 1, n):
coef = matrix[k][i] / matrix[i][i]
for j in range(i, n + 1):
matrix[k][j] -= coef * matrix[i][j]
reduced_matrix = matrix[:]
# Обратный ход
roots = [0] * n
for i in range(n - 1, -1, -1):
s_part = 0
for j in range(i + 1, n):
s_part += matrix[i][j] * roots[j]
roots[i] = (matrix[i][n] - s_part) / matrix[i][i]
# Вычисление невязок
residuals = [0] * n
for i in range(n):
s_part = 0
for j in range(n):
s_part += matrix[i][j] * roots[j]
residuals[i] = s_part - matrix[i][n]
return det, reduced_matrix, roots, residuals
def main():
print("\t\tЛабораторная работа #1 (19)")
print("Метод Гаусса с выбором главного элемента по столбцам")
print("\nВзять коэффициенты из файла (+) или ввести с клавиатуры (-)?")
method = input(">>> ")
while (method != '+') and (method != '-'):
print("Введите '+' или '-' для выбора способа ввода.")
method = input(">>> ")
if method == '+':
matrix = getmat_file()
else:
matrix = getmat_input()
if matrix is None:
print("При считывании коэффициентов матрицы произошла ошибка!")
return
answer = solve(matrix[:])
if answer is None:
print("\nМатрица является несовместной.")
return
det, reduced_matrix, roots, residuals = answer
print("\nОпределитель:")
print(det)
print("\nПреобразованная матрица:")
for row in reduced_matrix:
for col in row:
print('{:10}'.format(round(col, 3)), end='')
print()
print("\nВектор неизвестных:")
for root in roots:
print(' ' + str(root))
print("\nВектор невязок:")
for residual in residuals:
print(' ' + str(residual))
input("\n\nНажмите Enter, чтобы выйти.")
main()