python で熱拡散の様子がわかるアニメーションを作っています。
アニメーションを出力することはできたのですが、gif保存ができずに困っています。
どうゆう箇所をチェックすればよろしいでしょうか?
プログラミング初心者故によくわからず、検討違いかもしれませんが
pythonやanacondaを再インストールしましたが同じようなエラーが出力されました。
OS:win10
python3.8
anadonda3を利用しています。
以下がエラー文になります。
Traceback (most recent call last):
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 230, in saving
yield self
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 568, in grab_frame
self._frames.append(Image.frombuffer(
File "C:\Users\kstkh\anaconda3\lib\site-packages\PIL\Image.py", line 2706, in frombuffer
im = im._new(core.map_buffer(data, size, decoder_name, 0, args))
ValueError: buffer is not large enough
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "try2.py", line 116, in <module>
ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow')
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\kstkh\anaconda3\lib\contextlib.py", line 131, in exit
self.gen.throw(type, value, traceback)
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 232, in saving
self.finish()
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 574, in finish
self._frames[0].save(
IndexError: list index out of range
以下がコードになります。
何卒よろしくお願い致します。
python
1 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4import numpy as np 5import math 6from mpl_toolkits.mplot3d import Axes3D 7from matplotlib import animation 8 9 10DIM = 2 ##次元 11D = 1 12 13#pi = math.pi ##円周率 14r = 1.0 ##粒子半径,アニメーションにのみ使用 15dx = 2.0*r ##初期粒子間距離 16h = 1.0*dx ##1~1.2の間でかける 17re = 3.0*h ##影響半径 18##解析範囲の設定 19H = 20 ##解析範囲の高さ方向の粒子数 20W = 20 ##解析範囲の高さ方向の粒子数 21ρ0 = 2700.0 ##水の密度 22T = 1.0 23dt =0.1 24TH_O = 1200 25ms = 16 26 27Rx_wall = [] ##壁粒子の位置 28Ry_wall = [] 29 30Rx_in = [] ##内部粒子の位置 31Ry_in = [] 32 33C_x_f = 2*re ##坩堝の左下の粒子位置x 34C_x_l = W*(2*r) - 2*re ##坩堝の右下の粒子番号x 35 36 37for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 38 for k in range(0,H): 39 x = r + i*(2*r) 40 y = r + k*(2*r) 41 if x <= C_x_f and C_x_f <= y:##左上 42 Rx_wall.append(x) 43 Ry_wall.append(y) 44 if y < C_x_f:##真下 45 Rx_wall.append(x) 46 Ry_wall.append(y) 47 if C_x_l <= x and C_x_f <= y: 48 Rx_wall.append(x) 49 Ry_wall.append(y) 50 51N_wall = len(Rx_wall) ##壁粒子の数 52 53for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 54 for k in range(0,H): 55 x = r + i*(2*r) 56 y = r + k*(2*r) 57 if C_x_f <= x and x < W*(2*r)-C_x_f and C_x_f <= y : 58 Rx_in.append(x) 59 Ry_in.append(y) 60 61N_in = len(Rx_in) ##坩堝内の粒子数 62N = N_in + N_wall 63#print(Rx_in,Ry_in) 64print("粒子数",N,"壁内粒子数",N_in,"壁粒子数",N_wall) 65plt.plot(Rx_wall,Ry_wall,color = "k",linestyle = "None",marker ="o",markersize = ms) 66plt.plot(Rx_in,Ry_in,color = "b",linestyle = "None",marker ="o",markersize = ms) 67plt.show() 68 69 70 71 72Rx = np.zeros(N,dtype=np.float) 73Ry = np.zeros(N,dtype=np.float) 74for i in range(N): 75 if i < N_in: 76 Rx[i] = Rx_in[i] 77 Ry[i] = Ry_in[i] 78 if N_in <= i: 79 Rx[i] = Rx_wall[i-N_in] 80 Ry[i] = Ry_wall[i-N_in] 81fig = plt.figure() 82ims = [] 83 84TH = np.zeros(N,dtype=np.float) 85r_TH_O = 5 86 87for t in range(int(T/dt)+1): 88 print(t*dt) 89 90 for i in range(N):##温度拡散の計算、i粒子について調べる 91 dTH = 0 92 for k in range(N):##k粒子がi粒子の近傍に存在するか確認 93 dis = math.sqrt((Rx[i]-Rx[k])**2 + (Ry[i]-Ry[k])**2) 94 s = dis/h 95 if s < 1.0 and 0.0 < s : 96 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0 -75.0*(1.0-s)**4.0) 97 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 98 elif s < 2.0 and 1.0 <= s : 99 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0) 100 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 101 elif s < 3.0 and 2.0 <= s : 102 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0) 103 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 104 else: 105 continue 106 TH[i] += dTH 107 for i in range(N): 108 if Ry[i] >= H*(2*r)-2*r and r+r*W-r_TH_O <= Rx[i] and Rx[i] <= r+r*W+r_TH_O:##坩堝の照射範囲内にある粒子を強制的に1200度にする 109 TH[i]=TH_O 110 THi = list(map(float,TH)) 111 im = plt.scatter(Rx,Ry, vmin=min(THi), vmax=max(THi), c=THi, cmap="plasma",s = ms*9) 112 ims.append([im]) 113 114cbar = plt.colorbar() 115ani = animation.ArtistAnimation(fig, ims) 116plt.show() 117ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow') 118 119