1"""Дополнительное задание: сравнение времени решения СЛАУ."""23import argparse4import time56import matplotlib.pyplot as plt7import numpy as np8910def gaussian_elimination(matrix: np.ndarray, vector: np.ndarray) -> np.ndarray:11 """Решить СЛАУ методом Гаусса с выбором главного элемента."""12 augmented = np.column_stack((matrix, vector)).astype(float).tolist()13 size = len(augmented)1415 for pivot_column in range(size):16 pivot_row = max(17 range(pivot_column, size),18 key=lambda row: abs(augmented[row][pivot_column]),19 )20 if abs(augmented[pivot_row][pivot_column]) < 1e-12:21 raise ValueError("Матрица вырождена")22 augmented[pivot_column], augmented[pivot_row] = (23 augmented[pivot_row],24 augmented[pivot_column],25 )2627 pivot = augmented[pivot_column]28 for row_index in range(pivot_column + 1, size):29 row = augmented[row_index]30 factor = row[pivot_column] / pivot[pivot_column]31 row[pivot_column] = 0.032 for column in range(pivot_column + 1, size + 1):33 row[column] -= factor * pivot[column]3435 solution = [0.0] * size36 for row_index in range(size - 1, -1, -1):37 row = augmented[row_index]38 known = sum(39 row[column] * solution[column] for column in range(row_index + 1, size)40 )41 solution[row_index] = (row[-1] - known) / row[row_index]42 return np.array(solution)434445def build_system(size: int, seed: int) -> tuple[np.ndarray, np.ndarray]:46 rng = np.random.default_rng(seed)47 matrix = rng.uniform(-1, 1, (size, size))48 matrix += np.eye(size) * size49 expected = rng.uniform(-10, 10, size)50 return matrix, matrix @ expected515253def measure(size: int) -> tuple[float, float]:54 matrix, vector = build_system(size, seed=size)5556 started = time.perf_counter()57 numpy_solution = np.linalg.solve(matrix, vector)58 numpy_time = time.perf_counter() - started5960 started = time.perf_counter()61 custom_solution = gaussian_elimination(matrix, vector)62 custom_time = time.perf_counter() - started6364 if not np.allclose(custom_solution, numpy_solution, rtol=1e-7, atol=1e-7):65 raise RuntimeError("Собственный метод Гаусса дал неверный результат")66 return numpy_time, custom_time676869def main() -> None:70 parser = argparse.ArgumentParser()71 parser.add_argument("--sizes", nargs="+", type=int, default=[50, 100, 150, 200])72 parser.add_argument("--output", default="gaussian_timing.png")73 args = parser.parse_args()7475 numpy_times = []76 custom_times = []77 for size in args.sizes:78 numpy_time, custom_time = measure(size)79 numpy_times.append(numpy_time)80 custom_times.append(custom_time)81 print(f"n={size:4d}: NumPy={numpy_time:.6f} с, свой метод={custom_time:.6f} с")8283 plt.plot(args.sizes, numpy_times, marker="o", label="NumPy")84 plt.plot(args.sizes, custom_times, marker="o", label="Свой метод Гаусса")85 plt.xlabel("Количество неизвестных")86 plt.ylabel("Время, секунд")87 plt.title("Время решения заполненной СЛАУ")88 plt.grid(True)89 plt.legend()90 plt.tight_layout()91 plt.savefig(args.output, dpi=160)92 print(f"График сохранён: {args.output}")939495if __name__ == "__main__":96 main()