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

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

ただいまの
回答率

90.33%

  • Python

    9289questions

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

  • Python 3.x

    7456questions

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

for ループを用いて自動で計算を行いたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 92

閲覧ありがとうございます。

以下のコードでは初めに変数Tを指定することでHという値を出力するプログラムになっています。

# import library
import numpy as np
import matplotlib.pyplot as plt
from random import random,randrange

np.random.seed(0)

L = 64
Nx = int(L)
Ny = int(L)
T = 0.1
ESTEP = 40000
STEP = 10000


#S = np.random.uniform(0,2*np.pi,(L,L))
S = np.zeros((Nx,Ny),dtype = float)

def eq():
    for x in range(ESTEP):


        i = randrange(Nx)
        j = randrange(Ny)

        S_al = np.random.uniform(0,2*np.pi)

        E =     -np.cos(S[i , j] - S[(i+1)%Nx , j])\
                -np.cos(S[i , j] - S[(i-1)%Nx , j])\
                -np.cos(S[i , j] - S[i , (j+1)%Ny])\
                -np.cos(S[i , j] - S[i , (j-1)%Ny]) 

        E_al = -np.cos(S_al - S[(i+1)%Nx , j])\
               -np.cos(S_al - S[(i-1)%Nx , j])\
               -np.cos(S_al - S[i , (j+1)%Ny])\
               -np.cos(S_al - S[i , (j-1)%Ny])

        deltaE = E_al -E

        if deltaE < 0:

            #スピンを更新
            S[i,j] = S_al
            #エネルギーを計算
            for i in range(Nx):
                for j in range(Ny):
                    e = -np.cos(S[i , j] - S[(i+1)%Nx , j])\
                         -np.cos(S[i , j] - S[(i-1)%Nx , j])\
                         -np.cos(S[i , j] - S[i , (j+1)%Ny])\
                         -np.cos(S[i , j] - S[i , (j-1)%Ny])






        else:
            if np.random.random() < np.exp(-deltaE/T):

                #スピンを更新
                S[i,j] = S_al
                #エネルギーを計算
                for i in range(Nx):
                    for j in range(Ny):
                        e = -np.cos(S[i , j] - S[(i+1)%Nx , j])\
                             -np.cos(S[i , j] - S[(i-1)%Nx , j])\
                             -np.cos(S[i , j] - S[i , (j+1)%Ny])\
                             -np.cos(S[i , j] - S[i , (j-1)%Ny])


        #print(np.sum(esum)/L**2/2,x)
        #print(np.sum(mag)/L**2,x)



    return S


def Monte():
    S = eq()

    Y11 = []
    Y22 = []


    for y in range(STEP):

        Y1 = []
        Y2 = []

        i = randrange(Nx)
        j = randrange(Ny)

        S_al = np.random.uniform(0,2*np.pi)

        E =     -np.cos(S[i , j] - S[(i+1)%Nx , j])\
                -np.cos(S[i , j] - S[(i-1)%Nx , j])\
                -np.cos(S[i , j] - S[i , (j+1)%Ny])\
                -np.cos(S[i , j] - S[i , (j-1)%Ny]) 

        E_al = -np.cos(S_al - S[(i+1)%Nx , j])\
               -np.cos(S_al - S[(i-1)%Nx , j])\
               -np.cos(S_al - S[i , (j+1)%Ny])\
               -np.cos(S_al - S[i , (j-1)%Ny])

        deltaE = E_al -E

        if deltaE < 0:
            S[i,j] = S_al

            #helicity
            for i in range(Nx):
                for j in range(Ny):
                    y1 = np.cos(S[i,j]-S[(i+1)%Nx,j])
                    y2 = np.sin(S[i,j]-S[(i+1)%Nx,j])
                    Y1.append(y1)
                    Y2.append(y2)


            Y11.append(np.sum(Y1)/L**2)
            Y22.append(np.sum(Y2)/L**2)


        else:
            if np.random.random() < np.exp(-deltaE/T):

                #スピンを更新
                S[i,j] = S_al

                #helicity
                for i in range(Nx):
                    for j in range(Ny):
                        y1 = np.cos(S[i,j]-S[(i+1)%Nx,j])
                        y2 = np.sin(S[i,j]-S[(i+1)%Nx,j])
                        Y1.append(y1)
                        Y2.append(y2)


                Y11.append(np.sum(Y1)/L**2)
                Y22.append(np.sum(Y2)/L**2)







        del Y1[:]
        del Y2[:]

    H = (np.sum(Y11)/len(Y11)) -(((np.sum(Y22))/(len(Y22)))**2)*(L**2/T)
    print(H)
    print(T,L)



if __name__ == '__main__':
    eq()
    Monte()

Tの値は0.1~2.5まで0.05の幅で変化させ、その度にHを得るという作業をしているのですが、どうにかしてこの作業を自動化できないでしょうか。具体的には、forループを用いて、一度runさせるとT=0.1~2.5のすべてのTにおけるHをprintするというプログラムに書き換えたいと考えています。詳しい方、助言をいただけると助かります。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

   eq()
   Monte()

上記をループすれば良いです。以下のような感じ

for t in range(0.1,2.5,0.05):
 T = t
 eq()
 Monte8)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

eq()とMonte()の呼び出しをforかwhileで囲み、Tの足し込みを行う。
0.05は2進数で表現できないので、10から250まで5きざみで変化させ、100で割って使う方が誤差が小さくなる。整数を整数で割ると整数になることにも注意。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python

    9289questions

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

  • Python 3.x

    7456questions

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