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

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

    import java.io.*;
    
    class Wave1
    {
            public static void main()
            {
                    int tmax,i;
                    double c,dt,dx;
                    double y[][]=new double[3][100];
    
                    tmax=30;
                    c=1.0;
                    dt=1.0;
                    dx=1.0;
    
                    try
                    {
                            FileWriter fw=new FileWriter("output.data");
    
    /*波の初期条件の決定*/
                            for(i=0;i<100;i++) 
                            {
                                    if(i>10 && i<20) 
                                    {
                                            y[0][i]=10.0;
                                    }
                                    else 
                                    {
                                            y[0][i]=0.0;
                                    }
    
                                    fw.write( + 0 + " " + i + " " + y[0][i] + "\n");
                            }
                            fw.write("\n");
    
                            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;        //境界条件
                            for(i=1;i<100;i++) 
                            {
                                    fw.write( + 1 + " " + i + " " + y[1][i] + "\n");
                            }
                            fw.write("\n");
    
                            for(int t=2;t<tmax;t++) 
                            {
                                    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++) 
                                    {
                                            fw.write( + t + " " + i + " " + y[2][i] + "\n");
                                    }
                                    fw.write("\n");
    
                                    for(i=0;i<100;i++) 
                                    {
                                            y[0][i]=y[1][i];
                                            y[1][i]=y[2][i];
                                    }
                            }
    
                            fw.close();
                    }
                    catch(Exception e)
                    {
                            System.out.println(e);
                    }
    
            }
    }
    
  • GNUPLOT出力結果

    下の画像は、0 から 100 まである横軸は系の位置を表し、もう一方の横軸は時間の経過を表す。縦軸はパルス波の高さである。初期状態のパルスは、左右に半分ずつの高さになり別れ、一方では固定端で反射して、正負逆転していることがわかる。

    下の画像は、上の画像のパルス波の高さを色で塗り分けた 2次元の図である。縦軸は波の位置を、横軸は時間経過を表す。