質問編集履歴
9
コードを修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -218,8 +218,6 @@
|
|
218
218
|
|
219
219
|
def reactor(N, γ, ΔT):
|
220
220
|
|
221
|
-
boolean=False
|
222
|
-
|
223
221
|
P_log=[[]]
|
224
222
|
|
225
223
|
P_list=[]
|
8
コードを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
return z
|
34
34
|
|
35
|
-
|
35
|
+
division(2,0)
|
36
36
|
|
37
37
|
```
|
38
38
|
|
7
コードを修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
return z
|
34
34
|
|
35
|
-
print(2,0)
|
35
|
+
print(division(2,0))
|
36
36
|
|
37
37
|
```
|
38
38
|
|
6
解決策を追記しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -154,6 +154,8 @@
|
|
154
154
|
|
155
155
|
P_list: 反応器毎の攪拌消費電力を記録する(record the power consumption of each reactor)
|
156
156
|
|
157
|
+
P_total: 最終的な計算結果を保存する(save the final result of calculation)
|
158
|
+
|
157
159
|
"""
|
158
160
|
|
159
161
|
|
5
解決策を追記しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
returnで値が正しく返ってきません。
|
2
|
+
|
1
3
|
```Python
|
2
4
|
|
3
5
|
def division(x,y):
|
4
解決策を追記しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -33,3 +33,279 @@
|
|
33
33
|
print(2,0)
|
34
34
|
|
35
35
|
```
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
多くの方にご回答いただき誠にありがとうございました。おかげさまで書きたかったプログラムが書けました。下のコードのように書くと、引数を更新して正しく計算されるまで関数を呼び直すという動作ができます。
|
42
|
+
|
43
|
+
```Python
|
44
|
+
|
45
|
+
Z=[]
|
46
|
+
|
47
|
+
def division(x,y):
|
48
|
+
|
49
|
+
boolean=False
|
50
|
+
|
51
|
+
x=x
|
52
|
+
|
53
|
+
y=y
|
54
|
+
|
55
|
+
try:
|
56
|
+
|
57
|
+
z=x/y
|
58
|
+
|
59
|
+
boolean=True
|
60
|
+
|
61
|
+
Z.append(z)
|
62
|
+
|
63
|
+
except ZeroDivisionError:
|
64
|
+
|
65
|
+
y+=1
|
66
|
+
|
67
|
+
division(x,y)
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
division(2,0)
|
72
|
+
|
73
|
+
print(Z[0])
|
74
|
+
|
75
|
+
```
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
また、これを応用して、反応器段数、原料濃度、溶液と冷媒の温度差を変数にとり連続混合槽型反応器のシミュレーションを行うコードを作成しました。(大学で学んでいる化学工学の問題です。かなりマニアックな領域なので化学工学に馴染みのない方が見るのは難しいかもしれません。)
|
80
|
+
|
81
|
+
```Python
|
82
|
+
|
83
|
+
"""
|
84
|
+
|
85
|
+
与えられた定数(prepared constants)
|
86
|
+
|
87
|
+
Gp: 生産量(product flow rate) [kg/s]
|
88
|
+
|
89
|
+
ζ: 反応転化率(conversion)
|
90
|
+
|
91
|
+
γ: 原料中のブタジエン重量割合(weight fraction of monomer in the feed)
|
92
|
+
|
93
|
+
τ: 滞留時間(residence time) [s]
|
94
|
+
|
95
|
+
ρ: 溶液密度(density of mixture) [kg/m^3]
|
96
|
+
|
97
|
+
α: 反応器の高さ/直径比(ratio of height to diameter of the reactor)
|
98
|
+
|
99
|
+
ΔH: ブタジエンの反応熱(heat of polymerization of butadiene) [J/mol]
|
100
|
+
|
101
|
+
ΔT: 反応溶液と冷媒の温度差(temperature difference between reactant and coolant) [℃]
|
102
|
+
|
103
|
+
λ: 溶液の熱伝導率(thermal conductivity of solution) [W/(m・K)]
|
104
|
+
|
105
|
+
μ: 溶液の粘度(viscosity of solution) [Pa・s]
|
106
|
+
|
107
|
+
Cp: 溶液の比熱(specific heat of solution) [J/(kg・K)]
|
108
|
+
|
109
|
+
M: ブタジエンの分子量(molecular weight of butadiene) [g/mol]
|
110
|
+
|
111
|
+
"""
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
"""
|
116
|
+
|
117
|
+
計算により求められる値(values obtained by calculation)
|
118
|
+
|
119
|
+
v: 溶液の体積流量(volumetric flow rate of solution) [m^3/s]
|
120
|
+
|
121
|
+
V: 反応器体積(volume of the reactor) [m^3]
|
122
|
+
|
123
|
+
D: 反応器直径(diameter of the reactor) [m]
|
124
|
+
|
125
|
+
Qp: 反応熱(heat of reaction) [J]
|
126
|
+
|
127
|
+
P: 攪拌の消費電力(power consumption of stirring) [kW]
|
128
|
+
|
129
|
+
h: 冷却装置の熱伝達率(heat transfer coefficiency of the coolant) [W/m^2・K]
|
130
|
+
|
131
|
+
Nu: ヌッセルト数(Nusselt number)
|
132
|
+
|
133
|
+
Pr: プラントル数(Prantdl number)
|
134
|
+
|
135
|
+
Re: レイノルズ数(Reynols number)
|
136
|
+
|
137
|
+
n: 1分あたり攪拌回数(number of stirring per minute) [/s]
|
138
|
+
|
139
|
+
Np: 動力数(power number)
|
140
|
+
|
141
|
+
"""
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
"""
|
146
|
+
|
147
|
+
値の記録に使用するリスト(list to record the value)
|
148
|
+
|
149
|
+
P_log: i段目の反応器の消費電力を計算する際の挙動をi番目の要素に記録する
|
150
|
+
|
151
|
+
(record the behavior when calculating the power consumption of the i-th reactor in the i-th element)
|
152
|
+
|
153
|
+
P_list: 反応器毎の攪拌消費電力を記録する(record the power consumption of each reactor)
|
154
|
+
|
155
|
+
"""
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
"""
|
160
|
+
|
161
|
+
例外処理(exception handling)
|
162
|
+
|
163
|
+
排熱を処理しきれない場合は冷媒の温度を1度ずつ下げる
|
164
|
+
|
165
|
+
(if the exhaust heat cannot be processed, lower the temperature of the refrigerant by 1 degree.)
|
166
|
+
|
167
|
+
"""
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
import math
|
172
|
+
|
173
|
+
Gp = 0.729
|
174
|
+
|
175
|
+
ζ = 0.60
|
176
|
+
|
177
|
+
γ_1 = 0.05
|
178
|
+
|
179
|
+
τ_1 = 18000
|
180
|
+
|
181
|
+
ρ = 850
|
182
|
+
|
183
|
+
α = 1.3
|
184
|
+
|
185
|
+
ΔH = 72800
|
186
|
+
|
187
|
+
λ = 0.128
|
188
|
+
|
189
|
+
Cp = 1680
|
190
|
+
|
191
|
+
M = 54.0
|
192
|
+
|
193
|
+
V_1=514.6 #V_1=v*τ_1
|
194
|
+
|
195
|
+
v_1=0.02859 #v_1=Gp/(ρ*γ_1*ζ)
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
#反応速度定数を求める(find the reaction rate constant)
|
200
|
+
|
201
|
+
ζ_total=ζ
|
202
|
+
|
203
|
+
k=v_1*ζ_total/(V_1*(1-ζ_total))
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
P_log=[[]]
|
208
|
+
|
209
|
+
P_list=[]
|
210
|
+
|
211
|
+
P_total=[]
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
def reactor(N, γ, ΔT):
|
216
|
+
|
217
|
+
boolean=False
|
218
|
+
|
219
|
+
P_log=[[]]
|
220
|
+
|
221
|
+
P_list=[]
|
222
|
+
|
223
|
+
N=N
|
224
|
+
|
225
|
+
γ=γ
|
226
|
+
|
227
|
+
ΔT=ΔT
|
228
|
+
|
229
|
+
#反応器のサイズを求める(find the size of each reactor)
|
230
|
+
|
231
|
+
τ=(1/k)*(1/math.pow(1-ζ_total,1/N)-1)
|
232
|
+
|
233
|
+
v=Gp/(ρ*γ*ζ_total)
|
234
|
+
|
235
|
+
V=v*τ
|
236
|
+
|
237
|
+
D=math.pow(4*V/(1.3*math.pi),1/3)
|
238
|
+
|
239
|
+
#各反応器の熱収支を計算する(calculate heat balance of each reactor)
|
240
|
+
|
241
|
+
ζ_each=1-math.pow(1-ζ_total,1/N)
|
242
|
+
|
243
|
+
try:
|
244
|
+
|
245
|
+
for i in range(N):
|
246
|
+
|
247
|
+
P_log.append([])
|
248
|
+
|
249
|
+
P_log[i+1].append(0)
|
250
|
+
|
251
|
+
Qp=(ΔH/(M*0.001))*k*ρ*V*(1-ζ_each)**(i+1)*γ
|
252
|
+
|
253
|
+
h=Qp/(1.3*math.pi*(D**2)*ΔT)
|
254
|
+
|
255
|
+
Nu=h*D/λ
|
256
|
+
|
257
|
+
μ=0.0010*math.pow(50,1.7)*math.pow(1-(1-ζ_each)**(i+1),2.5)*math.exp(21*γ)
|
258
|
+
|
259
|
+
Pr=μ*Cp/λ
|
260
|
+
|
261
|
+
Re=math.pow((1/0.5)*Nu*math.pow(Pr,-1/3),3/2)
|
262
|
+
|
263
|
+
n=μ*Re/(ρ*(D/2)**2)
|
264
|
+
|
265
|
+
Np=14.6*math.pow(Re,-0.28)
|
266
|
+
|
267
|
+
P=0.0010*Np*ρ*(n**3)*((D/2)**5)
|
268
|
+
|
269
|
+
P_log[i+1].append(P)
|
270
|
+
|
271
|
+
while abs((P-P_log[i+1][len(P_log[i+1])-2])/P)>1.00*math.pow(10, -3):
|
272
|
+
|
273
|
+
h=(Qp+P*1000)/(1.3*math.pi*(D**2)*ΔT)
|
274
|
+
|
275
|
+
Nu=h*D/λ
|
276
|
+
|
277
|
+
Pr=μ*Cp/λ
|
278
|
+
|
279
|
+
Re=math.pow((1/0.5)*Nu*math.pow(Pr,-1/3),3/2)
|
280
|
+
|
281
|
+
n=μ*Re/(ρ*(D/2)**2)
|
282
|
+
|
283
|
+
Np=14.6*math.pow(Re,-0.28)
|
284
|
+
|
285
|
+
P=0.0010*Np*ρ*(n**3)*((D/2)**5)
|
286
|
+
|
287
|
+
P_log[i+1].append(P)
|
288
|
+
|
289
|
+
P_list.append(P_log[i+1][-1])
|
290
|
+
|
291
|
+
P_total.append(sum(P_list))
|
292
|
+
|
293
|
+
P_total.append(ΔT)
|
294
|
+
|
295
|
+
except OverflowError:
|
296
|
+
|
297
|
+
if ΔT<=50+273:
|
298
|
+
|
299
|
+
ΔT+=1
|
300
|
+
|
301
|
+
reactor(N, γ, ΔT)
|
302
|
+
|
303
|
+
else:
|
304
|
+
|
305
|
+
print("Warning: The feed is too thick. Reduce γ.")
|
306
|
+
|
307
|
+
reactor(1, 0.07, 65)
|
308
|
+
|
309
|
+
print(P_total)
|
310
|
+
|
311
|
+
```
|
3
コードを少し修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -20,12 +20,6 @@
|
|
20
20
|
|
21
21
|
division(x,y)
|
22
22
|
|
23
|
-
else:
|
24
|
-
|
25
|
-
Z=z
|
26
|
-
|
27
|
-
pass
|
28
|
-
|
29
23
|
if boolean==True:
|
30
24
|
|
31
25
|
#print(z)は正しく値を返す
|
@@ -34,6 +28,8 @@
|
|
34
28
|
|
35
29
|
#return zは値を返さない
|
36
30
|
|
37
|
-
return
|
31
|
+
return z
|
32
|
+
|
33
|
+
print(2,0)
|
38
34
|
|
39
35
|
```
|
2
正しくマークダウン記法を使って書き直しました。また、プログラムを短いものに差し替えました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -28,11 +28,11 @@
|
|
28
28
|
|
29
29
|
if boolean==True:
|
30
30
|
|
31
|
+
#print(z)は正しく値を返す
|
32
|
+
|
31
33
|
print(z)
|
32
34
|
|
33
|
-
#print(z)は正しく値を返す
|
34
|
-
|
35
|
-
return zは値を返さない
|
35
|
+
#return zは値を返さない
|
36
36
|
|
37
37
|
return Z
|
38
38
|
|
1
正しくマークダウン記法で書き直しました。また、プログラムの重要な箇所だけ抽出して書き直しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,189 +1,39 @@
|
|
1
|
-
|
1
|
+
```Python
|
2
2
|
|
3
|
+
def division(x,y):
|
3
4
|
|
5
|
+
boolean=False
|
4
6
|
|
5
|
-
|
7
|
+
x=x
|
6
8
|
|
7
|
-
|
9
|
+
y=y
|
8
10
|
|
11
|
+
try:
|
9
12
|
|
13
|
+
z=x/y
|
10
14
|
|
11
|
-
|
15
|
+
boolean=True
|
12
16
|
|
17
|
+
except ZeroDivisionError:
|
13
18
|
|
19
|
+
y+=1
|
14
20
|
|
15
|
-
|
21
|
+
division(x,y)
|
16
22
|
|
23
|
+
else:
|
17
24
|
|
25
|
+
Z=z
|
18
26
|
|
27
|
+
pass
|
19
28
|
|
29
|
+
if boolean==True:
|
20
30
|
|
21
|
-
|
31
|
+
print(z)
|
22
32
|
|
33
|
+
#print(z)は正しく値を返す
|
23
34
|
|
35
|
+
return zは値を返さない
|
24
36
|
|
25
|
-
|
37
|
+
return Z
|
26
38
|
|
27
|
-
Gp = 0.729
|
28
|
-
|
29
|
-
ζ = 0.60
|
30
|
-
|
31
|
-
γ_1 = 0.05
|
32
|
-
|
33
|
-
τ_1 = 18000
|
34
|
-
|
35
|
-
ρ = 850
|
36
|
-
|
37
|
-
α = 1.3
|
38
|
-
|
39
|
-
ΔH = 72800
|
40
|
-
|
41
|
-
λ = 0.128
|
42
|
-
|
43
|
-
Cp = 1680
|
44
|
-
|
45
|
-
M = 54.0
|
46
|
-
|
47
|
-
V_1=514.6 #V_1=v*τ_1
|
48
|
-
|
49
|
-
v_1=0.02859 #v_1=Gp/(ρ*γ_1*ζ)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
#反応速度定数を求める(find the reaction rate constant)
|
54
|
-
|
55
|
-
ζ_total=ζ
|
56
|
-
|
57
|
-
k=v_1*ζ_total/(V_1*(1-ζ_total))
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
P_log=[[]]
|
62
|
-
|
63
|
-
P_list=[]
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
def reactor(N, γ, ΔT):
|
68
|
-
|
69
|
-
boolean=False
|
70
|
-
|
71
|
-
P_log=[[]]
|
72
|
-
|
73
|
-
P_list=[]
|
74
|
-
|
75
|
-
|
39
|
+
```
|
76
|
-
|
77
|
-
γ=γ
|
78
|
-
|
79
|
-
ΔT=ΔT
|
80
|
-
|
81
|
-
#反応器のサイズを求める(find the size of each reactor)
|
82
|
-
|
83
|
-
τ=(1/k)*(1/math.pow(1-ζ_total,1/N)-1)
|
84
|
-
|
85
|
-
v=Gp/(ρ*γ*ζ_total)
|
86
|
-
|
87
|
-
V=v*τ
|
88
|
-
|
89
|
-
D=math.pow(4*V/(1.3*math.pi),1/3)
|
90
|
-
|
91
|
-
#各反応器の熱収支を計算する(calculate heat balance of each reactor)
|
92
|
-
|
93
|
-
ζ_each=1-math.pow(1-ζ_total,1/N)
|
94
|
-
|
95
|
-
try:
|
96
|
-
|
97
|
-
for i in range(N):
|
98
|
-
|
99
|
-
P_log.append([])
|
100
|
-
|
101
|
-
P_log[i+1].append(0)
|
102
|
-
|
103
|
-
Qp=(ΔH/(M*0.001))*k*ρ*V*(1-ζ_each)**(i+1)*γ
|
104
|
-
|
105
|
-
h=Qp/(1.3*math.pi*(D**2)*ΔT)
|
106
|
-
|
107
|
-
Nu=h*D/λ
|
108
|
-
|
109
|
-
μ=0.0010*math.pow(50,1.7)*math.pow(1-(1-ζ_each)**(i+1),2.5)*math.exp(21*γ)
|
110
|
-
|
111
|
-
Pr=μ*Cp/λ
|
112
|
-
|
113
|
-
Re=math.pow((1/0.5)*Nu*math.pow(Pr,-1/3),3/2)
|
114
|
-
|
115
|
-
n=μ*Re/(ρ*(D/2)**2)
|
116
|
-
|
117
|
-
Np=14.6*math.pow(Re,-0.28)
|
118
|
-
|
119
|
-
P=0.0010*Np*ρ*(n**3)*((D/2)**5)
|
120
|
-
|
121
|
-
P_log[i+1].append(P)
|
122
|
-
|
123
|
-
while abs((P-P_log[i+1][len(P_log[i+1])-2])/P)>1.00*math.pow(10, -3):
|
124
|
-
|
125
|
-
h=(Qp+P*1000)/(1.3*math.pi*(D**2)*ΔT)
|
126
|
-
|
127
|
-
Nu=h*D/λ
|
128
|
-
|
129
|
-
Pr=μ*Cp/λ
|
130
|
-
|
131
|
-
Re=math.pow((1/0.5)*Nu*math.pow(Pr,-1/3),3/2)
|
132
|
-
|
133
|
-
n=μ*Re/(ρ*(D/2)**2)
|
134
|
-
|
135
|
-
Np=14.6*math.pow(Re,-0.28)
|
136
|
-
|
137
|
-
P=0.0010*Np*ρ*(n**3)*((D/2)**5)
|
138
|
-
|
139
|
-
P_log[i+1].append(P)
|
140
|
-
|
141
|
-
P_list.append(P_log[i+1][-1])
|
142
|
-
|
143
|
-
if len(P_list)==N:
|
144
|
-
|
145
|
-
boolean=True
|
146
|
-
|
147
|
-
except OverflowError:
|
148
|
-
|
149
|
-
if ΔT<=50+273:
|
150
|
-
|
151
|
-
ΔT+=1
|
152
|
-
|
153
|
-
reactor(N, γ, ΔT)
|
154
|
-
|
155
|
-
else:
|
156
|
-
|
157
|
-
print("Warning: The feed is too thick. Reduce γ.")
|
158
|
-
|
159
|
-
if boolean==True:
|
160
|
-
|
161
|
-
Power=P_list[-1]
|
162
|
-
|
163
|
-
print(Power)
|
164
|
-
|
165
|
-
return Power
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
reactor(1, 0.07, 67)
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
### 試したこと
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
最後のreactor(1, 0.07, 67)をprint(reactor(1, 0.07, 67))とするとPowerの値ではなく"None"が返ってきました。
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
### 補足情報(FW/ツールのバージョンなど)
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
jupyter notebookで実行しています。
|
188
|
-
|
189
|
-
printで表示すると確かに値を持っているのに、returnを使うとNoneになってしまう…。このようなことは初めてでとても困惑しています。
|