質問編集履歴
7
書式の改善
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
TypeError:NoneTypeを解決したい
|
body
CHANGED
@@ -1,22 +1,97 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
とて
|
1
|
+
プログラミング未経験の者です。以下リンク、科学技術計算講座3-熱伝導方程式シミュレーションリンク内容を参考にして、厚さ1mmのSi材料にレーザー光を一定時間照射したときの試料の温度分布を求めたいと思っています。
|
2
|
+
試料は一次元(深さ)方向のみ考えており位置i、時間nとそれぞれを離散化しています。(照射)時間に比例、深さ方向に対しては指数関数的に減少するレーザー光の吸収熱Qを設定し、一次元非定常熱伝導方程式をもとにFTCS差分式の右辺第1項に足しました。
|
3
|
+
計算を行ったところ、#①の吸収熱Q のみが計算され#②の部分でTypeError:unsupported operand type(s) for +:'NoneType'and'float'が表示されました。#②の計算式の中で#①で設定した吸収熱QがNoneTypeとなっており、ほかのtemp[i]などに足せないため、returnで関数に実態をもたせる必要があると調べてみて考えたのですが、プログラミング経験がないこともあり、具体的な解決策が分かっていません。
|
4
|
+
基礎的なところかと思いますが、ご回答いただけるとありがたいです。
|
4
5
|
|
5
|
-
コードの情報(lx:
|
6
|
+
コードの情報(lx:厚さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
|
6
7
|
|
8
|
+
```import matplotlib.pyplot as plt
|
9
|
+
import matplotlib.animation as animation
|
10
|
+
import numpy as np
|
11
|
+
|
12
|
+
# input parameter(材料をSiに変更、厚さ1㎜、a:吸収係数、微小間隔 dx:10㎛、計算期間1μs、時間間隔1nsに変更、表面温度を固定しないためtemp_bcを消去)
|
13
|
+
den = 2330.0
|
14
|
+
cp = 678.0
|
15
|
+
cond = 83.7
|
16
|
+
temp_init = 0.0
|
7
|
-
|
17
|
+
lx = 0.001
|
8
18
|
nx = 101
|
9
19
|
tend = 0.000001
|
10
20
|
dt = 0.000000001
|
21
|
+
tout =0.000001
|
22
|
+
a=0.064
|
23
|
+
alpha = cond / (den * cp)
|
11
24
|
dx = lx / (nx - 1)
|
12
25
|
nt = int(tend / dt)
|
13
|
-
|
26
|
+
nout = int(tout / dt)
|
14
27
|
|
28
|
+
|
29
|
+
# ①レーザー光照射による吸収熱Qの設定 ※50ns間照射して表面温度2000℃を想定
|
15
30
|
for i in range(1, nx-1):
|
16
31
|
x=dx*i
|
17
32
|
|
18
33
|
for n in range(1, nt+1):
|
19
34
|
t=dt*n
|
20
|
-
print(
|
35
|
+
Q=print(40000000000*t*pow(2.718281828,-a*x))
|
21
36
|
|
37
|
+
|
38
|
+
|
39
|
+
# レーザー光照射時間の指定
|
40
|
+
t_intv= 0.00000005
|
41
|
+
|
42
|
+
|
43
|
+
#initial condition
|
44
|
+
temp = np.full(nx, temp_init)
|
45
|
+
time = 0.0
|
46
|
+
|
47
|
+
temp_new = np.zeros(nx)
|
48
|
+
|
49
|
+
# Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更)
|
50
|
+
temp[0] = temp[1]
|
51
|
+
temp[nx-1] = temp[nx-2] # Neumann @ x=Lx
|
52
|
+
|
53
|
+
# graph data array
|
54
|
+
ims = []
|
55
|
+
fig = plt.figure()
|
56
|
+
ax = fig.add_subplot(1, 1, 1)
|
57
|
+
|
58
|
+
gx = np.zeros(nx)
|
59
|
+
for i in range(nx):
|
60
|
+
gx[i] = i * dx
|
61
|
+
|
62
|
+
# time loop
|
63
|
+
for n in range(1, nt+1):
|
64
|
+
|
65
|
+
#② FTCS差分式(右辺第一項に吸収熱を設定/0~50nsの間だけ照射、それ以降はQ=0))
|
66
|
+
for i in range(1, nx-1):
|
67
|
+
if time < t_intv :
|
68
|
+
temp_new[i] = Q+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)
|
69
|
+
else :
|
70
|
+
temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)
|
71
|
+
|
72
|
+
# update
|
73
|
+
for i in range(1, nx-1):
|
74
|
+
temp[i] = temp_new[i]
|
75
|
+
|
76
|
+
# Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更)
|
77
|
+
temp[0] = temp[1]
|
78
|
+
temp[nx-1] = temp[nx-2] # Neumann @ x=Lx
|
79
|
+
|
80
|
+
time += dt
|
81
|
+
|
82
|
+
if n % nout == 0:
|
83
|
+
print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1]))
|
84
|
+
im_line = ax.plot(gx, temp, 'b')
|
85
|
+
im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time))
|
86
|
+
ims.append(im_line + [im_time])
|
87
|
+
|
88
|
+
# graph plot
|
89
|
+
ax.set_xlabel('x [m]')
|
90
|
+
ax.set_ylabel('Temperature [C]')
|
91
|
+
ax.grid()
|
92
|
+
anm = animation.ArtistAnimation(fig, ims, interval=50)
|
93
|
+
anm.save('animation.gif', writer='pillow')
|
94
|
+
plt.show()
|
95
|
+
|
96
|
+
|
22
97
|
```
|
6
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
関数40exp(-ax)の距離xを離散化し、0.1m の距離を微小距離dx間隔で原点0から100個の要素iに分割したとき、ある位置iにおける関数をPyhtonにてforループを使って計算したいです。また、最終的にその関数40exp(-ax)が時間に比例するときの計算をしたいです。時間も離散化されており、0~0.1秒の間を時間刻み0.001秒で100個の要素nに分割しています。
|
2
|
-
プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが、計算したところprint内のmath.40*exp(-a*
|
2
|
+
プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが、計算したところprint内のmath.40*exp(-a*x)*tが**文字**として100個表示されるだけでした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていきexpの計算結果を出力するためにはどのように設定すればよいでしょうか。
|
3
3
|
とても基礎的な内容だとは思いますが、間違い等教えて頂きたいです。
|
4
4
|
|
5
5
|
コードの情報(lx:長さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
|
5
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -6,20 +6,17 @@
|
|
6
6
|
|
7
7
|
```lx = 0.001
|
8
8
|
nx = 101
|
9
|
-
tend = 0.
|
9
|
+
tend = 0.000001
|
10
|
-
dt = 0.
|
10
|
+
dt = 0.000000001
|
11
11
|
dx = lx / (nx - 1)
|
12
12
|
nt = int(tend / dt)
|
13
13
|
a=0.064
|
14
14
|
|
15
|
-
#関数
|
16
15
|
for i in range(1, nx-1):
|
17
|
-
|
16
|
+
x=dx*i
|
18
17
|
|
19
|
-
|
20
|
-
# 上記の関数が時間(dt*n)に比例
|
21
18
|
for n in range(1, nt+1):
|
19
|
+
t=dt*n
|
22
|
-
print("math.40*exp(-a*
|
20
|
+
print("math.40*exp(-a*x)*t")
|
23
21
|
|
24
|
-
|
25
22
|
```
|
4
書式の改善
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
forループを使って
|
1
|
+
forループを使って指数関数の計算をしたい
|
body
CHANGED
File without changes
|
3
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
関数40exp(-ax)の距離xを離散化し、0.1m の距離を微小距離dx間隔で原点0から100個の要素iに分割したとき、ある位置iにおける関数をPyhtonにてforループを使って計算したいです。また、最終的にその関数40exp(-ax)が時間に比例するときの計算をしたいです。時間も離散化されており、0~0.1秒の間を時間刻み0.001秒で100個の要素nに分割しています。
|
2
|
-
プログラミングの経験がなく
|
2
|
+
プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが、計算したところprint内のmath.40*exp(-a*dx*i)およびmath.40*exp(-a*dx*i)*dt*n が文字としてそれぞれ100個表示されるだけでした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていきexpの計算結果を出力するためにはどのように設定すればよいでしょうか。
|
3
3
|
とても基礎的な内容だとは思いますが、間違い等教えて頂きたいです。
|
4
4
|
|
5
5
|
コードの情報(lx:長さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
|
2
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -14,12 +14,12 @@
|
|
14
14
|
|
15
15
|
#関数
|
16
16
|
for i in range(1, nx-1):
|
17
|
-
print(math.40*exp(-a*dx*i))
|
17
|
+
print("math.40*exp(-a*dx*i)")
|
18
18
|
|
19
19
|
|
20
20
|
# 上記の関数が時間(dt*n)に比例
|
21
21
|
for n in range(1, nt+1):
|
22
|
-
print(math.40*exp(-a*dx*i)*dt*n)
|
22
|
+
print("math.40*exp(-a*dx*i)*dt*n")
|
23
23
|
|
24
24
|
|
25
25
|
```
|
1
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
nt = int(tend / dt)
|
13
13
|
a=0.064
|
14
14
|
|
15
|
-
#
|
15
|
+
#関数
|
16
16
|
for i in range(1, nx-1):
|
17
17
|
print(math.40*exp(-a*dx*i))
|
18
18
|
|