二次元の波動方程式を数値的に時に、時間による波の形の推移をアニメーションに表示するプログラムを作成しました。このプログラムにおいて、t=0.5,1など、指定した時間における波の状態のみを画像で出力して保存したいのですが、うまくいきません。現状アニメーションまではちゃんと動作しています。下のプログラムについて、三変数関数であるuに対して、変数であるtの部分に時刻を指定してやればいいと思ったのですが、tに具体的な数字を入れるだけでは作動してくれません。どうすればいいでしょうか?
python
1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.animation as animation 5 6#パラメータ設定 7dx = 0.02 8dy = dx 9dt = 0.01 10tmin = 0.0 11tmax = 3.0 12 13#正方形エリアの設定 14xmin = 0.0 15xmax = 1.0 16ymin = 0.0 17ymax = 1.0 18 19v = 1.0 20rsq = (v*dt/dx)**2 21 22#分割数の設定 23nx = int((xmax-xmin)/dx)+1 24ny = int((ymax-ymin)/dy)+1 25nt = int((tmax-tmin)/dt)+2 26 27X = np.linspace(xmin,xmax,nx) 28Y = np.linspace(ymin,ymax,ny) 29X,Y = np.meshgrid(Y,X) 30 31u = np.zeros((nt,nx,ny)) 32 33#初期条件 34u_0 = np.exp(-(X-0.5)**2*3)*np.exp(-(Y-0.5)**2*3)*2 35u_1 = np.zeros((nx,ny)) 36u[0] = u_0 37u[1] = u[0]+dt*u_1 38 39#計算 40for t in range(1,nt-1): 41 for x in range(1,nx-1): 42 for y in range(1,ny-1): 43 u[t+1,x,y] = 2*(1-2*rsq)*u[t,x,y]-u[t-1,x,y]+rsq*(u[t,x-1,y]+u[t,x+1,y]+u[t,x,y-1]+u[t,x,y+1]) 44 #for x in range(1,nx-1): 45 #u[t+1,x,0] = u[t+1,x,1] 46 #u[t+1,x,ny-1] = u[t+1,x,ny-2] 47 #for y in range(1,ny-1): 48 #u[t+1,x,0] = u[t+1,1,y] 49 #u[t+1,nx-1,y] = u[t+1,nx-2,y] 50 #u[t,0,0] = (u[t,1,0]+u[t,0,1])/2 51 #u[t,nx-1,0] = (u[t,nx-2,0]+u[t,nx-1,1])/2 52 #u[t,0,ny-1] = (u[t,1,ny-1]+u[t,0,ny-2])/2 53 #u[t,nx-1,ny-1] = (u[t,nx-2,ny-1]+u[t,nx-1,ny-2])/2 54fig = plt.figure() 55fig.set_dpi(100) 56ax = Axes3D(fig) 57 58def animate(i): 59 ax.clear() 60 ax.plot_surface(X,Y,u[i],rstride=1,cstride=1,cmap=plt.cm.coolwarm) 61 ax.set_zlim(-3,3) 62 63anim = animation.FuncAnimation(fig,animate,frames=nt-1,interval=10,repeat=False) 64anim.save("animation1.gif",writer="pillow") 65 66 67plt.show()
このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
pythonのコードの一番最初の行のすぐ上に
```python
だけの行を追加してください
また、pythonのコードの一番最後の行のすぐ下に
```
だけの行を追加してください
現状、コードがとても読み辛いです
質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
申し訳ありません。修正いたしました。
> uに対して、変数であるtの部分に時刻を指定
u[int(時刻/dt)]
で、どうでしょうか?
時刻はtmin〜tmaxのどれか
plt.plot(X,Y,u[int(0.5/dt),X,Y])
このような感じでつけてみましたが、「arrays used as indices must be of integer (or boolean) type」というエラーが発生しました。
plot()じゃなくてplot_surface()です
また、u[int(0.5/dt),X,Y]の「,X,Y」は要らないはず
anim =...
anim.save(...
の行を無効にして、その代わりに
plt.show()
のすぐ上に
animate(int(時刻/dt))
を追加したら、どうでしょうか?
解決しました!本当にありがとうございました!
回答1件
あなたの回答
tips
プレビュー