我之前从未尝试过在python中做过动画,所以提前道歉这个问题似乎很愚蠢。我在论坛上环顾四周,但很难找到像我一样随时间进行模拟的人有一个我能够理解的答案。
我有一个变量(maxfs),它是time(t)的函数。我计算了h并制作了一些1D图,我可以绘制不同的时间步长,因为maxfs随着时间的推移而演变,但只能通过手动改变t。但是,我在演示文稿中提供了一些数据,出于演示目的,我想展示解决方案随着时间的推移如何演变。我最初的想法是运行一个for循环的时间(t)在所有点计算h(这是我在MATLAB中会做的),但是看看Matplotlib文档中的示例我不确定是否以这种方式执行动画是可能的。我已经在下面包含了我的代码,如果有人对我的原创想法是否可行的方法有任何建议,或者是否有一种非常好的替代方法。我是python的新手,所以理想情况下,如果可能的话,我正在寻找一个相当简单的解决方案,因为我的时间很短。提前致谢。
__author__="ahe"
__date__ ="$23-Jul-2014$"
import numpy as np
import matplotlib.pyplot as plt
import math
import sys
from math import sqrt
import decimal
from sklearn.metrics import mean_square_error
from matplotlib import gridspec
t=1
l=1
d=0.088
g=9.81
l2=l**2.0
# fs1=FS(0,0) fs2=FS(xm,0)
fs1=0.04
fs2=0.02
xm=-0.5
omega=((2*g*d)/l2)**0.5
B=g*((fs1-fs2)/(omega*xm))
C=fs1+(g*(((fs1-fs2)**2.0)/(4*omega*(xm**2.0))))
nx, ny = (101,101)
x5 = np.linspace(-2,2,nx)
y5 = np.linspace(-2,2,ny)
xv,yv = np.meshgrid(x5,y5)
x = np.arange(-2,2.04,0.04)
y = np.arange(-2,2.04,0.04)
nx2,ny2 = (111,111)
x10 = np.linspace(-2.2,2.24,nx2)
y10 = np.linspace(-2.2,2.24,ny2)
xv1,yv1 = np.meshgrid(x10,y10)
x1=np.arange(-2.2,2.22,0.04,dtype=float)
y1=np.arange(-2.2,2.22,0.04,dtype=float)
t59=np.arange (1,12321,1,dtype=float)
print len(x1),len(y1)
# Building the parabolic basin (Bottom)
zf=np.arange(len(t59),dtype=float)
zf= (0.088*((x1[None,:]**2)+(y1[:,None]**2)))-0.2
zf5=np.reshape(zf,(111,111))
zf1 = zf5[55,:]
zf2=zf1[5:106]
# End of building parabolic basin
h=np.zeros(len(x))
eq1=-((((B**2.0)*omega)/(4*g))*math.cos(2*omega*t))+C
term=(B*omega)/g
print 'eq1=',eq1,'term=',term
for i in range(len(x)):
h[i] = eq1 - ((term*math.cos(omega*t)*x[i]))
maxfs=np.maximum([zf2],[h])
maxfs=maxfs[0]
# PLOTTING
plt.figure(1)
plt.plot(x,maxfs,'r',lw=1.5)
plt.plot(x1,zf1,'k',lw=1.5)
plt.legend(['Analytical','Bathymetry'], loc='upper center',fancybox=True,prop={'size':12})
plt.ylabel('Free Surface [m]',fontsize=12)
plt.xlabel('Distance [m]',fontsize=12)
plt.axis([-2.5,2.5,-0.2,0.25])
plt.title ('Initial conditions for planar surface',fontsize=15)
#plt.text(-0.43,0.30,RMSE,fontsize=12,bbox=props)#,bbox=dict(facecolor='none',edgecolor='black'))
plt.show()
答案 0 :(得分:2)
您可以根据建议使用for循环创建动画,并在创建时显示或保存每个绘图。您也可以使用Matplotlib animation module。这将允许您以可包含在演示文稿中的格式保存动画。动画模块允许您定义在每次迭代时更新艺术家的功能。在您的示例中,每次都会更新两行。这个basic example做了类似的事情。教程here也可能有所帮助。
这是一个使用比你所包含的更简单的数学的例子,但应该给你一个想法:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# Set up the figure
fig = plt.figure(1)
# Creat two lines to be updates in the animation.
l1, = plt.plot([],[],'r',lw=1.5)
l2, = plt.plot([],[],'k',lw=1.5)
plt.legend(['Analytical','Bathymetry'], loc='upper center',fancybox=True,prop={'size':12})
plt.ylabel('Free Surface [m]',fontsize=12)
plt.xlabel('Distance [m]',fontsize=12)
plt.axis([-2.5,2.5,-0.2,0.25])
plt.title ('Initial conditions for planar surface',fontsize=15)
# Initialization function
def init():
l1.set_data([], [])
l2.set_data([], [])
return l1,l2
# This function is called at each iteration of the animation.
def update(t):
x = np.arange(-3,3,0.1)
x1 = np.arange(-3,3,0.1)
maxfs = 0.1 * np.sin(x * t)
zf1 = 0.1 * np.cos(x * t)
# Update lines with new data.
l1.set_data(x,maxfs)
l2.set_data(x1,zf1)
return l1,l2
# Create animation
ani = animation.FuncAnimation(fig, update, frames = 10, blit=True, init_func = init)
plt.show()