2014-08-27 66 views
0

我從來沒有嘗試過在python中做動畫之前提前道歉,這個問題看起來很愚蠢。我在論壇上四處張望,但努力尋找任何人進行模擬,就像我隨着時間的推移有一個我能夠理解的答案。隨着時間的推移一維動畫使用matplotlib

我有一個變量(maxfs),它是時間(t)的函數。我已經計算了h並且創建了一些一維地塊,並且我可以繪製不同的時間步長,因爲maxfs會隨着時間而演變,但只能通過手動更改t來進行。然而,我將在演示文稿中介紹一些數據,並且爲了演示目的,我想說明解決方案隨着時間的推移如何演變。我最初的想法是運行for循環for time(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() 

回答

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() 
+0

有編輯時間步長所以它是小於1的方式嗎? – user3771983 2014-08-27 17:36:22

+1

是的。將參數幀更改爲包含您想要的值的迭代。像frames = np.arange(1,10,0.1) – Molly 2014-08-27 17:39:37

相關問題