pythonで、波動方程式の二次元関数を書いています。
z=2(cos(x)) * (sin(cx))
c=1
とするとき、この二変数関数を二次元のプロットにしたいです・
コード自体にはエラーがないようなのですが、アニメーションにすると波が横に流れるものではなく、値の変わらない一本線になっていました。expの式で最初のテストを行った際は、右から左に波が移っていくアニメーションになっていたのですが、上記のcos,sinの形にするとうまくできませんでした。
#表示されるエラー
uvals.append(-2np.sin(t)np.sin(j))
uvals.append(U[t-1][j] + cdt/(2dx)*(U[t-1][j+1]-U[t-1][n-1]))
上の式を使うと、上下に動く式、下の式を使うと、直線が表示されるようになってしまいました。
initial の式を、
np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
というものでプロットしたときは問題なく右から左にグラフが動く式になりました。動いたのですが、何故式を変えただけで
python
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation # wave speed c = 1 # spatial domain xmin = 0 xmax = 1 n = 50 # num of grid points # x grid of n points X, dx = np.linspace(xmin,xmax,n,retstep=True) # for CFL of 0.1 dt = 1/1024 # initial conditions def initial_u(x): return 2*np.cos(x)*np.sin(0) U = [] def u(x, t): if t == 0: # initial condition return initial_u(x) uvals = [] # u values for this time step for j in range(len(x)): if j == 0: # left boundary #上下に動く波になってしまいます #uvals.append(-2*np.sin(t)*np.sin(j)) #ただの直線になってしまいます。 #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1])) elif j == n-1: # right boundary uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1])) else: #上下に動く波になってしまいます #uvals.append(-2*np.sin(t)*np.sin(j)) #ただの直線になってしまいます。 #uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1])) return uvals # solve for 500 time steps for t in range(500): U.append(u(X, t)) # plot solution fig = plt.figure() ax1 = fig.add_subplot(1,1,1) # animate the time data k = 0 def animate(i): global k x = U[k] k += 1 ax1.clear() plt.plot(X,x) plt.grid(True) plt.ylim([-2,2]) plt.xlim([0,1]) anim = animation.FuncAnimation(fig,animate,frames=360,interval=20) plt.show()
#試してみたこと
下のものが、np.exp(-0.5*np.power(((x-0.5)/0.08), 2))
にて右から左に動くグラフです。
三角関数をプロットするためにいくつか変数は変えたのですが、何故下のプログラムは動くのに右のプログラムは動かないのかがわかりません。教えていただけないでしょうか。
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation # wave speed c = 1 # spatial domain xmin = 0 xmax = 1 n = 50 # num of grid points # x grid of n points X, dx = np.linspace(xmin,xmax,n,retstep=True) # for CFL of 0.1 dt = 1/1024 # initial conditions def initial_u(x): return np.exp(-0.5*np.power(((x-0.5)/0.08), 2)) #return np.sin(x)*(1/10) # each value of the U array contains the solution for all x values at each timestep U = [] # explicit euler solution def u(x, t): if t == 0: # initial condition return initial_u(x) uvals = [] # u values for this time step for j in range(len(x)): if j == 0: # left boundary uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][n-1])) elif j == n-1: # right boundary uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][0]-U[t-1][j-1])) else: uvals.append(U[t-1][j] + c*dt/(2*dx)*(U[t-1][j+1]-U[t-1][j-1])) return uvals # solve for 500 time steps for t in range(500): U.append(u(X, t)) # plot solution fig = plt.figure() ax1 = fig.add_subplot(1,1,1) # animate the time data k = 0 def animate(i): global k x = U[k] k += 1 ax1.clear() plt.plot(X,x) plt.grid(True) plt.ylim([-2,2]) plt.xlim([0,1]) anim = animation.FuncAnimation(fig,animate,frames=360,interval=20) plt.show()
回答1件
あなたの回答
tips
プレビュー