所以初始条件是phi(x,0)=sin(pi*x)
和边界条件
phi(0,t)=0
和phi(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,但不是动态波。
想得到你的帮助吗?