Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Р3213/khalikov_409785/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__/
Binary file added Р3213/khalikov_409785/lab1/reports/report.docx
Binary file not shown.
Binary file added Р3213/khalikov_409785/lab1/reports/report.pdf
Binary file not shown.
22 changes: 22 additions & 0 deletions Р3213/khalikov_409785/lab1/src/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class TooBigN(Exception):
pass


class TooSmallN(Exception):
pass


class NMustBeInt(Exception):
pass


class NoNInFile(Exception):
pass


class TooShortRow(Exception):
pass


class IncorrectMatrix(Exception):
pass
47 changes: 47 additions & 0 deletions Р3213/khalikov_409785/lab1/src/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import numpy as np
import copy
import method
from method import *
from reader import *
from utils import *
import numpy as np


def main():
n = read_n()

matrix = read_matrix(n)

b = get_vector_from_matrix(matrix)

matrix = separate_matrix_from_vector(matrix)

A = np.array(matrix)

B = np.array(b)

matrix_copy = copy.deepcopy(matrix)
b_copy = b.copy()

answer = gaussian_elimination_modified(matrix, b)

print("\nОтвет:")
print_vector(answer)

print(
f"\nОпределитель:\n{calc_determinant_triangle(diagonal(matrix), method.permutations)}")

print("\nНевязка:")
print_vector(calc_residual(matrix_copy, b_copy, answer))

numpy_answer = np.linalg.solve(A, B)
numpy_det = np.linalg.det(A)

print("\nОтвет, полученный с помощью библиотек:")
print_vector(numpy_answer)
print("\nОпределитель, полученный с помощью библиотек:")
print(numpy_det)


if __name__ == "__main__":
main()
107 changes: 107 additions & 0 deletions Р3213/khalikov_409785/lab1/src/method.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
from printer import *
from utils import *
import math

permutations = 0

# метод Гаусса с выбором главного элемента


def gaussian_elimination_modified(matrix, b):
last_permutations = permutations

print("Исходная матрица:")
print_matrix(matrix)
print()

n = len(matrix)
x = [0]*n

# прямой ход
for i in range(n-1):
print("\nДо:")
print_matrix(matrix)
print()

modified_replace(matrix, i, b)

print(f"Меняем строки местами... (k = {i})")
print_matrix(matrix)

print("\nНичего не изменилось" if last_permutations == permutations else "")

last_permutations = permutations

for k in range(i+1, n):

c = matrix[k][i] / matrix[i][i]

matrix[k][i] = 0

for j in range(i+1, n):
matrix[k][j] = matrix[k][j] - c*matrix[i][j]

b[k] = b[k] - c * b[i]

print("\nИтоговая матрица:")
append_vector_to_matrix(b, matrix)
print_matrix(matrix)
print()

# обратный ход

for i in range(n-1, -1, -1):
try:
s = 0
for j in range(i+1, n):
s += matrix[i][j]*x[j]
x[i] = (b[i] - s) / matrix[i][i]
except ZeroDivisionError:
print("Решени либо нет, либо их бесконечно много")
exit(0)

return x

# перестановка строк


def modified_replace(matrix, i, b):
global permutations
l = i
n = len(matrix)
for m in range(i+1, n):
if abs(matrix[m][i]) > abs(matrix[l][i]):
l = m
if l == i:
return
else:
matrix[i], matrix[l] = matrix[l], matrix[i]
b[i], b[l] = b[l], b[i]
permutations += 1

# невязка Ax* - b = r


def calc_residual(matrix, b, x):

n = len(matrix)
residual = []
for i in range(n):
r = 0
for j in range(n):
r += matrix[i][j] * x[j]
r -= b[i]
residual.append(r)
return residual

# получить главную диагональ


def diagonal(matrix):
return [matrix[i][i] for i in range(len(matrix))]


# посчитать определитель треугольной матрицы
def calc_determinant_triangle(diagonal, k):

return (-1)**k * math.prod(diagonal)
13 changes: 13 additions & 0 deletions Р3213/khalikov_409785/lab1/src/printer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from tabulate import tabulate


def print_matrix(matrix):
print(tabulate(matrix, tablefmt="rounded_grid"))


def print_vector(vector):
vector_t = []
for x in vector:
vector_t.append([x])

print(tabulate(vector_t, tablefmt="rounded_grid"))
130 changes: 130 additions & 0 deletions Р3213/khalikov_409785/lab1/src/reader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
from printer import print_matrix
from utils import validate_n
from tabulate import tabulate
from exceptions import *


def read_n():
try:
while True:
in_n = input(
"Введите размерность матрицы (n ≤ 20).\nВыберите способ:\n1. Вручную\n2. Из файла\n"
).strip().lower()

if in_n in ("1", "вручную"):
return read_n_manual()

elif in_n in ("2", "из файла"):
return read_n_from_file()

except KeyboardInterrupt:
print("\nВыход...\n")
exit(0)


def read_n_manual():
while True:
n = input("Введите размерность матрицы:\n").strip()
n = validate_n(n)
if n is not None:
return n


def read_n_from_file():
while True:
file = input("Введите имя файла, в первой строке которого содержится размерность матрицы:\n").strip()
try:
with open(file, "r") as f:
n = f.readline().strip()
if not n:
raise NoNInFile


n = validate_n(n)
if n is not None:
return n


except NoNInFile:
print("Ошибка: файл пустой или первая строка отсутствует.")
continue
except FileNotFoundError:
print("Файл не найден\n")
except OSError:
print("Ошибка при открытии файла\n")


def read_matrix(n):
try:
while True:
in_matrix = input(
f"Введите коэффициенты матрицы {n}x{n}.\nВыберите способ:\n1. Вручную\n2. Из файла\n"
).strip().lower()

if in_matrix in ("1", "вручную"):
return read_matrix_manual(n)

elif in_matrix in ("2", "из файла"):
return read_matrix_from_file(n)

except KeyboardInterrupt:
print("\nВыход...\n")
exit(0)


def read_matrix_manual(n):
matrix = []
print(f"Введите коэффициенты матрицы {n}x{n}, включая вектор свободных членов, построчно через пробел:")

for i in range(n):
while True:
try:
row = list(
map(float, input(f"Строка {i+1}: ").replace(",", ".").split()))
if len(row) != n + 1:
raise TooShortRow
matrix.append(row)
break
except TooShortRow:
print(f"Строка должна быть длины {n + 1}")
continue
except ValueError:
print("Некорректный ввод")
except KeyboardInterrupt:
print("\nВыход...\n")
exit(0)

print("Вы ввели матрицу:")
print_matrix(matrix)
return matrix


def read_matrix_from_file(n):
while True:
file = input("Введите имя файла:\n").strip()

try:
with open(file, "r") as f:
matrix = [list(map(float, line.replace(",", ".").split()))
for line in f]

if len(matrix) != n or any(len(row) != (n + 1) for row in matrix):
raise IncorrectMatrix

print("Матрица, полученная из файла:")
print_matrix(matrix)
return matrix


except IncorrectMatrix:
print(f"Ошибка: матрица должна быть размером {n}x{n}, включая вектор свободных членов")
continue
except FileNotFoundError:
print("Файл с таким именем не найден")
except ValueError:
print("Некорректная матрица в файле")
except OSError:
print("Некорректное имя файла")
except KeyboardInterrupt:
print("\nВыход...\n")
exit(0)
60 changes: 60 additions & 0 deletions Р3213/khalikov_409785/lab1/src/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import random
from exceptions import *


def validate_n(n):

try:
n = float(n.replace(",", "."))
if not n.is_integer():
raise NMustBeInt
n = int(n)
if n > 20:
raise TooBigN
elif n <= 0:
raise ValueError
return n

except NMustBeInt:
print("Число должно быть целым")
return None
except TooBigN:
print("Размерность матрицы слишком большая")
return None
except ValueError:
print("Размерность должна быть натуральным числом")
return None
except KeyboardInterrupt:
print("\nВыход...\n")
exit(0)


def append_vector_to_matrix(vector, matrix):
for i in range(len(matrix)):
matrix[i].append(vector[i])


def get_vector_from_matrix(matrix):
vector = []
for row in matrix:
vector.append(row[-1])
return vector


def separate_matrix_from_vector(matrix):
new_matrix = []
n = len(matrix)
for i in range(n):
new_matrix.append(matrix[i][:-1])
return new_matrix



def generate_matrix_and_save(filename):

matrix = [[random.randint(-10, 10) for _ in range(21)] for _ in range(20)]


with open(filename, "w") as f:
for i in range(20):
f.write(" ".join(map(str, matrix[i])) + "\n")
Binary file added Р3213/khalikov_409785/lab2/reports/report.docx
Binary file not shown.
Binary file added Р3213/khalikov_409785/lab2/reports/report.pdf
Binary file not shown.
4 changes: 4 additions & 0 deletions Р3213/khalikov_409785/lab2/src/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class NotMonotonic(Exception):
pass
class NotCoverage(Exception):
pass
Loading