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
8 changes: 8 additions & 0 deletions Р3212/bondarev_408300/lab1/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
3
4 1 1
1 5 1
1 1 6
6 7 8



179 changes: 179 additions & 0 deletions Р3212/bondarev_408300/lab1/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
import numpy as np
import random


def read_data_from_keyboard():
print("Введите размерность матрицы n (1-20): ")
n = int(input().strip())
if n > 20 or n <= 0:
raise ValueError("Недопустимое значение n.")

A = []
print(f"Введите матрицу A ({n}x{n} построчно, числа через пробел):")
for _ in range(n):
row = list(map(float, input().split()))
if len(row) != n:
raise ValueError("Неверное количество элементов в строке.")
A.append(row)

print(f"Введите вектор b ({n} чисел через пробел):")
b = list(map(float, input().split()))
if len(b) != n:
raise ValueError("Неверное количество элементов в векторе b.")

return n, A, b


def read_data_from_file(filename="input.txt"):
with open(filename, 'r') as f:
lines = [line.strip() for line in f if line.strip()]

idx = 0
n = int(lines[idx])
idx += 1
A = []
for _ in range(n):
A.append(list(map(float, lines[idx].split())))
idx += 1

b = list(map(float, lines[idx].split()))
return n, A, b


def generate_random_system(n):
A = []
for i in range(n):
row = [random.uniform(-10, 10) for _ in range(n)]
diag_temp = row[i]
row[i] = 0
sum_other = sum(abs(x) for x in row)
sign = random.choice([-1, 1])
row[i] = sign * (sum_other + random.uniform(1, 5))
A.append(row)

b = [random.uniform(-10, 10) for _ in range(n)]
return np.array(A, dtype=float), np.array(b, dtype=float)


def check_and_make_diagonally_dominant(A, b):
n = len(A)
for i in range(n):
max_row = i
max_val = abs(A[i][i])
for j in range(i, n):
current = abs(A[j][i])
if current > max_val:
max_val = current
max_row = j

if max_val == 0:
return False

A[i], A[max_row] = A[max_row], A[i]
b[i], b[max_row] = b[max_row], b[i]
return True


def simple_iterations(A, b, eps=1e-6, max_iter=1000):
n = len(A)
D = np.diag(A)
if any(d == 0 for d in D):
raise ValueError("На диагонали есть нулевые элементы после перестановки.")

B = -np.array(A) / D[:, None]
np.fill_diagonal(B, 0)
c = np.array(b) / D

x = np.zeros(n)
for it in range(1, max_iter + 1):
x_new = B @ x + c
if np.linalg.norm(x_new - x, np.inf) < eps:
return x_new, it, (x_new - x)
x = x_new
return x, max_iter, (x - x_new)


def print_results(A, b, x, iterations, diff, eps):
print("\nРезультаты:")
print(f"Количество итераций: {iterations}")
print("Вектор решения:")
print(np.array2string(x, precision=9, suppress_small=True))

print("\nВектор погрешностей (последняя итерация):")
print(np.array2string(diff, precision=2, suppress_small=True))

residual = A @ x - b
print("\nВектор невязки (A*x - b):")
print(np.array2string(residual, precision=2, suppress_small=True))

print(f"\nПроверка точности (||Δx|| < {eps}): {np.linalg.norm(diff, np.inf):.2e}")


def compare_with_numpy(A, b):
try:
x_lib = np.linalg.solve(A, b)
print("\nРешение с использованием numpy.linalg.solve:")
print(np.array2string(x_lib, precision=9, suppress_small=True))
return x_lib
except np.linalg.LinAlgError:
print("\nМатрица вырождена, библиотечное решение невозможно.")
return None


def main():
print("Лабораторная работа: Метод простых итераций")
print("=" * 50)

source = input("Ввод данных:\n1 - Клавиатура\n2 - Файл\n3 - Случайная генерация\nВыбор: ").strip()

if source == '1':
n, A, b = read_data_from_keyboard()
A = np.array(A, dtype=float)
b = np.array(b, dtype=float)
elif source == '2':
n, A, b = read_data_from_file()
A = np.array(A, dtype=float)
b = np.array(b, dtype=float)
elif source == '3':
print("Введите размерность матрицы n (1-20): ")
n = int(input().strip())
if n > 20 or n <= 0:
print("Недопустимое значение n!")
return
A, b = generate_random_system(n)
print("\nСгенерированная матрица A:")
print(np.array2string(A, precision=2, suppress_small=True))
print("\nСгенерированный вектор b:")
print(np.array2string(b, precision=2, suppress_small=True))
else:
print("Неверный ввод!")
return

if not check_and_make_diagonally_dominant(A, b):
print("Невозможно достичь диагонального преобладания!")
return

eps = float(input("Введите точность (например, 1e-6): ").strip() or 1e-6)

try:
x, iterations, diff = simple_iterations(A, b, eps)
except ValueError as e:
print(f"Ошибка: {str(e)}")
return

print_results(A, b, x, iterations, diff, eps)
x_lib = compare_with_numpy(A, b)

if x_lib is not None:
diff = x - x_lib
print("\nРазница с библиотечным решением:")
print(f"Максимальная: {np.abs(diff).max():.2e}")
print(f"Средняя: {np.abs(diff).mean():.2e}")
print("\nОбъяснение: Различия вызваны:")
print("- Ограниченным числом итераций метода")
print("- Накоплением ошибок округления")
print("- Особенностями метода (диагональное преобладание)")


if __name__ == "__main__":
main()
Binary file not shown.
Binary file not shown.
29 changes: 29 additions & 0 deletions Р3212/bondarev_408300/lab2/functions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import math

def f1(x):
""" 2.74x^3 -1.93x^2 -15.28x -3.72 """
return 2.74*(x**3) - 1.93*(x**2) - 15.28*x - 3.72

def df1(x):
""" Производная для f1 """
return 3*2.74*(x**2) - 2*1.93*x - 15.28

def f2(x):
""" sin(x) - 0.5x """
return math.sin(x) - 0.5*x

def df2(x):
return math.cos(x) - 0.5

def f3(x):
""" e^x - x^2 + 1 """
return math.e**x - x**2 + 1

def df3(x):
return math.e**x - 2*x

FUNCTIONS = {
"1": (f1, df1, "f1(x)=2.74x^3 -1.93x^2 -15.28x -3.72"),
"2": (f2, df2, "f2(x)=sin(x) - 0.5x"),
"3": (f3, df3, "f3(x)=e^x - x^2 +1")
}
40 changes: 40 additions & 0 deletions Р3212/bondarev_408300/lab2/graphs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # Для некоторых сред IDE (PyCharm и т.п.)
import matplotlib.pyplot as plt

def f(x):
return 2.74*(x**3) - 1.93*(x**2) - 15.28*x - 3.72

x_min, x_max = -4, 4

xs = np.linspace(x_min, x_max, 400)
ys = [f(xx) for xx in xs]

plt.figure(figsize=(8,6))
plt.title("График f(x) = 2.74x^3 - 1.93x^2 - 15.28x - 3.72; \n Интервал x ∈ [-4, 4]")

# Основная кривая:
plt.plot(xs, ys, label="f(x)")
# Горизонтальная ось x (ось f(x)=0):
plt.axhline(0, color='k', linewidth=1)

# Ограничение диапазонов осей:
plt.xlim(x_min, x_max)
# y-границы подберем автоматически или умножим при желании:
# plt.ylim(min(ys)*1.1, max(ys)*1.1)

# Подписи осей:
plt.xlabel("x in [-4,4]")
plt.ylabel("f(x)")

# Несколько «контрольных» точек с подписями:
test_points = [-3, -2, -1, 0, 1, 2, 3]
for tp in test_points:
val = f(tp)
plt.plot(tp, val, 'ro') # 'r'=red,'o'=marker
plt.text(tp, val, f"({tp}, {val:.1f})", fontsize=8)

plt.grid(True)
plt.legend()
plt.show()
2 changes: 2 additions & 0 deletions Р3212/bondarev_408300/lab2/input_equation.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
2 3
0.01
2 changes: 2 additions & 0 deletions Р3212/bondarev_408300/lab2/input_system.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1 2
0.001
70 changes: 70 additions & 0 deletions Р3212/bondarev_408300/lab2/io_utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@

def read_ab_eps_keyboard():
print("Введите a,b:")
line= input("> ").strip()
a_str,b_str= line.split()
a,b= float(a_str), float(b_str)
if a>b:
a,b= b,a
print("Введите eps:")
eps= float(input("> ").strip())
return a,b,eps

def read_ab_eps_file(filename="input_equation.txt"):
try:
with open(filename,"r",encoding="utf-8") as f_in:
line1= f_in.readline().strip()
a_str,b_str= line1.split()
a,b= float(a_str), float(b_str)
if a>b:
a,b= b,a
eps_str= f_in.readline().strip()
eps= float(eps_str)
return a,b,eps
except:
return None,None,None

def read_xy_eps_keyboard():
print("Введите x0,y0:")
line= input("> ").strip()
x0_str,y0_str= line.split()
x0,y0= float(x0_str), float(y0_str)
print("Введите eps:")
eps= float(input("> ").strip())
return x0,y0,eps

def read_xy_eps_file(filename="input_system.txt"):
try:
with open(filename,"r",encoding="utf-8") as f_in:
line1= f_in.readline().strip()
x0_str,y0_str= line1.split()
x0,y0= float(x0_str), float(y0_str)
eps_str= f_in.readline().strip()
eps= float(eps_str)
return x0,y0,eps
except:
return None,None,None

def output_root(root, fx, iters):
print("Куда вывести результат? (1-экран, 2-файл)")
ans= input("> ").strip()
if ans=="2":
with open("output.txt","a",encoding="utf-8") as f_out:
f_out.write(f"Корень x={root:.6f}, f(x)={fx:.3e}, итераций={iters}\n")
print("Записано в output.txt")
else:
print(f"Корень x={root:.6f}, f(x)={fx:.3e}, итераций={iters}")

def output_system_solution(X,Y, iters, F1, F2):
r1= abs(F1(X,Y))
r2= abs(F2(X,Y))
print("Куда вывести результат? (1-экран, 2-файл)")
ans= input("> ").strip()
if ans=="2":
with open("output.txt","a",encoding="utf-8") as f_out:
f_out.write(f"Решение системы: x={X:.6f}, y={Y:.6f}, итераций={iters}\n")
f_out.write(f"Вектор погрешностей: |F1|={r1:.3e}, |F2|={r2:.3e}\n")
print("Записано в output.txt")
else:
print(f"Решение системы: x={X:.6f}, y={Y:.6f}, итераций={iters}")
print(f"Вектор погрешностей: |F1|={r1:.3e}, |F2|={r2:.3e}")
Loading