Top.Mail.Ru
Ответы

Выбор оптимального шага сетки для метода сеток (конечных разностей)

Нужна помощь, я студент делаю диплом по реализации метода сеток для расчета потенциального поля. У меня в программе для реализации используется итерационный метод релаксации. У меня не получается определить оптимальный шаг сетки я уменьшаю шаг а он все равно не перестает сходится. При уменьшении шага получаются разные значения. Что можно сделать и как решить? Буду признателен за помощь. фрагмент кода прилагаю ниже:

int iterCount=0;

double tolerance = 1e-8;

double omega=1.3;

double max_diff;

do {

max_diff = 0.0;

for (int i = 1; i < Ny-1; ++i) {

for (int j = 1; j < Nx - 1; ++j) {

// Пропускаем фиксированные узлы

if (true_nodes[i][j]) continue;

double old_value = phi[i][j];

double newval=0;

bool is_boundary = false;

double eps_left, eps_right;

for (int k = 0; k < vectorbound.size(); ++k) {

if (i == vectorbound[k]) {

is_boundary = true;

// Определяем eps слева и справа от границы

eps_left = (k == 0) ? eps[0] : eps[k];

eps_right = (k == vectorbound.size() - 1) ? eps.back() : eps[k + 1];

break;

}

}

if (is_boundary) {

// Модифицированная формула для границы

newval = ((eps_right phi[i + 1][j]) + (eps_left phi[i - 1][j])) / (eps_left + eps_right);

}

else {

// Ниже границы (вторая среда)

newval = 0.25 * (phi[i + 1][j] + phi[i - 1][j] + phi[i][j + 1] + phi[i][j - 1]);

}

phi[i][j] = (1 - omega) old_value + omega newval;

// Вычисляем разницу для проверки сходимости

double diff = std::abs(phi[i][j]-old_value);

iterCount++;

if (diff > max_diff) {

max_diff = diff;

}

}

}

} while ((max_diff > tolerance)); // Проверка сходимости