) В
де, n - номер ітерації.
Значення сіткової функції на кордонах області відомо з граничних умов. Схему (4) можна записати у вигляді, зручному для реалізації її за допомогою методу скалярної прогонки:
де
В
Значення прогоночние коефіцієнтів знаходяться по рекурентним формулами, які можна записати у вигляді:
,
,.
З граничних умов на лівій межі визначаються значення прогоночние коефіцієнтів. p> Після цього, враховуючи, що, зворотної прогоном знаходяться всі значення сіткової функції на n +1 - му ітераційному кроці:
В
Рахунок слід проводити прогоном по осі ОХ (індекс i), починаючи з індексу j = 1. У цьому випадку значення змінної відомо з граничної умови. Закінченням ітераційного процесу є виконання умови
В
В якості початкових значень для внутрішніх точок області можна взяти, наприклад, результати лінійної інтерполяції між кордонами і цими точками.
3. Реалізація поставленого завдання
3.1 Блок-схема алгоритму
В
3.2 Паралельна програма
# include
# include
# include
# include
# define N1 50
# define N2 50
# define eps 0.00001Y [N1 + 1] [N2 + 1], Ysh [N1 + 1] [N2 + 1];
double hx = 1. f/N1, hy = 2. f/N2;
/* Функия точного рішення */
double Fresh (double x, double y) {pow (x,
) * pow (y,
);
} RoFresh (double x, double y) {2 * (pow (x,
) + pow (y,
2));
}
/* Підпрограма ініціалізації матриці */Inic () {
int i, j; (i = 0; i
}
} main (int argc, char ** argv) {size, rank, flag = 1; i, j, f, it = 0; A = pow (hx,
), B = A, D = pow (hy,
), C = - 2. f/A - 2. f/D, F1, Fi, pogr = 0; t_c = 0.0, time = 0.0, s_t = 0.0;
double max, m; alfa [N-1], beta [N-1];
// double Y [N1 + 1] [N2 + 1], Ysh [N1 + 1] [N2 + 1];
// double hx = 1. f/N1, hy = 2. f/N2; _Status stat; _Init (& argc, & argv); _Comm_size (MPI_COMM_WORLD, & size); _Comm_rank (MPI_COMM_WORLD, & rank); - = MPI_Wtime (); _c - = MPI_Wtime (); ( rank == 0) {("% d n", size); ();
} _Barrier (MPI_COMM_WORLD); _Bcast (Y, (N...