我正在尝试将几种数值方案与PDE的精确解进行比较。为此,我尝试制作一个动画,其中有多个子图,每个子图都有两个正在演变的功能。 (精确的数字)
我发现了如何在此处制作多行动画, Matplotlib multiple animate multiple lines
我还发现了如何制作多个子图。 animated subplots using matplotlib
但是我不确定怎么做。当一起看时,它们看起来是如此混乱(我对matplotlib不太熟悉,尤其是FuncAnimation) 而且我还想将子图编号作为变量,以便用户可以输入任意数量的函数。
我的代码是这个。当前,此代码为每种数值方案生成图,但是我希望它仅绘制一个图。 因此,“绘图”功能只能调用一次,
plot(*arguments, FTCS, upwind, anotherfunc, anotherfunc2, ...)
这样。
抱歉,代码混乱。我附上所有这些只是为了 一个最小的工作示例。只有“绘图”功能与我的问题有关。
*修改后的代码。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
#dt=1/5
dx=1/400
tm=9
xm=1
C=0.8
u=.1
dt=dx*C/u
arguments=dt,dx,tm,xm,C
def plot(dt,dx,tm,xm,C,*funcs):
plt.figure()
fig,axes=plt.subplots(len(funcs))
i=1
for ax,func in zip(axes, funcs):
# plt.subplot(len(funcs),1,i)
x1,T1=func(dt,dx,tm,xm,C)
plotlays, plotcols = [2], ["black","red"]
lines = []
ax=plt.axes(xlim=(0,1),ylim=(-1.1,1.1))
line,=ax.plot([],[],lw=2)
for index in range(2):
lobj = ax.plot([],[],lw=2,color=plotcols[index])[0]
lines.append(lobj)
def init():
for line in lines:
line.set_data([],[])
return lines
def animate(i):
x=x1
y=T1[i]
y2=T2[i]
xlist=[x,x]
ylist=[y,y2]
for lnum,line in enumerate(lines):
line.set_data(xlist[lnum],ylist[lnum])
return lines
anim=animation.FuncAnimation(fig,animate,init_func=init,frames=np.shape(T1)[0],interval=20,blit=False)
plt.title('%s' % func.__name__)
plt.xlabel('x')
plt.ylabel('T')
i+=1
plt.show()
return
def finit(x):
if 0<=x<=.1:
return np.sin(10*np.pi*x)
else:
return 0
def FTCS(dt,dx,tm,xm,C):
x=np.arange(0,xm+dx,dx)
t=np.arange(0,tm+dt,dt)
lx=len(x)
lt=len(t)
T=np.zeros([lt,lx])
for i in range(0,lx):
T[0,i]=finit(x[i])
for n in range(0,lt-1):
for j in range(1,lx-1):
T[n+1,j]=T[n,j]-.5*C*(T[n,j+1]-T[n,j-1])
return x,T
def upwind(dt,dx,tm,xm,C):
x=np.arange(0,xm+dx,dx)
t=np.arange(0,tm+dt,dt)
lx=len(x)
lt=len(t)
T=np.zeros([lt,lx])
for i in range(0,lx):
T[0,i]=finit(x[i])
for n in range(0,lt-1):
for j in range(1,lx-1):
T[n+1,j]=(1-C)*T[n,j]+C*T[n,j-1]
return x,T
def exact(dt,dx,tm,xm,C):
x=np.arange(0,xm+dx,dx)
t=np.arange(0,tm+dt,dt)
u=C*dx/dt
T=np.zeros([len(t),len(x)])
for n in range(0,len(t)):
for j in range(0,len(x)):
if u*t[n]<x[j]<=u*t[n]+.1:
T[n,j]=np.sin(10*np.pi*(x[j]-u*t[n]))
else: T[n,j]=0
return T
plot(*arguments,FTCS,upwind)