我想根据这个matlab代码(部分内容)解决一个pde:
.............
% Evaluate the initial conditions
x = xl : dx : xr; % generate the grid point
% f(1:J+1) since array index starts from 1
f = sin(pi*x) + sin(2*pi*x);
% store the solution at all grid points for all time steps
u = zeros(J+1,Nt);
% Find the approximate solution at each time step
for n = 1:Nt
t = n*dt; % current time
% boundary condition at left side
gl = sin(pi*xl)*exp(-pi*pi*t)+sin(2*pi*xl)*exp(-4*pi*pi*t);
% boundary condition at right side
gr = sin(pi*xr)*exp(-pi*pi*t)+sin(2*pi*xr)*exp(-4*pi*pi*t);
if n==1 % first time step
for j=2:J % interior nodes
u(j,n) = f(j) + mu*(f(j+1)-2*f(j)+f(j-1));
end
u(1,n) = gl; % the left-end point
u(J+1,n) = gr; % the right-end point
else
for j=2:J % interior nodes
u(j,n)=u(j,n-1)+mu*(u(j+1,n-1)-2*u(j,n-1)+u(j-1,n-1));
end
u(1,n) = gl; % the left-end point
u(J+1,n) = gr; % the right-end point
end
end
% Plot the results
tt = dt : dt : Nt*dt;
figure(1)
surf(x,tt, u'); % 3-D surface plot
............
我是用c ++做的:
double f(double x){
return sin(pi*x) + sin(2.0*pi*x);
}
double gl(double x,double t){
return sin(pi*x)*exp(-pi*pi*t) +sin(2.0*pi*x)*exp(-4.0*pi*pi*t);
}
double gr(double x,double t){
return sin(pi*x)*exp(-pi*pi*t) +sin(2.0*pi*x)*exp(-4.0*pi*pi*t);
}
using namespace std;
const int Nt=50; // number of time steps
const int J=10; // number of division for x
double xl=0,xr=1.0; //left and right boundaries
double tf=0.1; //final simulation time
double dt,dx; //dx is the mesh size
double x;
double u[J][Nt];
int main()
{
dx=(xr-xl)/J;
dt=tf/Nt;
double m=dt/(dx*dx);
//Evaluate the initial conditions
//generate the grid point
for (x=xl;x<=xr;x+=dx) {
f(x);
}
//store the solution at all grid points for all time steps
for (int i=0;i<J;i++){
for (int j=0;j<Nt-1;j++){
u[i][j]=0;
}
}
//find the approximate solution at each time step
int n,t,j;
for (n=0;n<Nt;n++){
t=(n+1)*dt; //current time
// boundary condition at left side
gl(xl,t);
//boundary condition at right side
gr(xr,t);
if (n==0) {//first time step
for (j=1;j<J-1;j++){
u[j][n]=f(j)+m*(f(j+1)-2.0*f(j)+f(j-1));
}
u[0][n]=gl(xl,t);
u[J-1][n]=gr(xr,t); }
else {
for(j=1;j<J-1;j++){
u[j][n]=u[j][n-1]+m*(u[j+1][n-1]-2.0*u[j][n-1]+u[j-1][n-1]);
}
u[0][n]=gl(xl,t);
u[J-1][n]=gr(xr,t);
}
}
ofstream data;
data.open("Data.dat");
for (int tt=dt;tt<=Nt*dt;tt+=dt){
data<< tt <<"\t"<<x<<"\t"<< u[J][Nt]<<endl;
}
cout <<"\nFiles written! "<<endl;
return 0;
}
问题是我得到的数据文件只有0 1.1 -3.58979e-09。 也许问题出在索引中?或者我搞砸了?
答案 0 :(得分:0)
你有几个严重的问题:
你对lops的所有问题都有疑问。总是比数组中存在的值多一个值。由于您使用零启动循环,因此应使用<
而不是<=
。
您在数组中使用无效索引:u[J][Nt-1]
而不是初始化循环中的u[i][j]
,而主循环中使用u[J][n]
而不是u[J-1][n]
。例如,初始化循环应该是:
for (int i = 0; i < J; i++) {
for (int j = 0; j < Nt-1; j++) {
u[i][j] = 0;
}
}
奇怪的是,您没有获得访问冲突异常,因为您正在尝试访问阵列外的值。
您在第一次迭代时检查n == 1
而不是n == 0
为了使计算与Matlab相等,您应该计算t = (n + 1) * dt;
,因为在Matlab中你从1开始。
相反,循环for(j=0;j<=J-2;j++)
应该是for(j=1; j < J-1; j++)
第一个循环中的f(x)
毫无意义,就像gl(xl, t)
&amp;主循环开始时gr(xr, t)
。
顺便问一下你是如何定义这些功能的?也可能存在问题。
与此同时,您应该在继续测试应用程序之前解决这些问题。