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)