みその計算物理学
ホーム はじめに リンク集
イジングモデルの数値計算例(Java)
  • プログラムソース

    1次元イジングモデル。

    import java.io.*;
    
    class Co
    {
            static final int n=500;                 //系の最大数
            static final int tmax=1000;
            static final double J=1.0;              //交換相互作用
            static final double kT=10.0;    //ボルルマン定数×温度
    }
    
    class Isingmodel1
    {
            public static void main()
            {
                    int i,j,m;
                    double spin[]=new double[Co.n];
                    double beta,oldE,newE;
    
                    Isingmodel1 f=new Isingmodel1();
    
                    beta=1.0/(Co.kT);
    
                    try
                    {
                            FileWriter fw1=new FileWriter("output1.data");
                            FileWriter fw2=new FileWriter("output2.data");
    
                            for(i=0;i<Co.n;i++) 
                            {
                                    spin[i]=1.0;            //スピン初期状態の決定
                            }
    
                            for(i=0;i<Co.tmax;i++) 
                            {
                                    oldE=f.E(spin);           //前のエネルギー値
                                    m=(int)Math.floor(Math.random()*Co.n);
                                    spin[m]*=-1.0;          //スピンの向きを変える
                                    newE=f.E(spin);           //新しいエネルギー
    
                                    if(f.judge(beta,oldE,newE)==1) spin[m]*=-1.0;   //1が帰ってきたらスピンの方向を戻す
    
                                    for(j=0;j<Co.n;j++) 
                                    {
                                            if(spin[j]==1.0) 
                                            {
                                                    fw1.write(i + " " + j + "\n");
                                            }
                                            else if(spin[j]==-1.0) 
                                            {
                                                    fw2.write(i + " " + j + "\n");
                                            }
                                    }
                            }
    
                            fw1.close();
                            fw2.close();
                    }
                    catch(Exception e)
                    {
                            System.out.println(e);
                    }
            }
    
    //スピン相互作用によるエネルギーの計算
            double E(double spin[])
            {
                    int i;
                    double E;
    
                    E=0.0;
    
                    for(i=0;i<(Co.n-1);i++) 
                    {
                            E+=-Co.J*spin[i]*spin[i+1];
                    }
    
                    return E;
            }
    
    //新しい状態が実現するなら0、しないなら1を返す
            int judge(double beta,double oldE,double newE)
            {
                    if((newE>oldE) && (Math.exp(-beta*(newE-oldE)) <= Math.random())) return 1;
                    else return 0;
            }
    }
    
  • GNUPLOTでの出力結果

    横軸が時間経過、縦軸が1次元の系の位置を表す。赤色がスピン上向き、緑色がスピン下向きを表す。 様々な結果が得られるので初期値や条件を変えて数値計算してみるとよい。