プログラミング未経験の者です。以下リンク、科学技術計算講座3-熱伝導方程式シミュレーションリンク内容を参考にして、厚さ1mmのSi材料にレーザー光を一定時間照射したときの試料の温度分布を求めたいと思っています。
試料は一次元(深さ)方向のみ考えており位置i、時間nとそれぞれを離散化しています。(照射)時間に比例、深さ方向に対しては指数関数的に減少するレーザー光の吸収熱Qを設定し、一次元非定常熱伝導方程式をもとにFTCS差分式の右辺第1項に足しました。
計算を行ったところ、#①の吸収熱Q のみが計算され#②の部分でTypeError:unsupported operand type(s) for +:'NoneType'and'float'が表示されました。#②の計算式の中で#①で設定した吸収熱QがNoneTypeとなっており、ほかのtemp[i]などに足せないため、returnで関数に実態をもたせる必要があると調べてみて考えたのですが、プログラミング経験がないこともあり、具体的な解決策が分かっていません。
基礎的なところかと思いますが、ご回答いただけるとありがたいです。
コードの情報(lx:厚さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
import
1import matplotlib.animation as animation 2import numpy as np 3 4# input parameter(材料をSiに変更、厚さ1㎜、a:吸収係数、微小間隔 dx:10㎛、計算期間1μs、時間間隔1nsに変更、表面温度を固定しないためtemp_bcを消去) 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# ①レーザー光照射による吸収熱Qの設定 ※50ns間照射して表面温度2000℃を想定 22for i in range(1, nx-1): 23 x=dx*i 24 25for n in range(1, nt+1): 26 t=dt*n 27 Q=print(40000000000*t*pow(2.718281828,-a*x)) 28 29 30 31# レーザー光照射時間の指定 32t_intv= 0.00000005 33 34 35#initial condition 36temp = np.full(nx, temp_init) 37time = 0.0 38 39temp_new = np.zeros(nx) 40 41# Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 42temp[0] = temp[1] 43temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 44 45# graph data array 46ims = [] 47fig = plt.figure() 48ax = fig.add_subplot(1, 1, 1) 49 50gx = np.zeros(nx) 51for i in range(nx): 52 gx[i] = i * dx 53 54# time loop 55for n in range(1, nt+1): 56 57 #② FTCS差分式(右辺第一項に吸収熱を設定/0~50nsの間だけ照射、それ以降はQ=0)) 58 for i in range(1, nx-1): 59 if time < t_intv : 60 temp_new[i] = Q+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 61 else : 62 temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 63 64 # update 65 for i in range(1, nx-1): 66 temp[i] = temp_new[i] 67 68 # Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 69 temp[0] = temp[1] 70 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 71 72 time += dt 73 74 if n % nout == 0: 75 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1])) 76 im_line = ax.plot(gx, temp, 'b') 77 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 78 ims.append(im_line + [im_time]) 79 80# graph plot 81ax.set_xlabel('x [m]') 82ax.set_ylabel('Temperature [C]') 83ax.grid() 84anm = animation.ArtistAnimation(fig, ims, interval=50) 85anm.save('animation.gif', writer='pillow') 86plt.show() 87 88
回答1件
あなたの回答
tips
プレビュー