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
157 changes: 157 additions & 0 deletions Р3213/ziyatdinov_408659/lab1/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import sys
import numpy as np

def random_matrix():
n = int(input("Введите размер (n): "))
matrix = np.random.randint(-1000, 1000, (n, n))
d = np.random.randint(-1000, 1000, n)
return n, matrix, d


def create_matrix():
n = int(input("Введите размер (n): "))

print("Введите матрицу (n на n):")
matrix = []
for i in range(n):
while True:
row = input().split()
if len(row) == n:
try:
matrix.append([float(x) for x in row])
break
except ValueError:
pass
print(f"Введите пж {n} чисел")
print("Введите вектор b:")
while True:
b = input().split()
if len(b) == n:
try:
b = [float(x) for x in b]
break
except ValueError:
pass
print(f"Введите пж {n} чисел")

return n, matrix, b


def perebor_strok(lst):
if len(lst) <= 1:
yield lst
else:
for i in range(len(lst)):
first = lst[i]
rest = lst[:i] + lst[i + 1:]
for p in perebor_strok(rest):
yield [first] + p


def change_stroke(A, b):
n = len(A)
indices = list(range(n))

for el_perebor in perebor_strok(indices):
val = True
for i in range(n):
diagonal = abs(A[el_perebor[i]][i])
nodiagonal = sum(abs(A[el_perebor[i]][j]) for j in range(n) if j != i)
if diagonal < nodiagonal:
val = False
break

if val:
new_A = [A[idx] for idx in el_perebor]
new_b = [b[idx] for idx in el_perebor]
print("Найдена перестановка строк для диагонального преобладания:")
print("Перестановка индексов:", el_perebor)
return new_A, new_b

print("Перестановкой строк добиться диагонального преобладания не удалось.")
return A, b


def displaying(matrix):
for row in matrix:
print(*row)


def create_C_d(A, b):
n = len(A)
C = [[0.0]*n for _ in range(n)]
d = [0.0]*n

for i in range(n):
d[i] = b[i] / A[i][i]
for j in range(n):
if i == j:
C[i][j] = 0.0
else:
C[i][j] = -A[i][j] / A[i][i]
return C, d


def matrix_norm(C):
return max(sum(abs(x) for x in row) for row in C)


def gaussSeidel(C, d, eps, max_iter):
n = len(C)
old = d

for k in range(max_iter):
new = old[:] # копируем список

for i in range(n):
s1 = sum(C[i][j] * new[j] for j in range(i))
s2 = sum(C[i][j] * old[j] for j in range(i + 1, n))
new[i] = d[i] + s1 + s2

diff = max(abs(new[i] - old[i]) for i in range(n))
print(f"Погрешность для {k + 1}ой итерации:", diff)
if diff < eps:
return new, k + 1

old = new

return old, max_iter


def main():
mode = input("Выберите источник ввода (1 - консоль, 2 - файл): ")
if mode.strip() == "2":
filename = input("Введите имя файла: ")
sys.stdin = open(filename, "r", encoding="utf-8")

n, A, b = random_matrix()
displaying(A)
# n, A, b = create_matrix()

A, b = change_stroke(A, b)
C, d = create_C_d(A, b)

print("матрица С")
displaying(C)

norma = matrix_norm(C)
print("Норма матрицы C (по строкам) =", norma)
if norma < 1:
print("Условие ||C|| < 1 выполняется")
else:
print("Условие ||C|| < 1 не выполняется")

eps_str = input("Введите точность: ")
eps = float(eps_str)
max_iter_str = input("Введите максимальное число итераций: ")
max_iter = int(max_iter_str)

x, k = gaussSeidel(C, d, eps, max_iter)

print("Результат решения системы:")
for i in range(n):
print(f"x[{i+1}] =", x[i])
print("Выполнено итераций:", k)


main()
Binary file not shown.
Loading