/* * qm4.java - revised 27 Dec 07 - width 401, height 301 * @author jackord@kw.igs.net * superposition of the two lowest energy states of a double well (an * infinite square well with a central barrier) */ import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class qm4 extends Applet implements ActionListener { int kk=0; int plt=0; int first=0; // Declarations String b1s="P Dens"; Button b1=new Button(b1s); String b2s="Yr Yi"; Button b2=new Button(b2s); String b3s="Motion"; Button b3=new Button(b3s); Image bim; Graphics bgr; public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); setBackground(new Color(211, 211, 211)); add(b1); b1.addActionListener(this); add(b2); b2.addActionListener(this); add(b3); b3.addActionListener(this); } public void paint(Graphics g) { int nf, jt, del, tdel; double a, c, e, ea, eb, v, pi, dt, yr, yi, sa, sb; int n=400; double [] ya=new double[n+1]; double [] yb=new double[n+1]; int [] xx=new int[n+1]; int [] yy=new int[n+1]; int [] zz=new int[n+1]; if (first==0) { bim=createImage(401, 301); // Animation buffer bgr=bim.getGraphics(); first=1; } g.setColor(Color.green); g.fillRect(192, 0, 16, 300); // Initial screen g.setColor(Color.black); g.drawRect(0, 0, 400, 300); g.drawLine(0, 150, 400, 150); g.setColor(Color.blue); if (kk==1) { nf=320; del=25; } else { nf=4000; del=10; } pi=Math.PI; c=Math.PI/400; c=c*c; ea=3.8529754; eb=4.07504; // Energy eigenvalues if (kk>0) { e=ea; ya[0]=0; v=0.9; sa=0; for (int i=1; i<=n-1; i=i+1) { // State 1, ya[i] ya[i]=ya[i-1]+v; sa=sa+ya[i]*ya[i]; if ((i>191)&&(i<209)) { a=(200-e)*c; } else { a=-e*c; } v=v+a*ya[i]; } e=eb; yb[0]=0; v=0.9; sb=0; for (int i=1; i<=n-1; i=i+1) { // State 2, yb[i] yb[i]=yb[i-1]+v; sb=sb+yb[i]*yb[i]; if ((i>191)&&(i<209)) { a=(200-e)*c; } else { a=-e*c; } v=v+a*yb[i]; } sb=Math.sqrt(sa/sb); // Normalize for (int i=0; i<=n; i=i+1) { xx[i]=i; yb[i]=sb*yb[i]; } a=2*pi/(eb-ea)/nf; jt=0; long tt=System.currentTimeMillis(); do { // Frame loop bgr.setColor(getBackground()); // Set up plot buffer bgr.fillRect(0, 0, 400, 300); bgr.setColor(Color.green); bgr.fillRect(192, 0, 16, 300); bgr.setColor(Color.black); bgr.drawRect(0, 0, 400, 300); bgr.drawString("Frm "+jt+"/"+nf, 300, 20); bgr.setColor(Color.blue); for (int i=0; i<=n; i=i+1) { // Superposition yr=ya[i]*Math.cos(jt*ea*a)+yb[i]*Math.cos(jt*eb*a); yi=ya[i]*Math.sin(jt*ea*a)+yb[i]*Math.sin(jt*eb*a); if (kk==2) { yy[i]=150-(int)(yr+.5); // Yr zz[i]=150-(int)(yi+.5); // Yi } else { yy[i]=300-(int)(.019*(yr*yr+yi*yi)+.5); } } if (kk==2) { bgr.drawPolyline(xx, yy, n+1); bgr.setColor(Color.red); // Yr bgr.drawPolyline(xx, zz, n+1); bgr.setColor(Color.blue); // Yi } else { bgr.fillPolygon(xx, yy, n+1); } g.drawImage(bim, 0, 0, null); // Show plot buffer while (tt>System.currentTimeMillis()) { } tt=tt+del; jt=jt+1; if (jt==nf+1) { plt=0; kk=0; } } while (plt==1); } } public void actionPerformed(ActionEvent e) { // Buttons String tst; tst=e.getActionCommand(); if (b1s.equals(tst)) { kk=1; } if (b2s.equals(tst)) { kk=2; } if (b3s.equals(tst)) { if (kk>0) { plt=1; } } repaint(); } }