利用Java中的有限差分求解二阶波1d方程

时间:2014-03-16 20:06:56

标签: java arrays

所以初始条件是phi(x,0)=sin(pi*x)和边界条件 phi(0,t)=0phi(1,t)=0,波速为1。 我写了下面的代码,但有些我怎么没有得到动人的波。

import java.io.File;    
import javax.swing.JFrame;    
import org.math.plot.Plot2DPanel;    

public class q2 {

    private static void Arraycopy(double[] a, double[] b) {
        for (int i = 0; i < a.length; i++) {
            b[i] = a[i];
        }
    }

    public static void main(String args[]) {
        double dx = 0.1;
        double dt = 0.0001;
        double length = 1;
        int N = (int) (length / dx);
        int n = 0;
        double t = 0;
        double beta = dt / dx;

        double[] leadt = new double[N];
        double[] presentt = new double[N];
        double[] lagt = new double[N];

        Plot2DPanel plot = new Plot2DPanel();
        plot.addLinePlot("CFD", presentt);

        for (int i = 0; i < N; i++) {
            presentt[i] = Math.sin(Math.PI * i * dx);
        }

        //Plot2DPanel plot1 = new Plot2DPanel();
        plot.addLinePlot("CFD", presentt);
        //presentt[0]=0;
        //presentt[N-1]=0;
        int a = 0;
        double error = 1;
        int ctr = 1;

        for (int i = 1; i < N - 1; i++) {
            leadt[i] = ((2 * (1 - Math.pow(beta, 2))) * presentt[i]) + ((Math.pow(beta, 2)) * (presentt[i + 1] + presentt[i - 1]));
        }

        a++;
        if (a == 1) {
            Arraycopy(presentt, lagt);
            Arraycopy(leadt, presentt);
        }
        plot.addLinePlot("CFD", presentt);

        while (t < 0.0009) {
            ctr = 0;

            for (int i = 1; i < N - 1; i++) {
                leadt[i] = ((2 * (1 - Math.pow(beta, 2))) * presentt[i]) + ((Math.pow(beta, 2)) * (presentt[i + 1] + presentt[i - 1])) - lagt[i];
                //leadt[0]=0;
                //leadt[N-1]=0;

                error = leadt[i] - presentt[i];
                if (error > 0.01) {
                    ctr = 1;
                }
            }

            n++;
            t = n * dt;
            //leadt[0]=0;
            //leadt[N-1]=0;
            plot.addLinePlot("CFD", presentt);
            Arraycopy(presentt, lagt);
            Arraycopy(leadt, presentt);
            //Arraycopy(leadt,presentt);    
        }
        // put the PlotPanel in a JFrame, as a JPanel
        JFrame frame = new JFrame("a plot panel");
        frame.setContentPane(plot);
        frame.setVisible(true);
        Arraycopy(presentt, lagt);
        Arraycopy(leadt, presentt);
    }
}

每次t=0.2,0.4s时,我都会得到一个以0.5为中心的抛物线输出来满足BC,但不是动态波。

想得到你的帮助吗?

0 个答案:

没有答案