質問編集履歴

9

コードを修正

2020/10/19 00:47

投稿

退会済みユーザー
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

コードを修正しました。

2020/10/19 00:47

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  return z
34
34
 
35
- print(division(2,0))
35
+ division(2,0)
36
36
 
37
37
  ```
38
38
 

7

コードを修正しました。

2020/10/18 16:03

投稿

退会済みユーザー
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

解決策を追記しました。

2020/10/18 16:02

投稿

退会済みユーザー
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

解決策を追記しました。

2020/10/18 15:58

投稿

退会済みユーザー
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

解決策を追記しました。

2020/10/18 15:53

投稿

退会済みユーザー
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

コードを少し修正しました。

2020/10/18 15:52

投稿

退会済みユーザー
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 Z
31
+ return z
32
+
33
+ print(2,0)
38
34
 
39
35
  ```

2

正しくマークダウン記法を使って書き直しました。また、プログラムを短いものに差し替えました。

2020/10/18 15:00

投稿

退会済みユーザー
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

正しくマークダウン記法で書き直しました。また、プログラムの重要な箇所だけ抽出して書き直しました。

2020/10/18 14:52

投稿

退会済みユーザー
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
- 反応器の攪拌に必要な消費電力Powerを計算したいです。
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
- printではきちんと値を表示できるのに、returnを使うと何も返ってきません。
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
- import math
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
- N=N
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になってしまう…。このようなことは初めてでとても困惑しています。