import numpy as np
# 1. Задание параметров сетки и границ
nx = 5
nt = 4
x1, xn = 0, 1
t1, tn = 0, 1 # (или y1, yn)
hx = (xn - x1) / (nx - 1)
ht = (tn - t1) / (nt - 1)
# Инициализация сетки U
u = [[1 for j in range(nt)] for i in range(nx)]
X = [hx * i for i in range(nx)]
T = [ht * j for j in range(nt)]
ti = [4 * 24 * t * (1 - t) for t in T]
psi = [14 * x * (1 - x) for x in X]
f = -368
u = np.array(u, dtype=float)
# Граничные и начальные условия
u[0, :] = ti
u[-1, :] = ti
u[:, 0] = psi
u[:, -1] = psi
e = 0.1 # Допустимая ошибка
z = 1.0 # Оценочная ошибка
uk = u.copy()
k = 0 # Счетчик итераций
# Итерационный цикл методом Зейделя / Пуассона
while z >= e:
# Пересчет внутренних узлов
for i in range(1, nx - 1):
for j in range(1, nt - 1):
u[i, j] = 0.25 * (u[i+1, j] + u[i-1, j] + u[i, j+1] + u[i, j-1] - (hx**2) * f)
# Расчет погрешности
z = np.max(np.abs(u - uk))
uk = u.copy()
k += 1
print(f"Решение сшлось за {k} итераций.")
print("Итоговая матрица u:")
print(np.round(u, 3))