C ++不等式中的逻辑。如果是其他声明

时间:2017-05-10 13:32:59

标签: c++ if-statement math logic inequality

我试图在C ++中生成以下2D步骤函数。

U是X和Y的函数.X从0变为2.Y从0变为2

  U(x,y) =2 for 0.5<= x <= 1 and 0.5<=y<=1
  U(x,y) = 1 for everywhere else 

基本上,它是2乘2平方,在该范围内具有较小的正方形(0.5 <= x <= 1; 0.5 <= y <= 1)。 这就是我所拥有的:( Nx,Ny分别是X,Y中的点数)。 (Y和X是空间坐标)

for (int j = 0; j<=ny; j++){
        y[j] = j*dy;
        for (int i = 0; i <=nx;i++){
            x[i] = i*dx;
            if(x[i]>=0.5 && x[i]<=1 && y[j]>=0.5 && y[j] <=1){
                u0[j][i] = 2.0;
            }
            else{
                u0[j][i] = 1.0;
            }
        }           
    }

显然,这是不正确的,因为这是我在绘图后得到的 2d step function

我希望我的If语句不正确。有人可以帮帮我吗?

非常感谢你。

更新:对此感到抱歉。 X和Y只是坐标的计数器。下面是代码(直到我需要询问的内容)所以希望所有变量都存在。我应该在一开始就做到这一点。遗憾

//Declaring variables

    int nx = 5; //x steps
    int ny = 5; // y steps
    int nt = 10; //time steps   
    int c = 1; //constant
    double dx = 2/double(nx-1);
    double dy = 2/double(ny-1);
    double sigma = 0.2;
    double dt = sigma*dx;
    double x[nx], y[ny]; //spatial vectors X and Y
    double u[ny][nx]; //solution matrix
    double u0[ny][nx]; //initial matrix

    //Setting up initial conditions

    for (int j = 0; j<=ny; j++){
        y[j] = j*dy;
        for (int i = 0; i <=nx;i++){
            x[i] = i*dx;
            if((x[i]>=0.5 && x[i]<=1) && (y[j]>=0.5 && y[j] <=1)){
                u0[j][i] = 2.0;
            }
            else{
                u0[j][i] = 1.0;
            }
        }           
    }

稍后会使用很多声明的变量,所以我不会在这里粘贴整个程序。感兴趣的变量是X,Y,Nx,Ny,Dx,Dy和U0。所有已定义的变量(Nx,Ny,Dx,Dy)都已正确定义,并且没有问题(例如带小数位的整数)。

1 个答案:

答案 0 :(得分:2)

结果是由于dx和dy采取了太大的步骤(每次0.5)。在您的绘图中,每个“像素”都根据其左下角和极端值进行评估。

考虑何时i = 2j = 2,您的if将成功x[i] = 1y[i] = 1。你应该做的是让你的间隔“开放”在他们的右侧:

 if((x[i]>=0.5 && x[i] < 1) && (y[j]>=0.5 && y[j] < 1)) {
 //                   ^^^                        ^^^

但是即便如此,对于浮点算术不精确,你可能会在非常特殊的情况下包围像素不是按预期绘制的情况。这就是为什么你应该使用较小的dxdy,或者相当大的nxny

您的代码中的另一个问题,不是这个异常的来源,但肯定需要纠正,您正在访问数组越界。为了避免这种情况:

for (int j = 0; j < ny; j++) {  // <-- not <=
// ...           ^^^
    for (int i = 0; i < nx; i++) {   // <-- not <=
    //               ^^^