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
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np import math from mpl_toolkits.mplot3d import Axes3D from matplotlib import animation DIM = 2 ##次元 D = 1 #pi = math.pi ##円周率 r = 1.0 ##粒子半径,アニメーションにのみ使用 dx = 2.0*r ##初期粒子間距離 h = 1.0*dx ##1~1.2の間でかける re = 3.0*h ##影響半径 ##解析範囲の設定 H = 20 ##解析範囲の高さ方向の粒子数 W = 20 ##解析範囲の高さ方向の粒子数 ρ0 = 2700.0 ##水の密度 T = 1.0 dt =0.1 TH_O = 1200 ms = 16 Rx_wall = [] ##壁粒子の位置 Ry_wall = [] Rx_in = [] ##内部粒子の位置 Ry_in = [] C_x_f = 2*re ##坩堝の左下の粒子位置x C_x_l = W*(2*r) - 2*re ##坩堝の右下の粒子番号x for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく for k in range(0,H): x = r + i*(2*r) y = r + k*(2*r) if x <= C_x_f and C_x_f <= y:##左上 Rx_wall.append(x) Ry_wall.append(y) if y < C_x_f:##真下 Rx_wall.append(x) Ry_wall.append(y) if C_x_l <= x and C_x_f <= y: Rx_wall.append(x) Ry_wall.append(y) N_wall = len(Rx_wall) ##壁粒子の数 for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく for k in range(0,H): x = r + i*(2*r) y = r + k*(2*r) if C_x_f <= x and x < W*(2*r)-C_x_f and C_x_f <= y : Rx_in.append(x) Ry_in.append(y) N_in = len(Rx_in) ##坩堝内の粒子数 N = N_in + N_wall #print(Rx_in,Ry_in) print("粒子数",N,"壁内粒子数",N_in,"壁粒子数",N_wall) plt.plot(Rx_wall,Ry_wall,color = "k",linestyle = "None",marker ="o",markersize = ms) plt.plot(Rx_in,Ry_in,color = "b",linestyle = "None",marker ="o",markersize = ms) plt.show() Rx = np.zeros(N,dtype=np.float) Ry = np.zeros(N,dtype=np.float) for i in range(N): if i < N_in: Rx[i] = Rx_in[i] Ry[i] = Ry_in[i] if N_in <= i: Rx[i] = Rx_wall[i-N_in] Ry[i] = Ry_wall[i-N_in] fig = plt.figure() ims = [] TH = np.zeros(N,dtype=np.float) r_TH_O = 5 for t in range(int(T/dt)+1): print(t*dt) for i in range(N):##温度拡散の計算、i粒子について調べる dTH = 0 for k in range(N):##k粒子がi粒子の近傍に存在するか確認 dis = math.sqrt((Rx[i]-Rx[k])**2 + (Ry[i]-Ry[k])**2) s = dis/h if s < 1.0 and 0.0 < s : 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) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 elif s < 2.0 and 1.0 <= s : fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 elif s < 3.0 and 2.0 <= s : fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 else: continue TH[i] += dTH for i in range(N): 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度にする TH[i]=TH_O THi = list(map(float,TH)) im = plt.scatter(Rx,Ry, vmin=min(THi), vmax=max(THi), c=THi, cmap="plasma",s = ms*9) ims.append([im]) cbar = plt.colorbar() ani = animation.ArtistAnimation(fig, ims) plt.show() ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow')
まだ回答がついていません
会員登録して回答してみよう