# Левое граничное условие при x=0
def f(t):
return 0
# Начальное распределение u(x) при t=0
def uo(x):
return math.exp(-((x-0.3)**2)/0.01)
# Правая часть исходного уравнения
def phi(u, x, t):
return 0
# Подключение пакетов
import math
import matplotlib.pyplot as plt
from threading import Thread
# Коэффициент в уравнении переноса
c=2
# Начальная координата, конечная координата и число точек разбиения
x0=0
xn=1
N=100
# Начальное время, конечное время и число точек разбиения
t0=0
tm=0.1
M=100
# Приращения по координате и времени
dx=(xn-x0)/(N-1)
dt=(tm-t0)/(M-1)
# Объявление массивов
U0=[]
U=[]
x=[]
t=[]
# Инициализация массивов
for i in range(0,N):
x.append(x0+i*dx)
U0.append(uo(x[i]))
U.append(U0[i])
# Начальное время
t.append(t0)
# Создание фигуры
plt.ion()
# Цикл по времени
for k in range(1,M):
# Граничное условие
U[0]=f(0)
# Заполнение массива времени
t.append(t0+k*dt)
# Цикл по координате
for i in range(1,N):
# Явная разностная схема
U[i]=U0[i]+dt*(phi(U0[i],x[i],t[k])-c*(U0[i]-U0[i-1])/dx)
# Переход из одного временного шага к другому
U0=U;
# Построение грацика
plt.clf()
plt.plot (x, U)
plt.grid()
plt.xlim(0,1)
plt.ylim(0,1)
plt.xlabel('x')
plt.ylabel('u(x)')
plt.title('t = '+str(float("{0:.3f}".format(t[k]))))
plt.draw()
plt.pause(0.01)
plt.ioff()
# Отрисовка графика
plt.show()