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