Я пытаюсь создать следующую 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) определены правильно, и проблем нет (например, целое число с десятичными знаками).
В результате получается слишком большой шаг для 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 <=
// ^^^
Других решений пока нет …