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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

697閲覧

【python】plotした点の色が値によって変化するアニメーションの作成

s1920897

総合スコア14

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2020/08/01 03:21

前提・実現したいこと

温度解析をするプログラムを作っています。
具体的には、正方形平面の上部の一部に熱を与えて、その温度拡散をアニメーション化したいと考えています。
表現方法は、時刻ごとに粒子毎にマーカーの色を変えることで温度拡散を表現したいと考えています。

プログラミング初心者ゆえ、至らないところもあるかと思いますが、何卒よろしくお願い致します。

発生している問題・エラーメッセージ

アニメーションが動かなく、例えば解析時間をT=10にすると、T=10のグラフが出力されてします。

該当のソースコード

python

1import matplotlib.pyplot as plt 2import matplotlib.animation as animation 3import numpy as np 4import math 5from mpl_toolkits.mplot3d import Axes3D 6from matplotlib import animation 7##ダムブレイクモデルにeq2をいれて、1000度を超えたら高粘性を与える 8 9 10DIM = 2 ##次元 11D = 1 12 13#pi = math.pi ##円周率 14r = 1.0 ##粒子半径,アニメーションにのみ使用 15dx = 2.0*r ##初期粒子間距離 16h = 1.0*dx ##1~1.2の間でかける 17re = 3.0*h ##影響半径 18##解析範囲の設定 19H = 20 ##解析範囲の高さ方向の粒子数 20W = 20 ##解析範囲の高さ方向の粒子数 21ρ0 = 2700.0 ##水の密度 22T = 1.0 23dt =0.1 24TH_O = 1200 25ms = 4 26 27Rx_wall = [] ##壁粒子の位置 28Ry_wall = [] 29 30Rx_in = [] ##内部粒子の位置 31Ry_in = [] 32 33C_x_f = 2*re ##坩堝の左下の粒子位置x 34C_x_l = W*(2*r) - 2*re ##坩堝の右下の粒子番号x 35 36 37for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 38 for k in range(0,H): 39 x = r + i*(2*r) 40 y = r + k*(2*r) 41 if x <= C_x_f and C_x_f <= y:##左上 42 Rx_wall.append(x) 43 Ry_wall.append(y) 44 if y < C_x_f:##真下 45 Rx_wall.append(x) 46 Ry_wall.append(y) 47 if C_x_l <= x and C_x_f <= y: 48 Rx_wall.append(x) 49 Ry_wall.append(y) 50 51N_wall = len(Rx_wall) ##壁粒子の数 52 53for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 54 for k in range(0,H): 55 x = r + i*(2*r) 56 y = r + k*(2*r) 57 if C_x_f <= x and x < W*(2*r)-C_x_f and C_x_f <= y : 58 Rx_in.append(x) 59 Ry_in.append(y) 60 61N_in = len(Rx_in) ##坩堝内の粒子数 62N = N_in + N_wall 63#print(Rx_in,Ry_in) 64print("粒子数",N,"壁内粒子数",N_in,"壁粒子数",N_wall) 65plt.plot(Rx_wall,Ry_wall,color = "k",linestyle = "None",marker ="o",markersize = ms) 66plt.plot(Rx_in,Ry_in,color = "b",linestyle = "None",marker ="o",markersize = ms) 67plt.show() 68 69 70 71 72Rx = np.zeros(N,dtype=np.float) 73Ry = np.zeros(N,dtype=np.float) 74for i in range(N): 75 if i < N_in: 76 Rx[i] = Rx_in[i] 77 Ry[i] = Ry_in[i] 78 if N_in <= i: 79 Rx[i] = Rx_wall[i-N_in] 80 Ry[i] = Ry_wall[i-N_in] 81fig = plt.figure() 82ims = [] 83 84TH = np.zeros(N,dtype=np.float) 85r_TH_O = 5 86 87for t in range(int(T/dt)): 88 print(t*dt) 89 90 for i in range(N):##温度拡散の計算、i粒子について調べる 91 dTH = 0 92 for k in range(N):##k粒子がi粒子の近傍に存在するか確認 93 dis = math.sqrt((Rx[i]-Rx[k])**2 + (Ry[i]-Ry[k])**2) 94 s = dis/h 95 if s < 1.0 and 0.0 < s : 96 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0 -75.0*(1.0-s)**4.0) 97 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 98 elif s < 2.0 and 1.0 <= s : 99 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0) 100 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 101 elif s < 3.0 and 2.0 <= s : 102 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0) 103 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 104 else: 105 continue 106 TH[i] += dTH 107 for i in range(N): 108 if Ry[i] >= H*(2*r)-2*r and r+r*W-r_TH_O <= Rx[i] and Rx[i] <= r+r*W+r_TH_O:##坩堝の照射範囲内にある粒子を強制的に1200度にする 109 TH[i]=TH_O 110 im = plt.scatter(Rx,Ry, vmin=min(TH), vmax=max(TH), c=TH, cmap="plasma") 111 ims.append([im]) 112 113cbar = plt.colorbar() 114ani = animation.ArtistAnimation(fig, ims) 115#ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow') 116plt.show()

試したこと

時刻ごとにファイルを出力して、熱が拡散されていることを確認しました。

補足情報(FW/ツールのバージョンなど)

すみません。何を書けばいいのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

描画結果をappendするループ内でplt.show()すると正常に描画されることから、コードには問題ないと思われます。おかしな挙動ですね。
とりあえず以下のようにintに丸めるとこちらの3.x環境では正常にアニメーション描画できました。

Python

1 #im = plt.scatter(Rx,Ry, vmin=min(TH), vmax=max(TH), c=TH, cmap="plasma") 2 THi = list(map(int,TH)) 3 im = plt.scatter(Rx,Ry, vmin=min(THi), vmax=max(THi), c=THi, cmap="plasma")

投稿2020/08/01 13:36

can110

総合スコア38262

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

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

s1920897

2020/08/06 06:36

回答ありがとうござます。 視覚的に見ることができるようになりました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問