C++ 不等式中的逻辑。 If Else 语句
Logic in C++ Inequality. If Else Statement
我正在尝试用 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<=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)都被正确定义并且没有问题(比如带小数位的整数)。
结果是由于dx和dy步长过大(各0.5)。在您的绘图中,每个 "pixel" 都根据其左侧和底部的极值进行评估。
考虑 i = 2
和 j = 2
,您的 if
将在 x[i] = 1
和 y[i] = 1
时成功。你应该做的是在他们的右边留下你的间隔 "open":
if((x[i]>=0.5 && x[i] < 1) && (y[j]>=0.5 && y[j] < 1)) {
// ^^^ ^^^
但即便如此,由于浮点运算不精确,您可能会遇到非常特殊的情况,即未按预期绘制像素。这就是为什么你应该使用更小的 dx
和 dy
,或者等效地更大的 nx
和 ny
.
您的代码中的另一个问题不是此异常的根源,但肯定需要更正,您正在越界访问数组。为避免这种情况:
for (int j = 0; j < ny; j++) { // <-- not <=
// ... ^^^
for (int i = 0; i < nx; i++) { // <-- not <=
// ^^^
我正在尝试用 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<=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)都被正确定义并且没有问题(比如带小数位的整数)。
结果是由于dx和dy步长过大(各0.5)。在您的绘图中,每个 "pixel" 都根据其左侧和底部的极值进行评估。
考虑 i = 2
和 j = 2
,您的 if
将在 x[i] = 1
和 y[i] = 1
时成功。你应该做的是在他们的右边留下你的间隔 "open":
if((x[i]>=0.5 && x[i] < 1) && (y[j]>=0.5 && y[j] < 1)) {
// ^^^ ^^^
但即便如此,由于浮点运算不精确,您可能会遇到非常特殊的情况,即未按预期绘制像素。这就是为什么你应该使用更小的 dx
和 dy
,或者等效地更大的 nx
和 ny
.
您的代码中的另一个问题不是此异常的根源,但肯定需要更正,您正在越界访问数组。为避免这种情况:
for (int j = 0; j < ny; j++) { // <-- not <=
// ... ^^^
for (int i = 0; i < nx; i++) { // <-- not <=
// ^^^