Как сделать сюжет, который меняется со временем? - PullRequest
1 голос
/ 11 апреля 2020

Теперь вот код, с которым я работаю:

import numpy                       
from matplotlib import pyplot as plt     
import time, sys                   

nx = 41  
dx = 2 / (nx-1)
nt = 25    
dt = 0.025
c = 1      
fig = plt.figure()

u = numpy.ones(nx)    
u[int(.5 / dx):int(1 / dx + 1)] = 2  
print(u)


un = numpy.ones(nx)

for n in range(nt):
    un = u.copy()
    plt.plot(numpy.linspace(0, 2, nx), u)
    for i in range(1, nx):
        u[i] = un[i] - c*dt/dx * (un[i] - un[i - 1])

plt.show()

Это должно оживить решение уравнения ∂u / ∂t + c * ∂u / ∂x = 0; но я не знаю, как его оживить - потому что в текущем состоянии он сразу показывает функцию на всех временных шагах; и если вместо этого я помещу plt.show() внутри l oop (внешнего), он показывает графики по одному, и мне нужно закрыть окно графика, чтобы увидеть следующее, что не очень удобно.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

FuncAnimation может использоваться для создания анимации .

Код сообщения может быть представлен в виде анимации следующим образом:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation

nx = 41
dx = 2 / (nx-1)
nt = 25
dt = 0.025
c = 1
fig = plt.figure()

u = np.ones(nx)
u[int(.5 / dx):int(1 / dx + 1)] = 2

x = np.linspace(0, 2, nx)

plot1, = plt.plot(x, u)

def update(t):
    un = u.copy()
    for i in range(1, nx):
        u[i] = un[i] - c*dt/dx * (un[i] - un[i - 1])
    plot1.set_ydata(u)
    return plot1,

FuncAnimation(fig, update, frames=nt, blit=True)
plt.show()

PS: обратите внимание на запятую после plot1 в plot1, = plt.plot(.... Это захватывает первый элемент в списке, возвращаемый plt.plot.

0 голосов
/ 11 апреля 2020

Вы можете сохранить его как gif, используя следующее:

import numpy                       
from matplotlib import pyplot as plt     
import time, sys   
from celluloid import Camera
from IPython.display import Image

nx = 41  
dx = 2 / (nx-1)
nt = 25    
dt = 0.025
c = 1      
fig = plt.figure()

u = numpy.ones(nx)    
u[int(.5 / dx):int(1 / dx + 1)] = 2  
print(u)


un = numpy.ones(nx)
fig = plt.figure()
camera = Camera(fig)
for n in range(nt):
    un = u.copy()
    plt.plot(numpy.linspace(0, 2, nx), u, color= "blue")
    for i in range(1, nx):
        u[i] = un[i] - c*dt/dx * (un[i] - un[i - 1])
    camera.snap()

animation = camera.animate()
animation.save('solution.gif', writer = 'imagemagick')

По сути, он рекурсивно берет «привязку» камеры для каждого dt и объединяет их в gif, сохраненный как «solution.gif» в текущий рабочий каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...