Загрузка данных


import numpy as np
import matplotlib.pyplot as plt

# ============================================
# ВАРИАНТ 7
# ============================================

A = np.array([
    [7, -3, 12, -1],
    [3, 5, -6, 2],
    [2, 1, 5, 3],
    [-5, 9, 1, -11]
], dtype=float)

b = np.array([20, 11, 19, -33], dtype=float)

print("="*60)
print("ВАРИАНТ 7: Решение СЛАУ")
print("="*60)
print("\nМатрица A:")
print(A)
print("\nВектор b:", b)

# ============================================
# МЕТОД ЖОРДАНА-ГАУССА
# ============================================

def gauss_jordan(A, b):
    n = len(A)
    aug = np.hstack([A.copy(), b.reshape(-1,1)])
    
    print("\nНачальная расширенная матрица:")
    print(aug)
    
    for i in range(n):
        # Выбор главного элемента
        pivot_row = i
        max_val = abs(aug[i, i])
        for k in range(i+1, n):
            if abs(aug[k, i]) > max_val:
                max_val = abs(aug[k, i])
                pivot_row = k
        
        if pivot_row != i:
            aug[[i, pivot_row]] = aug[[pivot_row, i]]
            print(f"\nШаг {i+1}: перестановка строк {i+1} и {pivot_row+1}")
        
        aug[i] = aug[i] / aug[i, i]
        print(f"\nШаг {i+1}.1: нормализация строки {i+1}")
        
        for j in range(n):
            if j != i:
                aug[j] = aug[j] - aug[j, i] * aug[i]
        print(f"Шаг {i+1}.2: исключение из остальных строк")
        print(aug)
    
    return aug[:, -1]

solution_gj = gauss_jordan(A, b)

print("\n" + "="*40)
print("РЕШЕНИЕ МЕТОДОМ ЖОРДАНА-ГАУССА:")
print("="*40)
for i, val in enumerate(solution_gj, 1):
    print(f"x{i} = {val:.10f}")

# Проверка
residual = A @ solution_gj - b
print("\nНевязки:")
for i, r in enumerate(residual, 1):
    print(f"Уравнение {i}: {r:.2e}")

# ============================================
# МЕТОД ЗЕЙДЕЛЯ
# ============================================

print("\n" + "="*60)
print("МЕТОД ЗЕЙДЕЛЯ")
print("="*60)

def seidel_method(A, b, x0=None, tol=1e-12, max_iter=100):
    n = len(A)
    if x0 is None:
        x0 = np.zeros(n)
    
    x = x0.copy()
    history = [x.copy()]
    
    print("\n Итерация         x1              x2              x3              x4          погрешность")
    print("-" * 85)
    
    for k in range(max_iter):
        x_prev = x.copy()
        
        for i in range(n):
            s = 0
            for j in range(n):
                if j != i:
                    s += A[i, j] * x[j]
            x[i] = (b[i] - s) / A[i, i]
        
        err = np.linalg.norm(x - x_prev, np.inf)
        history.append(x.copy())
        
        print(f"{k+1:3d}     {x[0]:12.10f}   {x[1]:12.10f}   {x[2]:12.10f}   {x[3]:12.10f}   {err:.2e}")
        
        if err < tol:
            print(f"\nСходимость достигнута за {k+1} итераций")
            break
    
    return x, history, k+1

zeidel_solution, history, iterations = seidel_method(A, b, tol=1e-12, max_iter=50)

print("\n" + "="*40)
print("СРАВНЕНИЕ РЕЗУЛЬТАТОВ:")
print("="*40)
print("Жордан-Гаусс:", [f"{x:.10f}" for x in solution_gj])
print("Зейдель:    ", [f"{x:.10f}" for x in zeidel_solution])

# ============================================
# МАТРИЦА ИТЕРАЦИЙ ЗЕЙДЕЛЯ
# ============================================

print("\n" + "="*60)
print("МАТРИЦА ИТЕРАЦИЙ МЕТОДА ЗЕЙДЕЛЯ")
print("="*60)

def seidel_iteration_matrix(A):
    n = len(A)
    L = np.zeros((n, n))
    D = np.zeros((n, n))
    R = np.zeros((n, n))
    
    for i in range(n):
        for j in range(n):
            if i > j:
                L[i, j] = A[i, j]
            elif i == j:
                D[i, j] = A[i, j]
            else:
                R[i, j] = A[i, j]
    
    print("\nL (нижняя треугольная):")
    print(L)
    print("\nD (диагональная):")
    print(D)
    print("\nR (верхняя треугольная):")
    print(R)
    
    LD = L + D
    print("\n(L + D):")
    print(LD)
    
    LD_inv = np.linalg.inv(LD)
    print("\n(L + D)^(-1):")
    print(LD_inv)
    
    B_seidel = -np.dot(LD_inv, R)
    print("\n" + "="*40)
    print("ИТЕРАЦИОННАЯ МАТРИЦА ЗЕЙДЕЛЯ B_seidel:")
    print("="*40)
    print(B_seidel)
    
    norm_B = np.max(np.sum(np.abs(B_seidel), axis=1))
    print(f"\nНорма матрицы Зейделя: ||B|| = {norm_B:.6f}")
    
    if norm_B < 1:
        print(f"\n✓ Норма < 1 => метод Зейделя СХОДИТСЯ")
        print(f"  Оценка скорости: 1/||B|| = {1/norm_B:.2f}")
    else:
        print(f"\n✗ Норма >= 1 => метод может расходиться")
    
    return B_seidel, norm_B

B_seidel, norm_B = seidel_iteration_matrix(A)

# ============================================
# ГРАФИК СХОДИМОСТИ (ДОЛЖЕН РАБОТАТЬ)
# ============================================

print("\n" + "="*60)
print("ПОСТРОЕНИЕ ГРАФИКА СХОДИМОСТИ...")
print("="*60)

# Вычисляем погрешности на каждой итерации
errors = []
for k in range(len(history)):
    error = np.linalg.norm(history[k] - solution_gj, np.inf)
    errors.append(error)

# Создаём график
plt.figure(figsize=(10, 6))
plt.semilogy(errors, 'b-o', linewidth=2, markersize=6)
plt.xlabel('Номер итерации', fontsize=12)
plt.ylabel('Погрешность (логарифмическая шкала)', fontsize=12)
plt.title('Сходимость метода Зейделя (Вариант 7)', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=1e-12, color='r', linestyle='--', label='Точность 1e-12')
plt.legend()
plt.tight_layout()

# Сохраняем и показываем
plt.savefig('convergence_variant7.png', dpi=150)
plt.show()

print("\nГрафик сохранен: convergence_variant7.png")
print("График должен открыться в отдельном окне!")

# ============================================
# ДОПОЛНИТЕЛЬНЫЙ ВАРИАНТ (по желанию)
# ============================================

print("\n" + "="*60)
print("РАБОТА ЗАВЕРШЕНА")
print("="*60)