質問編集履歴

7

書式の改善

2021/09/09 07:48

投稿

ab-3
ab-3

スコア5

test CHANGED
@@ -1 +1 @@
1
- forループ使って指数関数の計算をしたい
1
+ TypeError:NoneType解決したい
test CHANGED
@@ -1,16 +1,36 @@
1
- 関数40exp(-ax)の距離x離散化し、0.1m 距離を微小距離dx間隔で原点0から100個の要素iに分割したとき、ある位置iにおける関数をPyhtonにてforル使って計算したいです。また、最終的にその関数40exp(-ax)が時間に比例するときの計算たいです。時間も離散化されおり、0~0.1秒の間を時間刻み0.001秒で100個の要素nに分割しています。
1
+ プログラミング未経験の者です。以下リンク、科学技術計算講座3-熱伝導方程式シミュレーションリンク内容参考に厚さ1mmSi材料ザー光一定時間照射したときの試料の温度分布求めたいと思っています。
2
2
 
3
- プログラミング経験がなくネットでいろいろと調べコードを書いてみたのですが計算したところprint内のmath.40*exp(-a*x)*tが**文字**して100個表示されるだけでした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていきexpの計算結果を出力るためにはように設定すればよいでょうか
3
+ 試料は一次元(深さ)方向み考えおり位置i時間nとそれぞれを離散化してい。(照射)時間比例、深さ方向に対して指数関数的に減少するレーザー光吸収熱Qを設定し、一次元非定常熱伝導方程式をもとにFTCS差分式の右辺第1項に足しました
4
4
 
5
- とても基礎的な内容だは思いますが、間違等教え頂きたです
5
+ 計算を行ったころ、#①の吸収熱Q のみが計算され#②の部分でTypeError:unsupported operand type(s) for +:'NoneType'and'float'が表示されました。#②の計算式の中で#①で設定した吸収熱QがNoneTypeとなっおり、ほかのtemp[i]などに足せないため、returnで関数に実態をたせる必要がある調べてみて考えたのですが、プログラミング経験がなこともあり、具体的な解決策が分かっていません
6
+
7
+ 基礎的なところかと思いますが、ご回答いただけるとありがたいです。
6
8
 
7
9
 
8
10
 
9
- コードの情報(lx:さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
11
+ コードの情報(lx:さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)
10
12
 
11
13
 
12
14
 
15
+ ```import matplotlib.pyplot as plt
16
+
17
+ import matplotlib.animation as animation
18
+
19
+ import numpy as np
20
+
21
+
22
+
23
+ # input parameter(材料をSiに変更、厚さ1㎜、a:吸収係数、微小間隔 dx:10㎛、計算期間1μs、時間間隔1nsに変更、表面温度を固定しないためtemp_bcを消去)
24
+
25
+ den = 2330.0
26
+
27
+ cp = 678.0
28
+
29
+ cond = 83.7
30
+
31
+ temp_init = 0.0
32
+
13
- ```lx = 0.001
33
+ lx = 0.001
14
34
 
15
35
  nx = 101
16
36
 
@@ -18,13 +38,23 @@
18
38
 
19
39
  dt = 0.000000001
20
40
 
41
+ tout =0.000001
42
+
43
+ a=0.064
44
+
45
+ alpha = cond / (den * cp)
46
+
21
47
  dx = lx / (nx - 1)
22
48
 
23
49
  nt = int(tend / dt)
24
50
 
25
- a=0.064
51
+ nout = int(tout / dt)
26
52
 
27
53
 
54
+
55
+
56
+
57
+ # ①レーザー光照射による吸収熱Qの設定 ※50ns間照射して表面温度2000℃を想定
28
58
 
29
59
  for i in range(1, nx-1):
30
60
 
@@ -36,7 +66,127 @@
36
66
 
37
67
  t=dt*n
38
68
 
69
+ Q=print(40000000000*t*pow(2.718281828,-a*x))
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ # レーザー光照射時間の指定
78
+
79
+ t_intv= 0.00000005
80
+
81
+
82
+
83
+
84
+
85
+ #initial condition
86
+
87
+ temp = np.full(nx, temp_init)
88
+
89
+ time = 0.0
90
+
91
+
92
+
93
+ temp_new = np.zeros(nx)
94
+
95
+
96
+
97
+ # Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更)
98
+
99
+ temp[0] = temp[1]
100
+
101
+ temp[nx-1] = temp[nx-2] # Neumann @ x=Lx
102
+
103
+
104
+
105
+ # graph data array
106
+
107
+ ims = []
108
+
109
+ fig = plt.figure()
110
+
111
+ ax = fig.add_subplot(1, 1, 1)
112
+
113
+
114
+
115
+ gx = np.zeros(nx)
116
+
117
+ for i in range(nx):
118
+
119
+ gx[i] = i * dx
120
+
121
+
122
+
123
+ # time loop
124
+
125
+ for n in range(1, nt+1):
126
+
127
+
128
+
129
+ #② FTCS差分式(右辺第一項に吸収熱を設定/0~50nsの間だけ照射、それ以降はQ=0))
130
+
131
+ for i in range(1, nx-1):
132
+
133
+ if time < t_intv :
134
+
135
+ temp_new[i] = Q+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)
136
+
137
+ else :
138
+
139
+ temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)
140
+
141
+
142
+
143
+ # update
144
+
145
+ for i in range(1, nx-1):
146
+
147
+ temp[i] = temp_new[i]
148
+
149
+
150
+
151
+ # Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更)
152
+
153
+ temp[0] = temp[1]
154
+
155
+ temp[nx-1] = temp[nx-2] # Neumann @ x=Lx
156
+
157
+
158
+
159
+ time += dt
160
+
161
+
162
+
163
+ if n % nout == 0:
164
+
165
+ print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1]))
166
+
39
- print("math.40*exp(-a*x)*t")
167
+ im_line = ax.plot(gx, temp, 'b')
168
+
169
+ im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time))
170
+
171
+ ims.append(im_line + [im_time])
172
+
173
+
174
+
175
+ # graph plot
176
+
177
+ ax.set_xlabel('x [m]')
178
+
179
+ ax.set_ylabel('Temperature [C]')
180
+
181
+ ax.grid()
182
+
183
+ anm = animation.ArtistAnimation(fig, ims, interval=50)
184
+
185
+ anm.save('animation.gif', writer='pillow')
186
+
187
+ plt.show()
188
+
189
+
40
190
 
41
191
 
42
192
 

6

書式の改善

2021/09/09 07:48

投稿

ab-3
ab-3

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
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
 
3
- プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが、計算したところprint内のmath.40*exp(-a*dx*i)およびmath.40*exp(-a*dx*i)*dt*n が文字としてそれぞれ100個表示されるだけでした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていきexpの計算結果を出力するためにはどのように設定すればよいでしょうか。
3
+ プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが、計算したところprint内のmath.40*exp(-a*x)*t**文字**として100個表示されるだけでした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていきexpの計算結果を出力するためにはどのように設定すればよいでしょうか。
4
4
 
5
5
  とても基礎的な内容だとは思いますが、間違い等教えて頂きたいです。
6
6
 

5

書式の改善

2021/09/09 06:33

投稿

ab-3
ab-3

スコア5

test CHANGED
File without changes
test CHANGED
@@ -14,9 +14,9 @@
14
14
 
15
15
  nx = 101
16
16
 
17
- tend = 0.1
17
+ tend = 0.000001
18
18
 
19
- dt = 0.001
19
+ dt = 0.000000001
20
20
 
21
21
  dx = lx / (nx - 1)
22
22
 
@@ -26,23 +26,17 @@
26
26
 
27
27
 
28
28
 
29
- #関数
30
-
31
29
  for i in range(1, nx-1):
32
30
 
33
- print("math.40*exp(-a*dx*i)")
31
+ x=dx*i
34
32
 
35
33
 
36
34
 
37
-
38
-
39
- # 上記の関数が時間(dt*n)に比例
40
-
41
35
  for n in range(1, nt+1):
42
36
 
43
- print("math.40*exp(-a*dx*i)*dt*n")
37
+ t=dt*n
44
38
 
45
-
39
+ print("math.40*exp(-a*x)*t")
46
40
 
47
41
 
48
42
 

4

書式の改善

2021/09/09 06:31

投稿

ab-3
ab-3

スコア5

test CHANGED
@@ -1 +1 @@
1
- forループを使って離散化された一次元空間の関数を求めたい
1
+ forループを使って指数関数の計算たい
test CHANGED
File without changes

3

書式の改善

2021/09/09 06:00

投稿

ab-3
ab-3

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
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
 
3
- プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが計算できませんでし
3
+ プログラミングの経験がなくネットでいろいろと調べてコードを書いてみたのですが計算したところprint内のmath.40*exp(-a*dx*i)およびmath.40*exp(-a*dx*i)*dt*n が文字としてそれぞれ100個表示されるだけした。iおよびnの部分をそれぞれ0.1.2.3....と増やしていexpの計算結果を出力するためにはどのように設定すればよいでしょうか
4
4
 
5
5
  とても基礎的な内容だとは思いますが、間違い等教えて頂きたいです。
6
6
 

2

書式の改善

2021/09/09 05:57

投稿

ab-3
ab-3

スコア5

test CHANGED
File without changes
test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  for i in range(1, nx-1):
32
32
 
33
- print(math.40*exp(-a*dx*i))
33
+ print("math.40*exp(-a*dx*i)")
34
34
 
35
35
 
36
36
 
@@ -40,7 +40,7 @@
40
40
 
41
41
  for n in range(1, nt+1):
42
42
 
43
- print(math.40*exp(-a*dx*i)*dt*n)
43
+ print("math.40*exp(-a*dx*i)*dt*n")
44
44
 
45
45
 
46
46
 

1

書式の改善

2021/09/09 05:50

投稿

ab-3
ab-3

スコア5

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- 1
29
+ 関数
30
30
 
31
31
  for i in range(1, nx-1):
32
32