・目的
Pythonを使って一次元非定常熱伝導方程式を差分法で表したFTCS式で計算し、0℃の試料(深さ方向iの1次元のみ考える)に一定時間レーザー光を照射したときの温度分布をグラフに示したいと思っています。
・問題
コード中の(#レーザー吸収熱温度 Qの設定)で得た計算Qの配列を#FTCS式における別のtempという配列に足したいのですが、以下のエラーが表示され計算できませんでした。
(エラー内容)
#FTCS内のemp_new[i] = Q[i]+temp[i] +・・・式にてIndexError:list index out of rangeのエラー。Qの配列とtempの配列を同じ要素iでforループを回して#FTCS内の式で計算するにはどのように設定するべきでしょうか?
・FTCS式について
forループのiですが、試料を表面i=0から裏面に向かって深さ方向(一次元)に101等分した要素番号としています。表面i=0と裏面i=nxは境界条件を指定しているためforループに入れていません。FTCS式では、左辺(位置iにおける時間n+1の温度)=右辺(位置iおよびi-1、i+1の時間nの温度)で計算されています。時間については#timeループで時間の要素nについて回しています。
FTCS式では右辺は全て一つ前の時間のデータで計算する必要があるため、左辺をtemp_new[i]と別の配列に格納しています。FTCS法のforループが終わると、先程格納した temp_new を temp の配列にコピーして temp を更新します。#updateでforループを回し temp_new の各要素を temp の同じ番号の要素に代入しているような状態です。
今回はFTCS式の右辺にtempとは別の配列ですが、#レーザー光照射による吸収熱の設定、で与えた配列の中で位置iにおけるQ[i]を足したいと思っています。
import
1import matplotlib.animation as animation 2import numpy as np 3 4# input parameter(材料:Si、厚さ1㎜、微小間隔 dx:10㎛、計算期間tend:1μs、時間間隔dt:1ns、初期温度temp_init:0℃、空間分割数nx、時間分割数nt) 5den = 2330.0 6cp = 678.0 7cond = 83.7 8temp_init = 0.0 9lx = 0.001 10nx = 101 11tend = 0.000001 12dt = 0.000000001 13tout =0.000001 14a=0.064 15alpha = cond / (den * cp) 16dx = lx / (nx - 1) 17nt = int(tend / dt) 18nout = int(tout / dt) 19 20 21# レーザー光照射による吸収熱温度の設定 22Q=[2000000000000*dt*pow(2.718281828,-a*dx*i) for i in range(1, nx-1)] 23 24#initial condition Temp 25temp = np.full(nx, temp_init) 26time = 0.0 27 28temp_new = np.zeros(nx) 29 30# Boundary condition 31temp[0] = temp[1] 32temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 33 34# graph data array 35ims = [] 36fig = plt.figure() 37ax = fig.add_subplot(1, 1, 1) 38 39gx = np.zeros(nx) 40for i in range(nx): 41 gx[i] = i * dx 42 43# レーザー光照射時間の指定 44t_intv= 0.00000005 45 46# time loop 47for n in range(1, nt+1): 48 49 # FTCS(右辺第一項に吸収熱温度を設定/0~50nsの間だけ照射、それ以降はQ=0) 50 for i in range(1, nx-1): 51 if time < t_intv : 52 temp_new[i] = Q[i]+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 53 else : 54 temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 55 56 # update 57 for i in range(1, nx-1): 58 temp[i] = temp_new[i] 59 60 61 # Boundary condition 62 temp[0] = temp[1] 63 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 64 65 time += dt 66 67 if n % nout == 0: 68 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1])) 69 im_line = ax.plot(gx, temp, 'b') 70 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 71 ims.append(im_line + [im_time]) 72 73# graph plot 74ax.set_xlabel('x [m]') 75ax.set_ylabel('Temperature [C]') 76ax.grid() 77anm = animation.ArtistAnimation(fig, ims, interval=50) 78anm.save('animation.gif', writer='pillow') 79plt.show() 80