(著)山たー
ソースコード
//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モデル解けない?