質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1969閲覧

二次元波動方程式のグラフ

lucy-0333

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/04 11:02

編集2021/06/04 12:01

二次元の波動方程式を数値的に時に、時間による波の形の推移をアニメーションに表示するプログラムを作成しました。このプログラムにおいて、t=0.5,1など、指定した時間における波の状態のみを画像で出力して保存したいのですが、うまくいきません。現状アニメーションまではちゃんと動作しています。下のプログラムについて、三変数関数であるuに対して、変数であるtの部分に時刻を指定してやればいいと思ったのですが、tに具体的な数字を入れるだけでは作動してくれません。どうすればいいでしょうか?

python

1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4import matplotlib.animation as animation 5 6#パラメータ設定 7dx = 0.02 8dy = dx 9dt = 0.01 10tmin = 0.0 11tmax = 3.0 12 13#正方形エリアの設定 14xmin = 0.0 15xmax = 1.0 16ymin = 0.0 17ymax = 1.0 18 19v = 1.0 20rsq = (v*dt/dx)**2 21 22#分割数の設定 23nx = int((xmax-xmin)/dx)+1 24ny = int((ymax-ymin)/dy)+1 25nt = int((tmax-tmin)/dt)+2 26 27X = np.linspace(xmin,xmax,nx) 28Y = np.linspace(ymin,ymax,ny) 29X,Y = np.meshgrid(Y,X) 30 31u = np.zeros((nt,nx,ny)) 32 33#初期条件 34u_0 = np.exp(-(X-0.5)**2*3)*np.exp(-(Y-0.5)**2*3)*2 35u_1 = np.zeros((nx,ny)) 36u[0] = u_0 37u[1] = u[0]+dt*u_1 38 39#計算 40for t in range(1,nt-1): 41 for x in range(1,nx-1): 42 for y in range(1,ny-1): 43 u[t+1,x,y] = 2*(1-2*rsq)*u[t,x,y]-u[t-1,x,y]+rsq*(u[t,x-1,y]+u[t,x+1,y]+u[t,x,y-1]+u[t,x,y+1]) 44 #for x in range(1,nx-1): 45 #u[t+1,x,0] = u[t+1,x,1] 46 #u[t+1,x,ny-1] = u[t+1,x,ny-2] 47 #for y in range(1,ny-1): 48 #u[t+1,x,0] = u[t+1,1,y] 49 #u[t+1,nx-1,y] = u[t+1,nx-2,y] 50 #u[t,0,0] = (u[t,1,0]+u[t,0,1])/2 51 #u[t,nx-1,0] = (u[t,nx-2,0]+u[t,nx-1,1])/2 52 #u[t,0,ny-1] = (u[t,1,ny-1]+u[t,0,ny-2])/2 53 #u[t,nx-1,ny-1] = (u[t,nx-2,ny-1]+u[t,nx-1,ny-2])/2 54fig = plt.figure() 55fig.set_dpi(100) 56ax = Axes3D(fig) 57 58def animate(i): 59 ax.clear() 60 ax.plot_surface(X,Y,u[i],rstride=1,cstride=1,cmap=plt.cm.coolwarm) 61 ax.set_zlim(-3,3) 62 63anim = animation.FuncAnimation(fig,animate,frames=nt-1,interval=10,repeat=False) 64anim.save("animation1.gif",writer="pillow") 65 66 67plt.show()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/04 11:10

このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
jbpb0

2021/06/04 11:30

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
lucy-0333

2021/06/04 12:08

申し訳ありません。修正いたしました。
jbpb0

2021/06/04 12:24

> uに対して、変数であるtの部分に時刻を指定 u[int(時刻/dt)] で、どうでしょうか? 時刻はtmin〜tmaxのどれか
lucy-0333

2021/06/04 13:09

plt.plot(X,Y,u[int(0.5/dt),X,Y]) このような感じでつけてみましたが、「arrays used as indices must be of integer (or boolean) type」というエラーが発生しました。
jbpb0

2021/06/04 13:23 編集

plot()じゃなくてplot_surface()です また、u[int(0.5/dt),X,Y]の「,X,Y」は要らないはず anim =... anim.save(... の行を無効にして、その代わりに plt.show() のすぐ上に animate(int(時刻/dt)) を追加したら、どうでしょうか?
lucy-0333

2021/06/04 13:34

解決しました!本当にありがとうございました!
guest

回答1

0

ベストアンサー

uに対して、変数であるtの部分に時刻を指定

python

1anim = animation.FuncAnimation(fig,animate,frames=nt-1,interval=10,repeat=False) 2anim.save("animation1.gif",writer="pillow")

python

1animate(int(時刻/dt))

時刻はtmin〜tmaxのどれか

投稿2021/06/04 14:45

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lucy-0333

2021/06/04 14:50

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問