import numpy as np
def Пуассон(nx, nt, hx, ht, F, U_k):
U = U_k.copy()
for i in range(1, nx - 1):
for j in range(1, nt - 1):
U[i, j] = (
(U_k[i - 1, j] + U_k[i + 1, j]) / hx**2
+ (U_k[i, j - 1] + U_k[i, j + 1]) / ht**2
- F
) / (2 / hx**2 + 2 / ht**2)
return U
nx, nt = 5, 3
hx, ht = 1/4, 1/2
x1, xn = 0, 1
t1, tn = 0, 1
# Начальное приближение
U = [[1 for j in range(nt)] for i in range(nx)]
X = [x1 + hx * i for i in range(nx)]
T = [t1 + ht * j for j in range(nt)]
# Вариант: группа 24, студент 14
fi = [96 * t * (1 - t) for t in T]
psi = [56 * x * (1 - x) for x in X]
F = -304
# Граничные условия задачи Дирихле
U = np.array(U, dtype=float)
U[0], U[nx - 1] = fi, fi
U[:, 0], U[:, nt - 1] = psi, psi
e = 0.1 # допустимое изменение за итерацию
z = np.max(np.abs(U))
U_k = U.copy()
k = 0 # количество итераций
while z >= e:
U = Пуассон(nx, nt, hx, ht, F, U_k)
z = np.max(np.abs(U_k - U))
U_k = U.copy()
k += 1
print("Количество итераций:", k)
print("Z =", round(z, 6))
print("U — строки от x4 до x0:")
print(np.round(U[::-1], 3))