【问题标题】:Logic in C++ Inequality. If Else StatementC++ 不等式中的逻辑。 If Else 语句
【发布时间】:2017-05-10 13:32:59
【问题描述】:

我正在尝试在 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 x 2 的正方形,在 (0.5

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)都已正确定义并且没有问题(如带小数位的整数)。

【问题讨论】:

  • 为什么是 xy 数组 (?) 而不是原始规范中的数字? ij 是什么?
  • 你确定dx, dy, Nx, Ny的定义没有错误吗?甚至与阴谋?我在您的代码中没有看到任何错误...

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


【解决方案1】:

结果是由于对 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 <=
    //               ^^^

【讨论】:

    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多