2017-02-07 2 views
1

Я пытаюсь анимировать два профиля Гаусса, чтобы они могли прогрессировать одновременно с одинаковой скоростью, точное решение будет сохранять исходный профиль, в то время как рассчитанное решение будет диффундировать со временем ,Анимация двух кривых в одном и том же графике в то же время в Matplotlib

Я сделал все вычисления, но я не мог анимировать две кривые, чтобы они могли прогрессировать вместе на одном и том же участке.

import numpy as np 
import pandas as pd 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.animation as animation 
%matplotlib notebook 

xmin = 0  # minimum value of x 
xmax = 2  # maximum value of x 
N = 200   # Number of nodes 
dt = 0.005  # time step 
tmax = 2  # solution time 
v = 0.5   # velocity 
t0 = 0 

# Discritize the domain 
dx = (xmax - xmin)/N 
x = np.arange(xmin-dx,xmax+dx,dx) 
# set initial condition 
u0 = np.exp(-200*np.square(x-0.25)) 

u = u0.copy() 
unp1 = u0.copy() 
unpf = [] 
uexact = [] 
t = np.arange(t0, tmax, dt) 
#Newman boundary condition no gradient across the boundary 
u[0]= u[2] 
u[-1]= u[N-1] 
#Loop through time 
nsteps = int(tmax/dt) 
for n in range (0,nsteps):  
    #Calculate the FOU scheme 
    for i in range (1, N+1): 
     unp1[i] = u[i] - v*(dt/dx)*(u[i]-u[i-1]) 
    unpf.append(unp1.copy()) 
    uexact.append(np.exp(-200*np.square(x-0.25-v*t[n]))) 
    u = unp1 

fig, ax = plt.subplots() 

plt.xlabel('x') 
plt.ylabel('u') 
plt.title('Initial condition') 
line, = ax.plot(x, u0) 
def animate(i): 
    line.set_ydata(uexact[i]) # update the data 
    return line, 
ani = animation.FuncAnimation(fig, animate, np.arange(1, len(uexact)), interval=100) 

line, = ax.plot(x, u0) 
ax.set_xlim(xmin, xmax) 
ax.set_xlabel('X nodes - Axis') 
ax.set_ylabel('Y nodes - Axis') 
def animate(i): 
    line.set_ydata(unpf[i]) # update the data 
    return line, 
ani = animation.FuncAnimation(fig, animate, np.arange(1, len(unpf)), interval=100) 
plt.show() 

ответ

0

Там нет оснований использовать два различных FuncAnimation S здесь, как вы хотите одну единственную анимацию, оживляющий двух или более объектов.

С unpf и uexact похоже, одинаковое количество предметов, реализация которых прямолинейна.

... # all other code 

line, = ax.plot(x, u0) 
line2, = ax.plot(x, u0) 
def animate(i): 
    line.set_ydata(uexact[i]) # update the data 
    line2.set_ydata(unpf[i]) # update the data 
    return line, line2, 

ani = animation.FuncAnimation(fig, animate, np.arange(1, len(unpf)), interval=100) 
plt.show() 
+0

Бак вам за помощь! – yassineCAE

Смежные вопросы