@tomori1ka2da3i0

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonにてプログラムを動かしたい

解決したいこと

pythonにて簡易プログラムを動かそうとしたときのエラーについてご教授お願い致します。Qiitaにて改善案をいただいたのですが私の力が足りずに再度質問させていただきます。

Qiitaの中の「[Pythonによる科学・技術計算]やさしい分子動力学シミュレーション, 2次元系, NVEアンサンブル,熱・統計物理学」の中の簡易プログラムを動かす際にでたエラーについて質問させていただきました。

簡易プログラムについては3年以上前のものになっています。
下記にリンクを添付させていただいております。

https://qiita.com/sci_Haru/items/2b9696911cf0dc29738a

発生している問題・エラー

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 746, in callit
    func(*args)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 253, in idle_draw
    self.draw()
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_agg.py", line 407, in draw
    self.figure.draw(self.renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\figure.py", line 1864, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\deprecation.py", line 411, in wrapper
    return func(*inner_args, **inner_kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_base.py", line 2747, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 931, in draw
    Collection.draw(self, renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 404, in draw
    mpath.Path(offsets), transOffset, tuple(facecolors[0]))
TypeError: must be real number, not str
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 242, in resize
    self.draw()
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_agg.py", line 407, in draw
    self.figure.draw(self.renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\figure.py", line 1864, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\deprecation.py", line 411, in wrapper
    return func(*inner_args, **inner_kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_base.py", line 2747, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 931, in draw
    Collection.draw(self, renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 404, in draw
    mpath.Path(offsets), transOffset, tuple(facecolors[0]))
TypeError: must be real number, not str
MovieWriter imagemagick unavailable; using Pillow instead.
Traceback (most recent call last):
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 251, in saving
    yield self
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1145, in save
    writer.grab_frame(**savefig_kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 548, in grab_frame
    buf, **{**savefig_kwargs, "format": "rgba", "dpi": self.dpi})
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\figure.py", line 2311, in savefig
    self.canvas.print_figure(fname, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backend_bases.py", line 2217, in print_figure
    **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backend_bases.py", line 1639, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_agg.py", line 453, in print_raw
    FigureCanvasAgg.draw(self)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_agg.py", line 407, in draw
    self.figure.draw(self.renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\figure.py", line 1864, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\cbook\deprecation.py", line 411, in wrapper
    return func(*inner_args, **inner_kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_base.py", line 2747, in draw
    mimage._draw_list_compositing_images(renderer, self, artists)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\image.py", line 131, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 931, in draw
    Collection.draw(self, renderer)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\artist.py", line 41, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\collections.py", line 404, in draw
    mpath.Path(offsets), transOffset, tuple(facecolors[0]))
TypeError: must be real number, not str

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/a1527/PycharmProjects/pythonProject/ryuusi.py", line 267, in <module>
    ani.save("output.gif", writer="imagemagick")
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1145, in save
    writer.grab_frame(**savefig_kwargs)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 253, in saving
    self.finish()
  File "C:\Users\a1527\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 554, in finish
    self._frames[0].save(
IndexError: list index out of range

または、問題・エラーが起きている画像をここにドラッグアンドドロップ。

該当するソースコード

import numpy as np
import random
import matplotlib.pyplot as plt
import matplotlib.animation as animation


fig = plt.figure(figsize = (8, 6))
ims = []


lat_x = 1.291 # 格子定数: x
lat_y = 1.291
Lx = 5 # 格子点: x
Ly = 5
N_atom = Lx*Ly
m=1 # 質量

delta_t = 0.002 # MDステップの間隔

T_initial = 50  # initial temperature [K]
T_initial = T_initial /119 # convert to natural unit


Max_step = 1000  #MD ステップ数

x = np.zeros([N_atom],float)
y = np.zeros([N_atom],float)

vx = np.zeros([N_atom],float)
vy = np.zeros([N_atom],float)

fx = np.zeros([N_atom,2],float)# Q: What is this "2"?
fy = np.zeros([N_atom,2],float)


# step毎の物理量の格納
T_lis = []
P_lis =  []
KE_lis =[]
PE_lis =[]
Eot_lis =[]
Tav_lis = []
Pav_lis =  []
KEav_lis =[]
PEav_lis =[]
Eotav_lis =[]
##

density = N_atom/(Lx*Ly*lat_x*lat_y) # 数密度: 2次元

print ("number density = ", density)
def twelveran():
    s = 0
    for i in range(1,13):
        s += random.random()
    return s/12.0 - 0.5


def Maxwell_velocity2D(TT): # マクスウェルの速度分布: ボックス-ミュラー法: self
    for i in range(N_atom):
        R1=random.random()
        R2=random.random()
        R3=random.random()
        R4=random.random()
        vx[i] = (np.sqrt(-2* (TT/m)*np.log(R1)))*np.cos(2*np.pi*R2)
        vy[i] = (np.sqrt(-2* (TT/m)*np.log(R3)))*np.cos(2*np.pi*R4)

def initialposMaxwellvel():
    i=-1
    for ix in range(Lx):
        for iy in range(Ly):
            i += 1
            x[i] = lat_x*ix
            y[i] = lat_y*iy

    Maxwell_velocity2D(T_initial)





def sign(a,b):
    if b >= 0:
        return abs(a)
    else:
        return -abs(a)

def Forces(t,w,PE,PEorW):
    rcut = 4 # 力のカットオフ半径
    PE = 0

    r2cut = rcut**2


    fx[:,t] = 0
    fy[:,t] = 0
    for i in range(N_atom-1):
        for j in range(i+1, N_atom):
            dx = x[i] - x[j]
            dy = y[i] - y[j]

            # 近接イメージ(鏡像)相互作用
            if (abs(dx) > 0.5*lat_x*Lx):
                dx = dx - sign(lat_x*Lx,dx)
            if (abs(dy) > 0.5*lat_y*Ly):
                dy = dy-sign(lat_y*Ly,dy)
            r2 = dx**2+dy**2

            if (r2 < r2cut):
                if r2 == 0 :
                    r2 = 0.0001
                invr2 = 1/r2

                wij = 48*(invr2**3-0.5)*(invr2**3)
                fijx = wij*invr2*dx
                fijy = wij*invr2*dy

                fx[i,t] += fijx
                fy[i,t] += fijy
                fx[j,t] -= fijx
                fy[j,t] -= fijy

                PE += 4*(invr2**3)*((invr2**3)-1)
                w += wij
    if (PEorW == 1) :
        return PE
    else :
        return w

# メイン: 時間発展
def time_evolution():

    avT = 0
    avP = 0
    Pavg = 0
    avKE=0
    avPE=0

    t1 = 0
    PE = 0.0

    # 初期化
    KE = 0
    w = 0

    initialposMaxwellvel()  # 初期状態の構築

    KE = (np.sum(vx**2)+np.sum(vy**2))/2
    T = KE/N_atom
    P = density*(2*KE+1.5*w)/(3*N_atom) # 圧力の計算(2次元系)

    PE = Forces(t1, w, PE, 1)
    time = 1
    n_step=0

    # 値の保存
    T_lis.append(T*119) # K 単位
    P_lis.append(P*2.382*1e-8)  # Pa 単位
    KE_lis.append(KE/N_atom)
    PE_lis.append(PE/N_atom)
    dumEtot = KE+PE
    Eot_lis.append( dumEtot /N_atom)


    while n_step < Max_step:
        if n_step % 50 ==0:
            print ("step=",n_step)
            #print("T=",T*119,"K/N = ",KE/N_atom," Pot/N = ",PE/N_atom," Etot/N = ",(KE+PE)/N_atom, " P=",P)

        #print("x[0] =",x[0] )
       # ax.set_title("t ="  + str("{0:.1f}".format(n_step*delta_t)))

        if n_step % 5 ==0:
            im=plt.scatter(x, y, s=120, c="red", alpha=0.9, linewidths="1.5",edgecolors="black")
            ims.append([im])

        n_step += 1



        for i in range(N_atom):
            PE = Forces(t1, w, PE, 1)
            # 速度ベルレー法による更新
            x[i] +=delta_t*(vx[i]+delta_t*fx[i,t1]/2)
            y[i] +=delta_t*(vy[i]+delta_t*fy[i,t1]/2)

            if x[i] <= 0:
                x[i] += lat_x*Lx
            if x[i] >= lat_x*Lx:
                x[i] -= lat_x*Lx
            if y[i] <= 0:
                y[i]  += lat_y*Ly
            if y[i] >= lat_y*Ly:
                y[i] -= lat_y*Ly



        PE = 0.
        t2=1
        PE = Forces(t2, w, PE, 1)

        KE = 0.
        w = 0.



            #for i in range(N_atom):
        # 速度ベルレー法による更新
        vx[:] += delta_t*(fx[:,t1]+fx[:,t2])/2
        vy[:] += delta_t*(fy[:,t1]+fy[:,t2])/2

        KE =(np.sum(vx**2)+np.sum(vy**2))/2




        w = Forces(t2, w, PE, 2)
        T = KE/N_atom

        #        P = density*(KE + w)
        P = density*(2*KE+1.5*w)/(3*N_atom) # 圧力の計算




        #平均値
        avT += T
        avP += P
        avKE += KE
        avPE += PE
        time +=1
        t = time
        if (t == 0):
             t = 1

        # 時間平均
        Pavg =avP/t
        eKavg = avKE/t
        ePavg = avPE/t
        Tavg = avT/t

        T_lis.append(T*119) # K 単位
        P_lis.append(P*2.382*1e-8)  # Pa 単位
        KE_lis.append(KE/N_atom)
        PE_lis.append(PE/N_atom)
        dumEtot = KE+PE
        Eot_lis.append( dumEtot /N_atom)

        Tav_lis.append(Tavg*119 )# K 単位
        Pav_lis.append(Pavg*2.382*1e-8)
        KEav_lis.append(eKavg/N_atom)
        PEav_lis.append(ePavg/N_atom)





##

time_evolution() #メイン

# プロット+動画の保存
plt.axis([0,lat_x*Lx,0,lat_y*Ly])
ani = animation.ArtistAnimation(fig, ims, interval =1)
plt.show()
ani.save("output.gif", writer="imagemagick")

自分で試したこと

前回質問させていただいた際は%matplotlib nbaggの部分でエラーが出ていたので質問させていただきました。回答をいただくことができ、該当の部分を一行削除することで動作したとのことだったのですがエラーが出ました。
様々な方法を探してみてエラーの意味は理解できたのですがどこをどのように修正すればよいのかわかりません。
ご教授お願いします。

0 likes

1Answer

174行目、

im=plt.scatter(x, y, s=120, c="red", alpha=0.9, linewidths="1.5",edgecolors="black")

linewidths="1.5"linewidths=1.5 にしたら動きました。

0Like

Comments

  1. @uasiさん回答ありがとうございました。
    無事に動作を確認することができました。とても助かりました。

Your answer might help someone💌