質問編集履歴

5

成功した事例のコードも付け足しました。

2020/02/13 07:24

投稿

alpha_high
alpha_high

スコア6

test CHANGED
File without changes
test CHANGED
@@ -8,9 +8,27 @@
8
8
 
9
9
 
10
10
 
11
+ コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、値の変わらない一本線になっていました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
12
+
13
+
14
+
11
15
  #表示されるエラー
12
16
 
17
+ uvals.append(-2*np.sin(t)*np.sin(j))
18
+
19
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
20
+
21
+
22
+
23
+ 上の式を使うと、上下に動く式、下の式を使うと、直線が表示されるようになってしまいました。
24
+
25
+
26
+
27
+ initial の式を、
28
+
29
+ np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
30
+
13
- コード自体にはエラーがなのですが、アニメーションにする波が横に流れるものではなく、値の変わらない一本線になっていました。expの式で最初のテストを行った際は、右から左に移っていアニメーションになっていたのですが、上記のcos,sinの形にするとうまくきませんでした。
31
+ いうのでプロットした問題なく右から左にグラフになりました。動いたのですが、何故式を変えただけ
14
32
 
15
33
  ```
16
34
 
@@ -159,3 +177,139 @@
159
177
  ```
160
178
 
161
179
  #試してみたこと
180
+
181
+ 下のものが、np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
182
+
183
+ にて右から左に動くグラフです。
184
+
185
+ 三角関数をプロットするためにいくつか変数は変えたのですが、何故下のプログラムは動くのに右のプログラムは動かないのかがわかりません。教えていただけないでしょうか。
186
+
187
+ ```
188
+
189
+ import numpy as np
190
+
191
+ import matplotlib.pyplot as plt
192
+
193
+ import matplotlib.animation as animation
194
+
195
+
196
+
197
+ # wave speed
198
+
199
+ c = 1
200
+
201
+
202
+
203
+ # spatial domain
204
+
205
+ xmin = 0
206
+
207
+ xmax = 1
208
+
209
+
210
+
211
+ n = 50 # num of grid points
212
+
213
+
214
+
215
+ # x grid of n points
216
+
217
+ X, dx = np.linspace(xmin,xmax,n,retstep=True)
218
+
219
+
220
+
221
+ # for CFL of 0.1
222
+
223
+ dt = 1/1024
224
+
225
+
226
+
227
+ # initial conditions
228
+
229
+ def initial_u(x):
230
+
231
+ return np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
232
+
233
+ #return np.sin(x)*(1/10)
234
+
235
+
236
+
237
+ # each value of the U array contains the solution for all x values at each timestep
238
+
239
+ U = []
240
+
241
+
242
+
243
+ # explicit euler solution
244
+
245
+ def u(x, t):
246
+
247
+ if t == 0: # initial condition
248
+
249
+ return initial_u(x)
250
+
251
+ uvals = [] # u values for this time step
252
+
253
+ for j in range(len(x)):
254
+
255
+ if j == 0: # left boundary
256
+
257
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
258
+
259
+ elif j == n-1: # right boundary
260
+
261
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
262
+
263
+ else:
264
+
265
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
266
+
267
+ return uvals
268
+
269
+
270
+
271
+ # solve for 500 time steps
272
+
273
+ for t in range(500):
274
+
275
+ U.append(u(X, t))
276
+
277
+
278
+
279
+ # plot solution
280
+
281
+ fig = plt.figure()
282
+
283
+ ax1 = fig.add_subplot(1,1,1)
284
+
285
+
286
+
287
+ # animate the time data
288
+
289
+ k = 0
290
+
291
+ def animate(i):
292
+
293
+ global k
294
+
295
+ x = U[k]
296
+
297
+ k += 1
298
+
299
+ ax1.clear()
300
+
301
+ plt.plot(X,x)
302
+
303
+ plt.grid(True)
304
+
305
+ plt.ylim([-2,2])
306
+
307
+ plt.xlim([0,1])
308
+
309
+
310
+
311
+ anim = animation.FuncAnimation(fig,animate,frames=360,interval=20)
312
+
313
+ plt.show()
314
+
315
+ ```

4

文法の修正

2020/02/13 07:24

投稿

alpha_high
alpha_high

スコア6

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  #表示されるエラー
12
12
 
13
- コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、縦に大きくる物になってしまいました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
13
+ コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、値の変わらい一本線になっていました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
14
14
 
15
15
  ```
16
16
 
@@ -86,15 +86,27 @@
86
86
 
87
87
  if j == 0: # left boundary
88
88
 
89
+ #上下に動く波になってしまいます
90
+
91
+        #uvals.append(-2*np.sin(t)*np.sin(j))
92
+
93
+        #ただの直線になってしまいます。
94
+
89
- uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
95
+ #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
90
96
 
91
97
  elif j == n-1: # right boundary
92
98
 
93
99
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
94
100
 
95
- else:
101
+ else: 
96
102
 
103
+        #上下に動く波になってしまいます
104
+
105
+        #uvals.append(-2*np.sin(t)*np.sin(j))
106
+
107
+        #ただの直線になってしまいます。
108
+
97
- uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
109
+ #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
98
110
 
99
111
  return uvals
100
112
 
@@ -147,15 +159,3 @@
147
159
  ```
148
160
 
149
161
  #試してみたこと
150
-
151
- 配列を二次元配列や、一次元配列にも変えてみたのですが、できませんでした。
152
-
153
- ループの回数を制限し、小さい数で表示してみましたが、何も表示されませんでした。
154
-
155
- 境界条件を0にしても、同じ現象でした。
156
-
157
-
158
-
159
- 教えていただけると本当に嬉しいです。
160
-
161
- 宜しくお願い致します。

3

追加の質問を書かせて頂きました。

2020/02/13 07:15

投稿

alpha_high
alpha_high

スコア6

test CHANGED
File without changes
test CHANGED
@@ -10,9 +10,7 @@
10
10
 
11
11
  #表示されるエラー
12
12
 
13
- コード自体にはエラーがないようなのですが、アニメーションにすると画面て、画像が何も表示されません。
13
+ コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、縦に大きくなる物になってしまました。expの式で最初のテストを行った際は、右から左に波移っいくアニメーションになっいたのですが上記のcos,sinの形にするとうくできませんでした
14
-
15
-
16
14
 
17
15
  ```
18
16
 

2

計算式の修正をしました。

2020/02/13 07:12

投稿

alpha_high
alpha_high

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  pythonで、波動方程式の二次元関数を書いています。
2
2
 
3
- z=2(cos(x) * sin(cx))
3
+ z=2(cos(x)) * (sin(cx))
4
4
 
5
5
  c=1
6
6
 

1

配列を変更しました。

2020/02/13 07:10

投稿

alpha_high
alpha_high

スコア6

test CHANGED
File without changes
test CHANGED
@@ -88,8 +88,6 @@
88
88
 
89
89
  if j == 0: # left boundary
90
90
 
91
- uvals.append(-2*np.sin(t)*np.sin(j))
92
-
93
91
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
94
92
 
95
93
  elif j == n-1: # right boundary
@@ -97,8 +95,6 @@
97
95
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
98
96
 
99
97
  else:
100
-
101
- uvals.append(-2*np.sin(t)*np.sin(j))
102
98
 
103
99
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
104
100