teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

修正

2019/11/04 12:12

投稿

manako__
manako__

スコア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 : #jを定義したい
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/gm #最高到達点を求める式
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

コード中に出てくる文字の意味を追記しました。

2019/11/04 12:12

投稿

manako__
manako__

スコア4

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

書式の改善

2019/11/04 11:59

投稿

manako__
manako__

スコア4

title CHANGED
File without changes
body CHANGED
@@ -25,8 +25,7 @@
25
25
  _water = []
26
26
 
27
27
  while i <= 0.55 :
28
-
29
- water = S1 * rho * (0.60 - i )
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 = dvdti(x)*dt;
150
+ k1v = dvdt(x)*dt;
152
- k2v = dvdti((x+k1v/2.0))*dt;
151
+ k2v = dvdt((x+k1v/2.0))*dt;
153
- k3v = dvdti((x +k2v/2.0))*dt;
152
+ k3v = dvdt((x +k2v/2.0))*dt;
154
- k4v = dvdti((x +k3v))*dt;
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
- _vsum.append(vsum)
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文があってもずれてくれないのでご了承ください。新しいコードを作成しました

2019/11/04 11:30

投稿

manako__
manako__

スコア4

title CHANGED
File without changes
body CHANGED
@@ -54,7 +54,7 @@
54
54
  ``````ここに言語を入力
55
55
  #dv/dtを計算して返す関数
56
56
 
57
- def dvdti(x):
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
- #v = 0
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
- _vi=[]
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
- _vi.append(vi)
107
+ _v.append(v)
109
108
 
110
109
 
111
110
 
112
111
  t += dt;
113
112
  x += k;
114
- vi += kv;
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を増やしながらそれに対応する速度を求めようとしました。