Diffusion -- Comparing a Simulation and a Markov Chain
import java.awt.*;
import java.applet.*;
import java.lang.*;
public class Comparison extends Applet
{
Color back = new Color(247, 243, 234);
Color black = new Color(0, 0, 0);
Color red = new Color(255, 0, 0);
Color green = new Color(0, 255, 0);
Color blue = new Color(0, 0, 255);
int markovleft = 10;
int markovwidth = 200;
int simleft = 230;
int simwidth = 200;
int top = 30;
int height = 200;
double yheight = 200.0;
int iwidth = 39;
int onbottom = 230;
int ontop = 30;
int onleft = 450;
int onright = 470;
int loops = 200;
Graphics sG;
Graphics bG;
Image bI;
double[] markov = new double[5];
double[] newmarkov = new double[5];
int[] sim = new int[5];
int[] newsim = new int[5];
public void init()
{
bI = createImage(this.size().width, this.size().height);
bG = bI.getGraphics();
markov[0] = 0.0;
markov[1] = 0.0;
markov[2] = 1.0;
markov[3] = 0.0;
markov[4] = 0.0;
sim[0] = 0;
sim[1] = 0;
sim[2] = 200;
sim[3] = 0;
sim[4] = 0;
drawscreen();
}
public void paint(Graphics g)
{
g.drawImage(bI, 0, 0, this);
sG = getGraphics();
}
public void update(Graphics g)
{
g.drawImage(bI, 0, 0, this);
}
public void drawscreen()
{
int iheight;
bG.setColor(back);
bG.fillRect(0, 0, 481, 241);
bG.setColor(green);
bG.fillRect(onleft, ontop, onright - onleft, onbottom-ontop);
bG.setColor(black);
for(int i = 0; i < 6; i = i + 1)
{
bG.drawLine(simx(i * 0.20), scale(0.0),
simx(i * 0.20), scale(1.0));
bG.drawLine(markovx(i * 0.20), scale(0.0),
markovx(i * 0.20), scale(1.0));
}
for(int i = 0; i < 5; i = i + 1)
{
iheight = scale(0.0) - scale(markov[i]);
if (iheight > 0)
{
bG.setColor(red);
bG.fillRect(markovx(i * 0.20) + 1, top + height - iheight,
iwidth, iheight);
}
iheight = sim[i];
bG.setColor(blue);
bG.fillRect(simx(i * 0.20) + 1, top + height - iheight,
iwidth, iheight);
}
bG.setColor(black);
bG.drawLine(simx(0.0), scale(0.0),
simx(1.0), scale(0.0));
bG.drawLine(simx(0.0), scale(1.0) - 1,
simx(1.0), scale(1.0) - 1);
bG.drawLine(markovx(0.0), scale(0.0),
markovx(1.0), scale(0.0));
bG.drawLine(markovx(0.0), scale(1.0) - 1,
markovx(1.0), scale(1.0) - 1);
}
public int markovx(double x)
{
int ix;
ix = (int) java.lang.Math.round(markovwidth * x + markovleft);
return ix;
}
public int simx(double x)
{
int ix;
ix = (int) java.lang.Math.round(simwidth * x + simleft);
return ix;
}
public int scale(double y)
{
int iy;
iy = (int) java.lang.Math.round(top + height * (1.0 - y));
return iy;
}
public boolean mouseDown(Event evt, int mx, int my)
{
double spin;
if (my < top) my = top;
if (my > top + height) my = top + height;
for(int i = 0; i < 5; i = i + 1)
{
if ((my >= top) && (my <= top + height) &&
((mx > markovleft + 40 * i) &&
(mx < markovleft + 40 * i + iwidth)) ||
((mx > simleft + 40 * i) &&
(mx < simleft + 40 * i + iwidth))
)
{
markov[i] = (top + height - my)/yheight;
sim[i] = top + height - my;
drawscreen();
sG.drawImage(bI, 0, 0, this);
}
}
if ((mx >= onleft) && (mx <= onright) &&
(my <= onbottom) && (my >= ontop))
{
for (int i = 0; i < loops; i = i + 1)
{
newmarkov[0] = 0.75 * markov[0] + 0.25 * markov[1];
newmarkov[1] = 0.25 * markov[0] +
0.50 * markov[1] +
0.25 * markov[2];
newmarkov[2] = 0.25 * markov[1] +
0.50 * markov[2] +
0.25 * markov[3];
newmarkov[3] = 0.25 * markov[2] +
0.50 * markov[3] +
0.25 * markov[4];
newmarkov[4] = 0.25 * markov[3] + 0.75 * markov[4];
for(int j = 0; j < 5; j = j + 1)
{
markov[j] = newmarkov[j];
}
for(int j = 0; j < 5; j = j + 1)
{
newsim[j] = 0;
}
for(int j = 0; j < sim[0]; j = j + 1)
{
spin = java.lang.Math.random();
if(spin < 0.75)
newsim[0] = newsim[0] + 1;
else
newsim[1] = newsim[1] + 1;
}
for(int j = 0; j < sim[4]; j = j + 1)
{
spin = java.lang.Math.random();
if(spin < 0.75)
newsim[4] = newsim[4] + 1;
else
newsim[3] = newsim[3] + 1;
}
for(int k = 1; k < 4; k = k + 1)
{
for(int j = 0; j < sim[k]; j = j + 1)
{
spin = java.lang.Math.random();
if(spin < 0.25)
newsim[k + 1] = newsim[k + 1] + 1;
else
{
if(spin > 0.75)
newsim[k - 1] = newsim[k - 1] + 1;
else
newsim[k] = newsim[k] + 1;
}
}
}
for(int k = 0; k < 5; k = k + 1)
{
sim[k] = newsim[k];
}
drawscreen();
sG.drawImage(bI, 0, 0, this);
}
}
return true;
}
}
Copyright c 1997 by
Frank Wattenberg, Department of Mathematics, Montana State University,
Bozeman, MT 59717