みその計算物理学
ホーム はじめに リンク集
1次元波動方程式の数値計算例(Javaアプレット)
  • プログラムソース

    今回はある四角形の形をしたパルス派の進行を数値計算してみる。両端は固定端なので、パルス派は正負逆転するはずである。

    import java.applet.*;
    import java.awt.*;
    /*
     * <applet code="Wave1applet" width=300 height=300>
     * </applet>
    */
    
    public class Wave1applet extends Applet implements Runnable
    {
            int tmax,i,count;
            double c,dt,dx;
            double y[][]=new double[3][100];
    
            Thread t;
    
            public void init()
            {
                    tmax=30;
                    c=1.0;
                    dt=1.0;
                    dx=1.0;
                    count=0;
                    t=new Thread(this);
                    t.start();
            }
    
            public void run()
            {
                    try
                    {
                            for(i=0;i<100;i++) 
                            {
                                    if(i>10 && i<20) 
                                    {
                                            y[0][i]=1.0;
                                    }
                                    else 
                                    {
                                            y[0][i]=0.0;
                                    }
                            }
                            repaint();
                            count++;
                            Thread.sleep(100);
    
                            for(i=1;i<100-1;i++) 
                            {
                                    y[1][i]=y[0][i]+c*c/2.0*dt*dt/(dx*dx)*(y[0][i+1]+y[0][i-1]-2.0*y[0][i]);
                            }
                            y[1][i]=y[1][100-1]=0.0;        //境界条件
                            repaint();
                            count++;
                            Thread.sleep(100);
    
                            while(true) 
                            {
                                    for(i=1;i<100-1;i++) 
                                    {
                                            y[2][i]=2.0*y[1][i]-y[0][i]+c*c*dt*dt/(dx*dx)*(y[1][i+1]+y[1][i-1]-2.0*y[1][i]);
                                    }
                                    y[2][0]=y[2][100-1]=0.0;        //境界条件
                                    for(i=0;i<100;i++) 
                                    {
                                            y[0][i]=y[1][i];
                                            y[1][i]=y[2][i];
                                    }
                                    repaint();
                                    count++;
                                    Thread.sleep(100);
                            }
                    }
                    catch(Exception e)
                    {
                            System.out.println(e);
                    }
            }
    
            public void paint(Graphics g)
            {
                    Dimension d=getSize();
                    g.setColor(Color.black);
                    int w=d.width/100;
                    int h=d.height-1;
                    int y1,y2;
    
                    for(i=0;i<99;i++) 
                    {
                            if(count==0) 
                            {
                                    y1=(int)((h-h*y[0][i])/2);
                                    y2=(int)((h-h*y[0][i+1])/2);
                            }
                            else if(count==1)
                            {
                                    y1=(int)((h-h*y[1][i])/2);
                                    y2=(int)((h-h*y[1][i+1])/2);
                            }
                            else 
                            {
                                    y1=(int)((h-h*y[2][i])/2);
                                    y2=(int)((h-h*y[2][i+1])/2);
                            }
                            g.drawLine(i*w,y1,(i+1)*w,y2);
                    }
            }
    }
    
  • アプレット表示

    初期状態のパルスは、左右に半分ずつの高さになり別れ、一方では固定端で反射して、正負逆転していることがわかる。

    アプレットの表示ができない場合は、Sun Microsystems 社のJavaソフトウェアが必要です。ダウンロードは http://java.com/ja/download/index.jsp でできます。