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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1076閲覧

python NameErrorが解決できない

astromelt0416

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/07 15:01

編集2018/10/07 15:14

はじめに

閲覧ありがとうございます。私は統計物理学における相転移現象に関するプログラムを書いています。本プログラムは2次元XYモデルというもので、L×Lのラティス上に弐次元の成分を持つスピンを整列させたもののなります。今起こっている問題自体はこの物理的側面とは関係ないように思われますので、pythonに精通している方に考えて頂ければ幸いです。

現在起こっている問題

2次元XYモデルのpythonによるコードを以下のように書いてみました。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.cm as cm 4 5L = 10 6ESTEP = 1000 7STEP = 100000 8 9# Intitialize the Ising Network 10def Init1(): 11 return np.ones([L,L]) 12 13def Init2(): 14 return np.ones([L,L]) 15 16def Ediff1(IsingA,x,y): 17 return 2*IsingA[x,y]*(IsingA[(x-1)%L,y]+IsingA[(x+1)%L,y]+IsingA[x,(y-1)%L]+IsingA[x,(y+1)%L]) 18 19def Ediff2(IsingB,p,q): 20 return 2*IsingB[p,q]*(IsingB[(p-1)%L,q]+IsingB[(p+1)%L,q]+IsingB[p,(q-1)%L]+IsingB[p,(q+1)%L]) 21 22def Mdiff1(IsingA,x,y): 23 return -2*IsingA[x,y]/(L**2) 24 25def Mdiff2(IsingB,x,y): 26 return -2*IsingB[p,q]/(L**2) 27 28def EnMag(IsingA,IsingB): 29 energy = 0 30 mag = 0 31 for x in np.arange(L): 32 for y in np.arange(L): 33 for p in np.arange(L): 34 for q in np.arange(L): 35 energy = energy - (IsingA[x.y]*(IsingA[(x-1)%L,y]+IsingA[(x+1)%L,y]+IsingA[x,(y-1)%L]+IsingA[x,(y+1)%L])-IsingB[p,q]*(IsingB[(p-1)%L,q]+IsingB[(p+1)%L,q]+IsingB[p,(q-1)%L]+IsingB[p,(q+1)%L])) 36 mag = mag + (IsingA[x,y]*1/(L**2) + IsingB[p,q]*1/(L**2)) 37 return energy*0.5, mag 38 39def Metropolis(T): 40 E_sum1 = 0 41 E_sum2 = 0 42 M_sum1 = 0 43 M_sum2 = 0 44 Esq_sum = 0 45 Msq_sum = 0 46 Ising = (Init1(),Init2()) 47 [E,M] = EnMag(IsingA,IsingB) 48 49 for step in np.arange(STEP): 50 x = np.random.randint(0,L) 51 y = np.random.randint(0,L) 52 p = np.random.randint(0,L) 53 q = np.random.randint(0,L) 54 55 Endiff1 = Ediff1(IsingA,x,y) 56 Endiff2 = Ediff2(IsingB,p,q) 57 Magdiff1 = Mdiff1(IsingA,x,y) 58 Magdiff2 = Mdiff2(IsingB,p,q) 59 60 if Endiff1 <= 0: 61 IsingA[x,y] *= -1 62 E1 += Endiff1 63 M1 += Magdiff1 64 elif np.exp(-Endiff/T) > np.random.rand(): 65 IsingA[x,y] *=-1 66 E1 += Endiff1 67 M1 += Magdiff1 68 69 if Endiff2 <= 0: 70 IsingB[p,q] *= -1 71 E2 += Endiff2 72 M2 += Magdiff2 73 elif np.exp(-Endiff2/T) > np.random.rand(): 74 IsingB[p,q] *=-1 75 E2 += Endiff2 76 M2 += Magdiff2 77 78 if step >= ESTEP: 79 E_sum1 += E1 80 E_sum2 += E2 81 M_sum1 += M1 82 M_sum2 += M2 83 Esq_sum += E1**2+E2**2 84 Msq_sum += M1**2+M2**2 85 86 E_mean = E_sum/(STEP-ESTEP)/(L**2) 87 M_mean = M_sum/(STEP-ESTEP) 88 Esq_mean = Esq_sum/(STEP-ESTEP)/(L**4) 89 Msq_mean = Msq_sum/(STEP-ESTEP) 90 91 return IsingA, IsingB, E_mean, M_mean, Esq_mean, Msq_mean 92 93M = np.array([]) 94E = np.array([]) 95M_sus = np.array([]) 96SpcH = np.array([]) 97for T in np.linspace(0.001,5,10): 98 [IsingA, IsingB, E_mean, M_mean, Esq_mean, Msq_mean] = Metropolis(T) 99 M = np.append(M,np.abs(M_mean)) 100 E = np.append(E,E_mean) 101 M_sus = np.append(M_sus,1/T*(Msq_mean-M_mean**2)) 102 SpcH = np.append(SpcH,1/T**2*(Esq_mean-E_mean**2)) 103 104# plot the figures 105T = np.linspace(0.1,5,20) 106 107plt.figure() 108plt.plot(T, E, 'rx-') 109plt.xlabel(r'Temperature $(\frac{J}{k_B})$') 110plt.ylabel(r'$\langle E \rangle$ per site $(J)$') 111plt.savefig("Exy1007-1.pdf",format='pdf' ,bbox_inches='tight') 112 113plt.figure() 114plt.plot(T, SpcH, 'kx-') 115plt.xlabel(r'Temperature $(\frac{J}{k_B})$') 116plt.ylabel(r'$C_V$ per site $(\frac{J^2}{k_B^2})$') 117plt.savefig("Cvxy1007-1.pdf",format='pdf' ,bbox_inches='tight') 118 119plt.figure() 120plt.plot(T, M, 'bx-') 121plt.xlabel(r'Temperature $(\frac{J}{k_B})$') 122plt.ylabel(r'$\langle|M|\rangle$ per site $(\mu)$') 123plt.savefig("Mxy1007-1.pdf",format='pdf' ,bbox_inches='tight') 124 125plt.figure() 126plt.plot(T, M_sus, 'gx-') 127plt.xlabel(r'Temperature $(\frac{J}{k_B})$') 128plt.ylabel(r'$\chi$ $(\frac{\mu}{k_B})$') 129plt.savefig("chixy1007-1.pdf",format='pdf' ,bbox_inches='tight') 130 131plt.tight_layout() 132fig = plt.gcf() 133plt.show()

これを実行すると以下のようなエラーが出ました。
Traceback (most recent call last):
File "C:/Users/ryo/Desktop/2DXY20181007-3.py", line 98, in <module>
[IsingA, IsingB, E_mean, M_mean, Esq_mean, Msq_mean] = Metropolis(T)
File "C:/Users/ryo/Desktop/2DXY20181007-3.py", line 47, in Metropolis
[E,M] = EnMag(IsingA,IsingB)
NameError: name 'IsingA' is not defined

考えてみたこと

NameErrorということでIsingAに着目したのですが、このコードを作る際に参考にしたコードと比較してみても違いが見つけられませんでした。(そのコードは2次元のイジングモデル(スピンが1次元)のものでした。)

以上、手掛かりがつかめそうな方宜しくお願い致します。

追記1 参考にしたコード

Nil26/Kosterlitz-Thouless-PT より、ising.pyを参考にしました。
(http://https://github.com/Nil26/Kosterlitz-Thouless-PT/blob/master/Ising.py)

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

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

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

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

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

hayataka2049

2018/10/07 15:09 編集

参考にしたコードもできれば掲載してください(web上ならリンク、それ以外なら各種権利等を確認した上で可能なら掲載するようにしてください)。それでどこをどう書き換えたのか説明していただけると回答しやすいです
guest

回答1

0

ベストアンサー

NameError: name 'IsingA' is not defined

IsingAという変数が定義されていない、というエラーです。

グローバル変数の中にも、Metropolisのローカル変数にも存在していないので、当然そうなります。

追記を受けて

元々はこうなってた訳ですね。一部抜粋。

python

1def Metropolis(T): 2 E_sum = 0 3 M_sum = 0 4 Esq_sum = 0 5 Msq_sum = 0 6 Ising = Init() 7 # Calculate the physical quantities 8 [E,M] = EnMag(Ising)

で、こうしたと。

python

1def Metropolis(T): 2 E_sum1 = 0 3 E_sum2 = 0 4 M_sum1 = 0 5 M_sum2 = 0 6 Esq_sum = 0 7 Msq_sum = 0 8 Ising = (Init1(),Init2()) 9 [E,M] = EnMag(IsingA,IsingB)

元々のコードではIsing = Init()の行で定義したIsingEnMagに渡していたのですが、書き換えたコードではIsingAIsingBという未定義の変数を渡そうとしています。

Init1()の結果とInit2()の結果がそれぞれに対応している、というコード意図なのでしょうか? でしたら、そういうコードにすれば動きます。物理的な正しさは考慮していませんので、それについてはご自身でご確認ください。


他の箇所にもたくさんエラーがあるみたいですね・・・。

投稿2018/10/07 15:13

編集2018/10/07 15:26
hayataka2049

総合スコア30933

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

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

astromelt0416

2018/10/07 15:36

回答ありがとうございます。IsingAとIsingBが未定義であるということはわかりました。そのあたりをあまり考えずにコードを写してしまっていたので、現在のコードがどのような構造をしているのか自分でも把握しきれていません。一度持ち帰って考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問