Я никогда раньше не пробовал делать анимацию на python, поэтому заранее извиняюсь, этот вопрос кажется глупым. Я искал на форуме, но изо всех сил пытался найти кого-нибудь, кто делал бы симуляцию, как я, со временем, у которого был ответ, который я мог понять.

У меня есть переменная (maxfs), которая является функцией времени (t). Я вычислил h и сделал несколько одномерных графиков, и я могу построить различные временные интервалы по мере того, как 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
user3771983 27 Авг 2014 в 15:36

1 ответ

Лучший ответ

Вы можете создать анимацию, используя цикл for, как вы предлагаете, и отображать или сохранять каждый график по мере его создания. Вы также можете использовать модуль анимации Matplotlib. Это позволит вам сохранить вашу анимацию в формате, который можно будет включить в презентацию. Там модуль анимации позволяет вам определить функцию, которая обновляет художников на каждой итерации. В вашем примере это будет обновлять две строки каждый раз. Этот базовый пример делает нечто подобное. Также может оказаться полезным учебное пособие, которое здесь.

Вот пример, в котором используется более простая математика, чем вы включили, но он должен дать вам представление:

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()
2
Molly 27 Авг 2014 в 20:43
1
Да. Измените фреймы аргументов на итерацию, которая содержит нужные вам значения t. Что-то вроде frames = np.arange (1,10,0.1)
 – 
Molly
27 Авг 2014 в 21:39