前提・実現したいこと
微分方程式(一次元熱伝導方程式)を差分化し、陰解法で解いて、その計算結果を時間ごとに改行された1つのファイル(テキストファイル、Excelファイルどちらでもいいです。)に出力したいと考えています。
発生している問題・エラーメッセージ
時間ごとにfor文を回して計算し、for文の中で計算結果を出力して改行するというのを繰り返して出力したいのですが、openpyxlやcsv、np.savetxtを試してみてもうまくできませんでした。また、ネットには出力を1回だけする例はありますが、出力を複数回する例はなく困っております。どのようにすればうまく出力されるのかご教示頂けると幸いです。
該当のソースコード
Python
1import matplotlib.pyplot as plt 2import matplotlib.animation as animation 3import numpy as np 4 5 6 7den = 1000.0 #kg/m^3 8cp = 4217.0 #J/(kgK) 9cond = 0.569 #W/(mK) 10temp_bc = -10.0 11temp_init = 0.0 12lx = 0.4 13nx = 401 14tend = 700.0 15dt = 0.1 16tout = 50.0 17eps = 1.0e-6 18itermax = 1000 #物性値など 19 20alpha = cond / (den * cp) 21dx = lx / (nx - 1) 22nt = int(tend / dt) 23nout = int(tout / dt) 24 25ck = alpha * dt / (dx * dx) 26 27 28temp = np.full(nx, temp_init) 29time = 0.0 #initial condition 30 31temp_old = np.zeros(nx) 32 33 34temp[0] = temp_bc # Dirichlet @ x=0 35temp[nx-1] = temp[nx-2] # Neumann @ x=Lx # Boundary condition 36 37 38ims = [] 39fig = plt.figure() 40ax = fig.add_subplot(1, 1, 1) # graph data array 41 42gx = np.zeros(nx) 43for i in range(nx): 44 gx[i] = i * dx 45 46 47for n in range(1, nt+1): # time loop 48 49 for i in range(nx): # full-implicit with Gauss-Seidel 50 temp_old[i] = temp[i] 51 52 for iter in range(itermax): 53 resd = 0.0 54 for i in range(1,nx-1): 55 tp = temp[i] 56 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 57 resd += abs(temp[i] - tp) 58 if resd <= eps: 59 break 60 for iter in range(itermax): 61 resd = 0.0 62 for i in range(1,nx-1): 63 tp = temp[i] 64 if temp[i] <= 0: 65 if temp[i] >= -0.1: 66 cp = 3333925.0 #J/kgK 比熱に潜熱を盛り込む 67 alpha = cond / (den * cp) 68 ck = alpha * dt / (dx * dx) 69 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 70 else: 71 cp = 2067.0 #J/kgK 氷の比熱 72 cond = 2.22 #W/mK 氷の熱伝導率 73 alpha = cond / (den * cp) 74 ck = alpha * dt / (dx * dx) 75 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 76 77 resd += abs(temp[i] - tp) 78 if resd <= eps: 79 break 80 81 np.savetxt('result.csv',temp ,delimiter=',',fmt='%.3f') #テキストファイルに書き込み 82 83 84 temp[0] = temp_bc # Dirichlet @ x=0 85 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx # Boundary condition 86 87 time += dt 88 89 if n % nout == 0: 90 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}, iter: {3:4d}'.format(n, time, temp[nx-1], iter)) 91 im_line = ax.plot(gx, temp, 'b') 92 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 93 ims.append(im_line + [im_time]) 94 95 96ax.set_xlabel('x [m]') 97ax.set_ylabel('Temperature [C]') 98ax.grid() 99anm = animation.ArtistAnimation(fig, ims, interval=50) 100anm.save('animation.gif', writer='pillow') 101plt.show() #animation
試したこと
tempを時間ごとに出力しようとしております。tempはnp.fullの配列で、時間ごとにfor文を回して計算するとtempの値も変わるため、時間毎に出力する必要があります。
現在は
np.savetxt('result.csv',temp ,delimiter=',',fmt='%.3f')
の部分で出力しようと試みています。
しかし、データは一列しか出力されず、うまくいっていません。
補足情報(FW/ツールのバージョンなど)
Spyder 4.2.0
Python 3.8
を使用しております。
回答1件
あなたの回答
tips
プレビュー