(著)山たー
ソースコード
//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); }
コメントをお書きください
通りすがり (火曜日, 15 1月 2019 15:31)
3dのIsingモデル解けない?