将matlab“转换”为c ++ - 数字pde -

时间:2011-04-11 09:14:30

标签: c++ matlab

我想根据这个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。 也许问题出在索引中?或者我搞砸了?

1 个答案:

答案 0 :(得分:0)

你有几个严重的问题:

  1. 你对lops的所有问题都有疑问。总是比数组中存在的值多一个值。由于您使用零启动循环,因此应使用<而不是<=

  2. 您在数组中使用无效索引: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;
        }
    }
    

    奇怪的是,您没有获得访问冲突异常,因为您正在尝试访问阵列外的值。

  3. 您在第一次迭代时检查n == 1而不是n == 0

  4. 为了使计算与Matlab相等,您应该计算t = (n + 1) * dt;,因为在Matlab中你从1开始。

  5. 相反,循环for(j=0;j<=J-2;j++)应该是for(j=1; j < J-1; j++)

  6. 第一个循环中的f(x)毫无意义,就像gl(xl, t)&amp;主循环开始时gr(xr, t)

  7. 顺便问一下你是如何定义这些功能的?也可能存在问题。

    与此同时,您应该在继续测试应用程序之前解决这些问题。