Логика в С ++ Неравенство. Если еще заявление

Я пытаюсь создать следующую 2D шаговую функцию в C ++.

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<= х<= 1; 0,5<= у<= 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;
}
}
}

Понятно, что это не правильно, потому что это то, что я получил после прорисовки
2-х шаговая функция

Я ожидаю, что мое заявление 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

Решение

В результате получается слишком большой шаг для dx и dy (по 0,5 каждый). В вашем графике каждый «пиксель» оценивается в соответствии с его левыми и нижними крайностями.

Рассмотреть, когда i = 2 а также j = 2, ваш if удастся с x[i] = 1 а также y[i] = 1, Что вы должны сделать, это оставить интервалы «открытыми» на их правой стороне:

 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 <=
//               ^^^
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]