質問編集履歴
4
修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -148,7 +148,7 @@
|
|
148
148
|
g = 9.8 #重力加速度 m/sec^2
|
149
149
|
M0 = 0.12 # ロケットの質量(水抜き) kg
|
150
150
|
```
|
151
|
-
リストxiの中には要素が10個あるのでjを0から10まで増やしながら対応する_v[-1]とsum(_v)を返してもらうコードを書きました。
|
151
|
+
追記(訂正) リストxiの中には要素が10個あるのでjを0から10まで増やしながら対応する_v[-1]とsum(_v)を返してもらうコードを書きました。これをどうにかしたいと思っています。
|
152
152
|
```
|
153
153
|
j = 0
|
154
154
|
dj = 1
|
@@ -160,14 +160,14 @@
|
|
160
160
|
_u=[]
|
161
161
|
|
162
162
|
|
163
|
-
while j <= 9 :
|
163
|
+
while j <= 9 :
|
164
164
|
t = 0
|
165
165
|
v = 0
|
166
166
|
x = _xi[j]#xの初期値 これを変えていきたい。
|
167
167
|
dt = 0.000001
|
168
168
|
|
169
169
|
|
170
|
-
while x <= 0.60: #境界面がL以下の位置にあるとき
|
170
|
+
while x <= 0.60: #境界面がL以下の位置にあるとき これを超えると水が完全に切れたことに
|
171
171
|
|
172
172
|
#ルンゲクッタで時間tでの水の座標を求める。
|
173
173
|
k1 = dxdt(x)*dt;
|
@@ -205,7 +205,7 @@
|
|
205
205
|
|
206
206
|
|
207
207
|
|
208
|
-
Hi = sum(_vi)*dt + (_vi[-1])**2/2/
|
208
|
+
Hi = sum(_vi)*dt + (_vi[-1])**2/2/g #最高到達点を求める式
|
209
209
|
|
210
210
|
_Hi.append(Hi)
|
211
211
|
|
@@ -242,7 +242,12 @@
|
|
242
242
|
|
243
243
|
### 補足情報(FW/ツールのバージョンなど)
|
244
244
|
問題はペットボトルロケットの水の量に対する最高到達点を求めようというものです。
|
245
|
+
ペットボトルロケットを真上に発射すると水が入っている状態ではルンゲクッタで速度を求めることが出来ますが、水がなくなるとその時の速度を初速度とする投げ上げ運動に変わります。
|
246
|
+
最高到達点は、水が切れた時の速度と到達点が分かれば求めることが出来ます。
|
247
|
+
|
248
|
+
つまり、最初の座標xを変えながら速度と到達点を返してくれるコードを書くことを目的としています。
|
249
|
+
|
245
|
-
この問題に至るまでに時間と速度の関係等を求める問題があったのですが(水の量は固定されていた)、この問題は時間は関係なく今度は初期値を変える必要があり頭が混乱しています。
|
250
|
+
この問題に至るまでに時間と速度の関係等を求める問題があったのですが(水の量は固定されていた)、この問題は時間は関係なく今度は初期値(最初にどれくらい水が入っているのか)を変える必要があり頭が混乱しています。
|
246
251
|
力技で自分で水の量を毎回変えながら最高到達点を求めてグラフを描くことには成功したのですが...
|
247
252
|
|
248
253
|
ヒントをいただけたら幸いです。よろしくお願いいたします。
|
3
コード中に出てくる文字の意味を追記しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -114,10 +114,42 @@
|
|
114
114
|
|
115
115
|
i += di;
|
116
116
|
|
117
|
-
while以降右にずれていないのですが実際上はwhileの下はずれています。
|
118
117
|
|
119
|
-
追記 リストxiには10個の要素があるのでその要素を1つずつ取り出すべくjを導入して各jに対して_v[-1]とmax(_v)を配列に追加するコードを作成してみましたがずっと実行したまま進みません...
|
120
118
|
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
```
|
128
|
+
|
129
|
+
```
|
130
|
+
import math
|
131
|
+
import numpy as np
|
132
|
+
import matplotlib.pyplot as plt
|
133
|
+
```
|
134
|
+
文字の意味です。
|
135
|
+
```
|
136
|
+
pi = math.pi
|
137
|
+
S1 = pi*(0.08/2)**2 #ペットボトルの断面積 m^2
|
138
|
+
S2 = pi*(0.02/2)**2 #噴出口の断面積 m^2
|
139
|
+
SS = (0.02/ 0.08)**2 # 断面積の比 S1/S2
|
140
|
+
L = 0.60 # ペットボトルの長さ m
|
141
|
+
rho = 1000.0 # 水の密度 kg/m^3
|
142
|
+
atm = 101325 # atm → N/m^3
|
143
|
+
P0 = 4.0*atm # ペットボトル内部の圧力 N/m^2
|
144
|
+
PA = 1.0*atm # 大気圧 N/m^2
|
145
|
+
X0 = 0.48 # 水と空気の境界面 水の量 m
|
146
|
+
gm = 7/5 # Cp/Cv 気体の比熱比
|
147
|
+
dt = 0.000001 #時間幅 sec
|
148
|
+
g = 9.8 #重力加速度 m/sec^2
|
149
|
+
M0 = 0.12 # ロケットの質量(水抜き) kg
|
150
|
+
```
|
151
|
+
リストxiの中には要素が10個あるのでjを0から10まで増やしながら対応する_v[-1]とsum(_v)を返してもらうコードを書きました。
|
152
|
+
```
|
121
153
|
j = 0
|
122
154
|
dj = 1
|
123
155
|
|
2
書式の改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -25,8 +25,7 @@
|
|
25
25
|
_water = []
|
26
26
|
|
27
27
|
while i <= 0.55 :
|
28
|
-
|
29
|
-
|
28
|
+
water = S1 * rho * (0.60 - i )
|
30
29
|
|
31
30
|
_water.append(water)
|
32
31
|
|
@@ -61,7 +60,7 @@
|
|
61
60
|
```
|
62
61
|
以下のコードではiに対するviが知るためのコードなのですが、実行してもリストに値が返ってきません。
|
63
62
|
```
|
64
|
-
|
63
|
+
|
65
64
|
_water = []
|
66
65
|
|
67
66
|
while i <= 0.55:
|
@@ -114,11 +113,11 @@
|
|
114
113
|
|
115
114
|
|
116
115
|
i += di;
|
117
|
-
|
116
|
+
|
118
117
|
while以降右にずれていないのですが実際上はwhileの下はずれています。
|
119
118
|
|
120
119
|
追記 リストxiには10個の要素があるのでその要素を1つずつ取り出すべくjを導入して各jに対して_v[-1]とmax(_v)を配列に追加するコードを作成してみましたがずっと実行したまま進みません...
|
121
|
-
|
120
|
+
|
122
121
|
j = 0
|
123
122
|
dj = 1
|
124
123
|
|
@@ -148,10 +147,10 @@
|
|
148
147
|
u = math.sqrt((2/rho)*(P0*((i/x)**gm) - PA)); # m/s
|
149
148
|
|
150
149
|
#ルンゲクッタで速度を求める。
|
151
|
-
k1v =
|
150
|
+
k1v = dvdt(x)*dt;
|
152
|
-
k2v =
|
151
|
+
k2v = dvdt((x+k1v/2.0))*dt;
|
153
|
-
k3v =
|
152
|
+
k3v = dvdt((x +k2v/2.0))*dt;
|
154
|
-
k4v =
|
153
|
+
k4v = dvdt((x +k3v))*dt;
|
155
154
|
kv = (k1v + 2.0*(k2v + k3v) *k4v)/6.0;
|
156
155
|
|
157
156
|
vf = _v[-1] #最終速度
|
@@ -164,7 +163,7 @@
|
|
164
163
|
_u.append(u)
|
165
164
|
_v.append(v)
|
166
165
|
_vf.append(vf)
|
167
|
-
|
166
|
+
_vsum.append(vsum)
|
168
167
|
|
169
168
|
|
170
169
|
|
@@ -180,8 +179,20 @@
|
|
180
179
|
|
181
180
|
j += dj;
|
182
181
|
```
|
182
|
+
こういうエラーが出てきてしまいます。
|
183
|
+
```ここに言語を入力
|
184
|
+
IndexErrorTraceback (most recent call last)
|
185
|
+
<ipython-input-17-14b49cbf9f76> in <module>()
|
186
|
+
35 kv = (k1v + 2.0*(k2v + k3v) *k4v)/6.0;
|
187
|
+
36
|
188
|
+
---> 37 vf = _v[-1] #最終速度
|
189
|
+
38 vsum = sum(_v) #vの和
|
190
|
+
39
|
183
191
|
|
192
|
+
IndexError: list index out of range
|
193
|
+
```
|
184
194
|
|
195
|
+
|
185
196
|
|
186
197
|
|
187
198
|
### 試したこと
|
1
viはvに変更しましたがコードをコピーしてここに張り付けるとwhile文があってもずれてくれないのでご了承ください。新しいコードを作成しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -54,7 +54,7 @@
|
|
54
54
|
``````ここに言語を入力
|
55
55
|
#dv/dtを計算して返す関数
|
56
56
|
|
57
|
-
def
|
57
|
+
def dvdt(x):
|
58
58
|
u_square = (2.0/rho)*(P0*((X0/x)**gm) - PA)
|
59
59
|
result = (rho*S2*u_square)/(M0 + rho*(L-x)*S1) - g
|
60
60
|
return result
|
@@ -63,12 +63,11 @@
|
|
63
63
|
```
|
64
64
|
```
|
65
65
|
_water = []
|
66
|
-
#_Hi = []
|
67
66
|
|
68
67
|
while i <= 0.55:
|
68
|
+
|
69
69
|
t = 0
|
70
|
-
|
70
|
+
v = 0
|
71
|
-
vi = 0
|
72
71
|
x = i #xの初期値
|
73
72
|
dt = 0.000001
|
74
73
|
di = 0.05
|
@@ -78,7 +77,7 @@
|
|
78
77
|
|
79
78
|
_t=[]
|
80
79
|
_x=[]
|
81
|
-
|
80
|
+
_v=[]
|
82
81
|
_u=[]
|
83
82
|
|
84
83
|
while x <= 0.60: #境界面が0.60以下の位置にあるとき
|
@@ -105,24 +104,86 @@
|
|
105
104
|
_t.append(t)
|
106
105
|
_x.append(x)
|
107
106
|
_u.append(u)
|
108
|
-
|
107
|
+
_v.append(v)
|
109
108
|
|
110
109
|
|
111
110
|
|
112
111
|
t += dt;
|
113
112
|
x += k;
|
114
|
-
|
113
|
+
v += kv;
|
115
114
|
|
116
|
-
#Hi = sum(_vi)*dt + (_vi[-1])**2/2/gm #いずれは最高到達点を求めたいです。そのための数式。
|
117
115
|
|
118
|
-
#_Hi.append(Hi)
|
119
|
-
|
120
116
|
i += di;
|
121
117
|
```
|
122
118
|
while以降右にずれていないのですが実際上はwhileの下はずれています。
|
123
119
|
|
120
|
+
追記 リストxiには10個の要素があるのでその要素を1つずつ取り出すべくjを導入して各jに対して_v[-1]とmax(_v)を配列に追加するコードを作成してみましたがずっと実行したまま進みません...
|
121
|
+
```ここに言語を入力
|
122
|
+
j = 0
|
123
|
+
dj = 1
|
124
124
|
|
125
|
+
_t=[]
|
126
|
+
_x=[]
|
127
|
+
_vf=[]
|
128
|
+
_vsum = []
|
129
|
+
_u=[]
|
125
130
|
|
131
|
+
|
132
|
+
while j <= 9 : #jを定義したい
|
133
|
+
t = 0
|
134
|
+
v = 0
|
135
|
+
x = _xi[j]#xの初期値 これを変えていきたい。
|
136
|
+
dt = 0.000001
|
137
|
+
|
138
|
+
|
139
|
+
while x <= 0.60: #境界面がL以下の位置にあるとき
|
140
|
+
|
141
|
+
#ルンゲクッタで時間tでの水の座標を求める。
|
142
|
+
k1 = dxdt(x)*dt;
|
143
|
+
k2 = dxdt((x+k1/2.0))*dt;
|
144
|
+
k3 = dxdt((x+k2/2.0))*dt;
|
145
|
+
k4 = dxdt((x+k3))*dt;
|
146
|
+
k = (k1 + 2.0*(k2 + k3 )+ k4)/6.0;
|
147
|
+
|
148
|
+
u = math.sqrt((2/rho)*(P0*((i/x)**gm) - PA)); # m/s
|
149
|
+
|
150
|
+
#ルンゲクッタで速度を求める。
|
151
|
+
k1v = dvdti(x)*dt;
|
152
|
+
k2v = dvdti((x+k1v/2.0))*dt;
|
153
|
+
k3v = dvdti((x +k2v/2.0))*dt;
|
154
|
+
k4v = dvdti((x +k3v))*dt;
|
155
|
+
kv = (k1v + 2.0*(k2v + k3v) *k4v)/6.0;
|
156
|
+
|
157
|
+
vf = _v[-1] #最終速度
|
158
|
+
vsum = sum(_v) #vの和
|
159
|
+
|
160
|
+
|
161
|
+
#配列へ
|
162
|
+
_t.append(t)
|
163
|
+
_x.append(x)
|
164
|
+
_u.append(u)
|
165
|
+
_v.append(v)
|
166
|
+
_vf.append(vf)
|
167
|
+
_vsum.append(vsum)
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
t += dt;
|
172
|
+
x += k;
|
173
|
+
v += kv;
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
Hi = sum(_vi)*dt + (_vi[-1])**2/2/gm #最高到達点を求める式
|
178
|
+
|
179
|
+
_Hi.append(Hi)
|
180
|
+
|
181
|
+
j += dj;
|
182
|
+
```
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
126
187
|
### 試したこと
|
127
188
|
|
128
189
|
上のコードを作成してiを増やしながらそれに対応する速度を求めようとしました。
|