Как сделать анимацию для трех графиков сразу?
Есть часть программы, которая создаёт анимацию, по циклу кадров for i in range(m).
Число кадров m=50, 30, 20 соответственно для x=0.5, 0.3, 0.2.
for i in range(50):
clear_output(wait = True)
plt.plot(t, u[:, i], 'k-', lw = 2) # рисуем график 1
fig = plt.figure(1, figsize = (7, 5)) # холст
plt.xlim(0, 1) # границы осей, чтобы график не дёргался
plt.ylim(0, np.max(u))
plt.grid(ls = 'solid', lw = 0.5, color = 'g')
plt.xlabel('t',fontsize = 14) # создаём надписи осей
plt.ylabel('u(t, x)',fontsize = 14)
plt.title(f'Кадр:{i + 1}',fontsize = 14) #заголовок
plt.show() #отображение графика
sleep(0) # подождём интервал сек
Как мне сделать анимацию для 3 графиков, чтобы они выводились вместе, с styles[i], где styles = ('g-.', 'r--', 'b-').
Внизу программа, которая работает для x=0,5 при m=50.
Условие задачи.
Разработали функцию для расчета распределения температуры в стрежне. Необходимо для всех параметров, передаваемых функции сконструировать пользовательский интерфейс, разместить виджеты в два столбца, запуск расчёта осуществлять нажатием кнопки с надписью Запустить.
Анимировать отображение
u(t)дляx=0.2, 0.3. 0.5. Запускать/останавливать анимацию по нажатию кнопки (кнопок). Сделать так, чтобы приложение работало вVoila.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
from ipywidgets import widgets as w
from IPython.display import display, clear_output
from time import sleep # sleep(n) stop проги, m/c
def bar(b):
u0 = w_u0.value
dx = w_dx.value
tmax = w_tmax.value
dt = w_dt.value
alpha = w_alpha.value
C = w_C.value
D = w_D.value
p = w_p.value
i = w_i.value
# m = w_m.value
# tstep = w_tstep.value
styles = ('b-', 'r--', 'g-.')
nx = 101
nt = 100001
x = np.linspace(0, 1, nx)
t = np.linspace(0, 1, nt)
A = dt/C*D/dx**2
B = 2*A + alpha*dt/C - 1
P = np.ones((nt, nx))*(p + alpha*u0)*dt/C
u = np.zeros((nt, nx))
for i in range(nt-1):
u[i+1, 1:-1] = A * u[i, 2:] - B * u[i, 1: -1] + A * u[i, 0: -2] + P[i, 1: -1]
xs = [0.5, 0.3, 0.2]
with out2:
for i in range(50):
clear_output(wait = True)
plt.plot(t, u[:, i], 'k-', lw = 2) # рисуем график 1
fig = plt.figure(1, figsize = (7, 5)) # холст
plt.xlim(0, 1) # границы осей, чтобы график не дёргался
plt.ylim(0, np.max(u))
plt.grid(ls = 'solid', lw = 0.5, color = 'g')
plt.xlabel('t',fontsize = 14) # создаём надписи осей
plt.ylabel('u(t, x)',fontsize = 14)
plt.title(f'Кадр:{i + 1}',fontsize = 14) #заголовок
plt.show() #отображение графика
sleep(0) # подождём интервал сек
return u, t, x
# Области вывода
out1 = w.Output(layout = {'widtg':'50%'}) # для виджетов
out2 = w.Output(layout = {'widtg':'50%'}) # для аним
# Виджеты параметров функции bar()
w_u0_L = w.Label('температура среды, U0:')
w_u0 = w.IntSlider(value = 0, min = 0, max = 20, step = 1 )
w_dx_L = w.Label('шаг по пространственнной координате, dx:')
w_dx = w.FloatText(value = 0.01)
w_tmax_L = w.Label('время интегрирования уравнения, tmax:')
w_tmax = w.FloatText(value = 0.1)
w_dt_L = w.Label('шаг по времени, dt:')
w_dt = w.FloatText(value = 1e-6)
w_alpha_L = w.Label('теплоотдача, alpha:')
w_alpha = w.IntText(value = 1)
w_C_L = w.Label('теплоемкость, C:')
w_C = w.IntText(value = 1)
w_D_L = w.Label('теплопроводность, D:')
w_D = w.IntText(value = 10)
w_p_L = w.Label('мощность, P:')
w_p = w.IntText(value = 1000)
w_i_L = w.Label('Интервал')
w_i = w.IntSlider(value = 331, min = 1, max = 500, step = 10)
# w_tstep_L = w.Label('Скорость')
# w_tstep = w.IntSlider(value = 370, min = 10, max = 500, step = 10)
# w_m_L = w.Label('Число кадров')
# w_m = w.IntSlider(value = 50, min=10, max=200, step=10)
btn = w.Button(description = 'Запустить', button_style = 'success') # кнопка
# Обработчик событий, связываем w_btn с bar()
btn.on_click(bar)
# Свёрстка интер
vbox1 = w.VBox([w_u0_L, w_u0, w_dx_L, w_dx,
w_tmax_L, w_tmax, w_dt_L, w_dt]) # виджет контейекр vbox1
vbox2 = w.VBox([w_alpha_L, w_alpha, w_C_L, w_C,
w_D_L, w_D, w_p_L, w_p, w_i_L, w_i, btn]) # виджет контейекр vbox2
hbox = w.VBox([vbox1, vbox2])
display(w.HBox([out1, out2]))
# Отобр для польз
with out1:
display(hbox)