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

質問編集履歴

5

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

2020/02/13 07:24

投稿

alpha_high
alpha_high

スコア6

title CHANGED
File without changes
body CHANGED
@@ -3,8 +3,17 @@
3
3
  c=1
4
4
  とするとき、この二変数関数を二次元のプロットにしたいです・
5
5
 
6
+ コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、値の変わらない一本線になっていました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
7
+
6
8
  #表示されるエラー
9
+ uvals.append(-2*np.sin(t)*np.sin(j))
10
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
11
+
12
+ 上の式を使うと、上下に動く式、下の式を使うと、直線が表示されるようになってしまいました。
13
+
14
+ initial の式を、
15
+ np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
7
- コード自体にはエラーがななのですが、アニメーションにすると波が横に流れるものではなく、値の変わらない一本線になっていました。expの式で最初のテストを行った際右から左に移っていアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでし
16
+ いうものでプロットしたとき問題なく右から左にグラフになりました。動いたのですが、何故式を変えだけで
8
17
  ```
9
18
  python
10
19
  ```
@@ -78,4 +87,72 @@
78
87
  anim = animation.FuncAnimation(fig,animate,frames=360,interval=20)
79
88
  plt.show()
80
89
  ```
81
- #試してみたこと
90
+ #試してみたこと
91
+ 下のものが、np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
92
+ にて右から左に動くグラフです。
93
+ 三角関数をプロットするためにいくつか変数は変えたのですが、何故下のプログラムは動くのに右のプログラムは動かないのかがわかりません。教えていただけないでしょうか。
94
+ ```
95
+ import numpy as np
96
+ import matplotlib.pyplot as plt
97
+ import matplotlib.animation as animation
98
+
99
+ # wave speed
100
+ c = 1
101
+
102
+ # spatial domain
103
+ xmin = 0
104
+ xmax = 1
105
+
106
+ n = 50 # num of grid points
107
+
108
+ # x grid of n points
109
+ X, dx = np.linspace(xmin,xmax,n,retstep=True)
110
+
111
+ # for CFL of 0.1
112
+ dt = 1/1024
113
+
114
+ # initial conditions
115
+ def initial_u(x):
116
+ return np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
117
+ #return np.sin(x)*(1/10)
118
+
119
+ # each value of the U array contains the solution for all x values at each timestep
120
+ U = []
121
+
122
+ # explicit euler solution
123
+ def u(x, t):
124
+ if t == 0: # initial condition
125
+ return initial_u(x)
126
+ uvals = [] # u values for this time step
127
+ for j in range(len(x)):
128
+ if j == 0: # left boundary
129
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
130
+ elif j == n-1: # right boundary
131
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
132
+ else:
133
+ uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
134
+ return uvals
135
+
136
+ # solve for 500 time steps
137
+ for t in range(500):
138
+ U.append(u(X, t))
139
+
140
+ # plot solution
141
+ fig = plt.figure()
142
+ ax1 = fig.add_subplot(1,1,1)
143
+
144
+ # animate the time data
145
+ k = 0
146
+ def animate(i):
147
+ global k
148
+ x = U[k]
149
+ k += 1
150
+ ax1.clear()
151
+ plt.plot(X,x)
152
+ plt.grid(True)
153
+ plt.ylim([-2,2])
154
+ plt.xlim([0,1])
155
+
156
+ anim = animation.FuncAnimation(fig,animate,frames=360,interval=20)
157
+ plt.show()
158
+ ```

4

文法の修正

2020/02/13 07:24

投稿

alpha_high
alpha_high

スコア6

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  とするとき、この二変数関数を二次元のプロットにしたいです・
5
5
 
6
6
  #表示されるエラー
7
- コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、縦に大きくる物になってしまいました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
7
+ コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、値の変わらい一本線になっていました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
8
8
  ```
9
9
  python
10
10
  ```
@@ -42,11 +42,17 @@
42
42
  uvals = [] # u values for this time step
43
43
  for j in range(len(x)):
44
44
  if j == 0: # left boundary
45
+ #上下に動く波になってしまいます
46
+        #uvals.append(-2*np.sin(t)*np.sin(j))
47
+        #ただの直線になってしまいます。
45
- uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
48
+ #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
46
49
  elif j == n-1: # right boundary
47
50
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
48
- else:
51
+ else: 
52
+        #上下に動く波になってしまいます
53
+        #uvals.append(-2*np.sin(t)*np.sin(j))
54
+        #ただの直線になってしまいます。
49
- uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
55
+ #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
50
56
  return uvals
51
57
 
52
58
  # solve for 500 time steps
@@ -72,10 +78,4 @@
72
78
  anim = animation.FuncAnimation(fig,animate,frames=360,interval=20)
73
79
  plt.show()
74
80
  ```
75
- #試してみたこと
81
+ #試してみたこと
76
- 配列を二次元配列や、一次元配列にも変えてみたのですが、できませんでした。
77
- ループの回数を制限し、小さい数で表示してみましたが、何も表示されませんでした。
78
- 境界条件を0にしても、同じ現象でした。
79
-
80
- 教えていただけると本当に嬉しいです。
81
- 宜しくお願い致します。

3

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

2020/02/13 07:15

投稿

alpha_high
alpha_high

スコア6

title CHANGED
File without changes
body CHANGED
@@ -4,8 +4,7 @@
4
4
  とするとき、この二変数関数を二次元のプロットにしたいです・
5
5
 
6
6
  #表示されるエラー
7
- コード自体にはエラーがないようなのですが、アニメーションにすると白い画面出てきて、画像何も表示されません。
7
+ コード自体にはエラーがないようなのですが、アニメーションにすると横に流れるものではなく、縦に大くなる物になっしまいました。expの式で最初のテストを行った際は右から左に波移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうくできませんでした
8
-
9
8
  ```
10
9
  python
11
10
  ```

2

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

2020/02/13 07:12

投稿

alpha_high
alpha_high

スコア6

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  pythonで、波動方程式の二次元関数を書いています。
2
- z=2(cos(x) * sin(cx))
2
+ z=2(cos(x)) * (sin(cx))
3
3
  c=1
4
4
  とするとき、この二変数関数を二次元のプロットにしたいです・
5
5
 

1

配列を変更しました。

2020/02/13 07:10

投稿

alpha_high
alpha_high

スコア6

title CHANGED
File without changes
body CHANGED
@@ -43,12 +43,10 @@
43
43
  uvals = [] # u values for this time step
44
44
  for j in range(len(x)):
45
45
  if j == 0: # left boundary
46
- uvals.append(-2*np.sin(t)*np.sin(j))
47
46
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1]))
48
47
  elif j == n-1: # right boundary
49
48
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1]))
50
49
  else:
51
- uvals.append(-2*np.sin(t)*np.sin(j))
52
50
  uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1]))
53
51
  return uvals
54
52