2016-04-22 2 views
0

これは、matplotlibでアニメーションを行うために書いたプログラムです。このプログラムは、最初に六方格子で配列された18個の粒子からなるシステムに関する。初期構成は、simPoints(simData)の定義で与えられています。Pythonのマルチボディアニメーションは静的なピクチャを返します

システムは、規則x[i]=x[i]+L/2.0に従って、x方向およびy方向の両方向に進化しています。窓から出てくる粒子は反対側から持ち込まれます。これらの更新は、関数simData()に記載されています。

しかし、このコードから抜け出すのは、パーティクルの初期設定の静的な画像です。

from numpy import* 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

L=1   # lattice constant = sigma*2**0.5 (Let) 

x=zeros(18,float) 
y=zeros(18,float) 


#~~~~~~~~~~~~~~~~~ ANIMATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
def simData(): 
    t = 1 
    while t<=20: 
     for i in range(18): 
      x[i]=x[i]+L/2.0 
      y[i]=y[i]+L/2.0 
      if x[i]>L*3:     # translate back the particle if it goes out of window limit 0 to L*cell 
       x[i]=x[i]-L*3 
      elif x[i]<0: 
       x[i]=L*3-x[i] 
      if y[i]>L*3:     # translate back the particle if it goes out of window limit 0 to L*cell 
       y[i]=y[i]-L*3 
      elif y[i]<0: 
       y[i]=L*3-y[i] 
     t=t+1 
    yield x, y 

def simPoints(simData): 
    k=0 
    for i in range(0,6,1): 
     for j in range(0,6,1): 
      if (i+j)%2==0: 
       x[k]=i*L*.5+.25*L 
       y[k]=j*L*.5+.25*L 
       k=k+1 
    line.set_data(x, y) 
    return line, 

fig = plt.figure() 
ax = fig.add_subplot(111) 

line, = ax.plot(x, y,'bo', ms=8) 
ax.set_ylim(0, L*3) 
ax.set_xlim(0, L*3) 
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=100) 

plt.show() 

格子をアニメーション化するにはどうすればよいですか?私は、引数interval=100が賢明に使われていないと感じています。

+0

この質問は、私が昨日尋ねた別の質問の続きです。 @Reblochonによって私の主な混乱が取り除かれましたが、私の要求に合うようにプログラムを変更するのは難しかったので、私は再び尋ねなければなりませんでした。 – kanayamalakar

答えて

1

あなたのコードでは、以下のように少し変更が加えられました。今アニメーション化中ですが、simPoints()はコメントアウトされています。大きな問題は、そのようなポイントを初期化すると、各ステップの後で同じ場所に終わるということです。ドットは移動しますが、別のドットが配置されるので、プロットが動いていないように見えます。たとえば、変更をより微妙にするかランダムにするなど、この場合を避けるために、simData()関数を変更することができます。

from numpy import* 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

L=1   # lattice constant = sigma*2**0.5 (Let) 

x=array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18]) 
#x=zeros(18,float) 
y=zeros(18,float) 

#~~~~~~~~~~~~~~~~~ ANIMATION ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
def simData(): 
    t = 1 
    while t<=20: 
     for i in range(18): 
      x[i]=x[i]+L/2.0 
      y[i]=y[i]+L/2.0 
      if x[i]>L*3:     # translate back the particle if it goes out of window limit 0 to L*cell 
       x[i]=x[i]-L*3 
      elif x[i]<0: 
       x[i]=L*3-x[i] 
      if y[i]>L*3:     # translate back the particle if it goes out of window limit 0 to L*cell 
       y[i]=y[i]-L*3 
      elif y[i]<0: 
       y[i]=L*3-y[i] 
     t=t+1 

def simPoints(): 
    k=0 
    for i in range(0,6,1): 
     for j in range(0,6,1): 
      if (i+j)%2==0: 
       x[k]=i*L*.5+.25*L 
       y[k]=j*L*.5+.25*L 
       k=k+1 

fig = plt.figure() 
ax = plt.axes() 
#simPoints() 
line, = ax.plot(x, y,'bo', ms=8) 
ax.set_ylim(0, L*3) 
ax.set_xlim(0, L*3) 

def animate(i): 
    simData() 
    print x 
    line.set_data(x, y) 
    return line, 

ani = animation.FuncAnimation(fig, animate, blit=False, interval=100, frames=200) 

plt.show() 
1

アニメーションは問題なく動作します。あなたの問題はあなたのロジックの対称性です。アニメーションをテストするには、ランダムな値を追加してください:

def simPoints(simData): 
    k=0 
    for i in range(0,6,1): 
     for j in range(0,6,1): 
      if (i+j)%2==0: 
       # just add some randomness to see the random x-movement 
       x[k]=i*L*.5+.25*L + random.random(1) 
       y[k]=j*L*.5+.25*L 
       k=k+1 
    line.set_data(x, y) 
    return line, 

あなたが計算するすべてのポイントxyは、あらかじめ他のポイントで占有されています。したがって、静的に見えます。中間のステップを見たい場合は、データ生成を更新する必要があります(特に、モジュラスを取り除く必要があります)。境界線やグラフの限界を広げることで、ドットが動くのがわかります。

関連する問題