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


import numpy as np

A = [
    [2.4, 2.5, -2.9],
    [0.8, 3.5, -1.4],
    [1.5, -2.3, 8.6],
]
b = [4.5, 3.2, -5.5]
n = 3

# Приводим систему к виду x = B*x + c
B = []
c = []
for i in range(n):
    row = []
    for j in range(n):
        if i == j:
            row.append(0.0)
        else:
            row.append(-A[i][j] / A[i][i])
    B.append(row)
    c.append(b[i] / A[i][i])

# Входные данные
x0 = list(map(float, input("Начальное приближение (3 числа через пробел): ").split()))
eps = float(input("Точность: "))

# Проверка сходимости
rho = max(abs(np.linalg.eigvals(np.array(B))))
if rho >= 1:
    print("Методы не сходятся, max|λ(B)| =", rho)
    raise SystemExit
print("Условие сходимости выполнено, max|λ(B)| =", round(rho, 4))

# ---------- Метод простых итераций ----------
x = x0[:]
k1 = 0
while True:
    x_new = []
    for i in range(n):
        value = c[i]
        for j in range(n):
            value += B[i][j] * x[j]
        x_new.append(value)
    k1 += 1

    diff = 0
    for i in range(n):
        d = abs(x_new[i] - x[i])
        if d > diff:
            diff = d

    x = x_new
    if diff < eps:
        break

print("\nМетод простых итераций:")
for i in range(n):
    print("x%d = %.5f" % (i + 1, x[i]))
print("Количество итераций:", k1)

# ---------- Метод Зейделя ----------
x = x0[:]
k2 = 0
while True:
    diff = 0
    for i in range(n):
        value = c[i]
        for j in range(n):
            value += B[i][j] * x[j]
        d = abs(value - x[i])
        if d > diff:
            diff = d
        x[i] = value          # новое значение записываем сразу

    k2 += 1
    if diff < eps:
        break

print("\nМетод Зейделя:")
for i in range(n):
    print("x%d = %.5f" % (i + 1, x[i]))
print("Количество итераций:", k2)