3

MatPlotLibFuncAnimation関数にいくつか問題があります。私はそれを私のコードに設定することができません...誰かが私を助けてくれることを願っています!!

これは拡散方程式です。時間の各ステップでプロットする必要があります。各ステップで、計算の結果はnumpy配列になります。pyplot.interactive(True)を使用して動的にプロットすることができますが、非常に時間がかかります。FuncAnimationがその問題に対処できることを読みましたが、リストまたは配列の結果を処理することができませんでした。

これが古典的な遅いプロットのコードです:それはすべての計算の後にプロット
されるベクトル(U )のベクトルを生成します

import numpy as np
import scipy
from scipy.linalg import solve_banded
from matplotlib import pyplot as plt
import matplotlib.animation as animation


def DrawRecord(U):
    plt.interactive(True)
    plt.figure(1)
    for i in range(0,len(U)):
        plt.clf()
        plt.plot(U[i])
        plt.ylim([0,1])
        plt.draw()

J=350.0 
dt=0.01 
T=3.0 
t=np.arange(dt,T,dt) 
dx=1.0/J 

D=0.005 
c=0.5 
r=0.1 

mu=c*dt/(2.0*dx) 
lambd=D*dt/(dx**2.0) 

K_x=50.0*np.ones(J-1) 
alpha_t=0.5*np.ones(len(t)) 

#initial conditions
u=np.zeros(J) 
u[J/5*1:J/5*2]=1 
U=u

espace=np.linspace(0,1,J) 

#Matrix
A=np.diag(-lambd*np.ones(J-2),1)+np.diag((1+2*lambd)*np.ones(J-1),0)+np.diag(-lambd*np.ones(J-2),-1)  
AA=scipy.linalg.inv(A)


for i in t:

    u[1:J]=scipy.dot(AA,u[1:J]+(r-alpha_t[i/dt])*dt*(u[1:J]-u[1:J]/K_x))
    u[0]=0 
    u[J-1]=0  

    U=np.vstack([U,u])

DrawRecord(U)

そして、これが前のコードでFuncAnimationをターンさせようとした私の試みです(大きな失敗):
nb: Uコンテンツ各ステップで計算された結果の配列

global U

fig = plt.figure()
window = fig.add_subplot(111)
line, = window.plot(list(U[1,:]))

def init():
    line=list(U[1,:])
    return line

def animate(i):
    line.set_ydata(list(U[i,:]))
    return line

anim = animation.FuncAnimation(fig, animate, init_func=init,
                           frames=200, interval=20, blit=True)

plt.show()

それは多くのエラーを生成します...多分誰かが前のコードのためにそれを設定することができます!
私ははっきりしていることを願っています(私の英語は申し訳ありません)そしてあなたの助けに感謝します。

4

3 に答える 3

2

FuncAnimationは、iterableがinitから戻って更新することを期待しています

これを試して:

def init():
    line.set_ydata(U[1,:])
    return line,
于 2012-11-23T06:37:08.560 に答える
1

init関数が正しくありません。次のようになります。

def init():
    line.set_ydata(U[1,:])
    return line

また、numpyスライスをリストに変換する必要はありません。

于 2012-11-14T23:17:02.750 に答える
1

同様のエラーが発生し、コンマを追加して修正しました。

def init():
    line.set_ydata(U[1,:])
    return line,

何らかの理由でこれはそれを修正しました。返すオブジェクトが複数ある場合は、末尾のコンマは必要ありません。あなたが私に尋ねれば、血まみれの不可解なエラーメッセージ。

于 2013-10-29T11:06:01.257 に答える