Практическая работа 10 часть 2

10part2.py · 3.9 КБ · изменён 29.06.2026 19:56
py
👁 11
⬇ Скачать GitHub ← Назад
1"""Практическая работа 10, часть 2: машинная проверка расчётов."""23import matplotlib.pyplot as plt4import numpy as np567S = 98G = 329K = 1101112def build_main_matrix(s: int, g: int) -> np.ndarray:13    p = 2 * g + 2 * s14    m = -s - 2 * g15    return np.array(16        [17            [p / 6, m / 6, 2 * s / 6],18            [m / 6, (2 * p + s) / 6, m / 6],19            [2 * s / 6, m / 6, p / 6],20        ],21        dtype=float,22    )232425def build_extra_system(s: int, g: int, k: int) -> tuple[np.ndarray, np.ndarray]:26    matrix = np.array(27        [28            [4, -1, 1, -1, 0, 0],29            [1, 5, 1, 0, -1, 0],30            [s, g, 2 * (s + g + k), 0, 0, -1],31            [-1, 0, 0, 4, -1, 0],32            [0, -1, 0, -1, 4, -1],33            [0, 0, -1, 0, -1, 4],34        ],35        dtype=float,36    )3738    vector = np.array(39        [40            s - g + 4 * k,41            s - g + k + 9,42            2 * (s - g) * (s + g + k) + k * s,43            -10,44            4 - 2 * g,45            9 * g - s - 1,46        ],47        dtype=float,48    )49    return matrix, vector505152def normalize_first_component(vector: np.ndarray) -> np.ndarray:53    return vector / vector[0]545556def print_report(57    matrix: np.ndarray,58    eigenvalues: np.ndarray,59    eigenvectors: np.ndarray,60    lambda_max: float,61    vector_max: np.ndarray,62    row_sums: np.ndarray,63    extra_solution: np.ndarray,64) -> None:65    print("Практическая работа 10, часть 2")66    print("=" * 36)6768    print("\nПараметры варианта:")69    print(f"S = {S}, G = {G}, K = {K}")7071    print("\nМатрица A:")72    print(matrix)7374    print("\nСобственные числа:")75    print(eigenvalues)7677    print("\nСобственные векторы:")78    print(eigenvectors)7980    print("\nМаксимальное собственное число:")81    print(lambda_max)8283    print("\nСоответствующий вектор после нормировки:")84    print(vector_max)8586    print("\nСуммы элементов по строкам:")87    print(row_sums)8889    print("\nКороткое замечание:")90    print(91        "Все суммы строк равны 4.5, и число 4.5 присутствует в спектре. "92        "Следовательно, вектор (1, 1, 1) является собственным вектором "93        "матрицы для собственного числа λ = 4.5."94    )9596    print("\nПроверка равенства A @ v и λ * v:")97    print("A @ v =")98    print(matrix @ normalize_first_component(vector_max))99    print("λ * v =")100    print(lambda_max * normalize_first_component(vector_max))101102    print("\nРешение дополнительной системы:")103    print(extra_solution)104105106def plot_spectrum(eigenvalues: np.ndarray) -> None:107    x = np.arange(len(eigenvalues))108109    plt.figure(figsize=(8, 5))110    plt.bar(x, eigenvalues, width=0.45)111    plt.xticks(x, [f"λ{i + 1}" for i in range(len(eigenvalues))])112    plt.title("Спектр матрицы A")113    plt.xlabel("Номер собственного числа")114    plt.ylabel("Значение")115    plt.grid(axis="y", alpha=0.3)116    plt.tight_layout()117    plt.show()118119120def main() -> None:121    matrix = build_main_matrix(S, G)122    eigenvalues, eigenvectors = np.linalg.eig(matrix)123124    max_index = int(np.argmax(eigenvalues))125    lambda_max = float(eigenvalues[max_index])126    vector_max = normalize_first_component(eigenvectors[:, max_index])127    row_sums = matrix.sum(axis=1)128129    extra_matrix, extra_vector = build_extra_system(S, G, K)130    extra_solution = np.linalg.solve(extra_matrix, extra_vector)131132    print_report(133        matrix,134        eigenvalues,135        eigenvectors,136        lambda_max,137        vector_max,138        row_sums,139        extra_solution,140    )141    plot_spectrum(eigenvalues)142143144if __name__ == "__main__":145    main()