Практическая работа 11 часть 1

11part1.py · 3.5 КБ · изменён 29.06.2026 19:56
py
👁 11
⬇ Скачать GitHub ← Назад
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()