· 

Isingモデル

(著)山たー

ソースコード

//Spin Ising Model

int[][] field; //スピン状態を記録する配列
float T=5; //初期温度
float k=1; //Boltzmann定数
float y=170; //マウスの位置

void setup(){
  size(450,300);
  background(255);
  field=new int[height][height];
  
  textAlign(CENTER);
  fill(0);
  textSize(20);
  text("Temp",350,25);
  text("0[K]",400,70);
  text("5[K]",400,170);
  text("10[K]",400,270);
  //スピンの初期設定
  for(int i=0;i<height;i++){
    for(int j=0;j<height;j++){
      if(random(1)>0.5){
        field[i][j]=1;
      }else{
        field[i][j]=-1;
      }
    }
  }
}

void draw(){
  //modelSizeの2乗回スピンの反転を実行
    for(int i=0;i<sq(height);i++){
      spin_transition();
    }
  
  //描画
    loadPixels();
  for(int i=1;i<height-1;i++){
    for(int j=1;j<height-1;j++){
      int pos = i + j * width;
      if(field[i][j]==1){
      pixels[pos] = color(255,0,0);
      }else{
      pixels[pos] = color(0,0,255);
      }
      //pixels[pos] = color(col,255,255);

    }
  }
  updatePixels();
  
    //温度調節スライドの描画
  fill(255);
  noStroke();
  rect(315,45,60,230);
  fill(0);
  stroke(4);
  line(345,50,345,270);
  line(325,50,365,50);  
  line(325,160,365,160);
  line(325,270,365,270);
  fill(100,200,0);
  rect(320,y-20, 50,20);
}

//スピンの反転
void spin_transition(){
  int inversion=0;
  //ランダムに格子を選択
  int i=int(random(0,height));
  int j=int(random(0,height));
  int spin=field[i][j];
  int sum;

//周囲のスピン状態を合計する
if(i>1 && i<height-1 && j>1 && j<height-1){
    sum=field[i+1][j]+field[i][j+1]+field[i-1][j]+field[i][j-1];
  }else{
    sum=field[i][j];
  }

  int energy_now=-spin*sum; //現在の相互作用のエネルギーを計算
  int energy_after=spin*sum; //変換後の相互作用のエネルギーを計算
  int d_energy=energy_after-energy_now; //エネルギーの変化量
  
  //スピンが反転したときエネルギーが減少すれば反転
  //あるいは確率で反転
  if(d_energy<0){
    inversion=1;
  }else if(exp((-d_energy)/(k*T))>random(1)){
    inversion=1;
  }
  //inversionが1のとき反転
  if(inversion==1){
    field[i][j]=-field[i][j];
  }
}


//マウスがドラッグされたときに実行
void mouseDragged() 
{
  if(mouseY>=70 && mouseY<=270)
  y=mouseY;
  T=(y-70)/20;
  //println(T);
}

コメントをお書きください

コメント: 1
  • #1

    通りすがり (火曜日, 15 1月 2019 15:31)

    3dのIsingモデル解けない?