|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Maksim Pozdeyev 2:5090/67.6 04 Mar 2003 07:52:40 To : Sergiy Kanilo Subject : Re: якобы Jacobi -------------------------------------------------------------------------------- 03 Мар 03 21:09, Sergiy Kanilo -> Maksim Pozdeyev: >> Hапишите программу для решения краевой задачи: >> d2F(x,y)/dx2+d2F(x,y)/dy2=0, 0<=x<=1, 0<=y<=1, >> F(0,y)=1, F(x,0)=2, F(1,y)=3, F(x,1)=4 SK> ты уверен, что граничный условия правильны? SK> Hапример согласно первому в точке F(0,0) должно быть 1, SK> а согласно второму - 2. Меня это тоже смущает, но так написано на бумажке с заданием. >> на равномерной сетке NxN с использованием итерационного метода. >> Якоби: >> FN(i,j)=0.25*(F(i-1,j)+F(i+1,j)+F(i,j-1)+F(i,j+1)) >> где i,j=2,3..N-1 FN(i,j) - новое значение F(i,j) на следующей >> итерации. Итерация заканчивается, когда max|FN(i,j)-F(i,j)| < e >> Иными словами - заменяйте в квадратной матрице F(N,N) все внутренние >> элементы >> на средние арифметические их 4х ближайших соседей до тех пор, пока >> изменения SK> я не смотрел как вычислялось, но идея состоит в том, SK> чтобы удовлетворить уравнению >> Собственно что мне надо, во первых желательно ссылочки на статьи о >> том, что >> есть краевая задача, и что есть итерационный метод. >> А во вторых помоч с решением. Я так понял, что массив нужно забить >> так: 1 2 2 2 2 1 3 4 4 4 1 3 5 6 6 1 3 5 7 8 1 3 5 7 9 1 3 5 7 9 SK> надо, чтобы выполнялись граничные условия, SK> (по границе матрицы должны стояить 1 - левая, 2 - верхняя, SK> 3 - правая, 4 - нижняя, поставь следнее в углах, или уточни SK> условия у преподавателя) Уточнить не представляется возможным из-за отсутвия такового, по крайней мере в пределах досягаемости. ;-) Тогда получается, что массив надо забить значениями от 0 до 1 случайными, по краям выставить условия и считать. Hо тогда условие, когда максимальная разница между предидущим и следующим значением < e заставит цикл работать один раз, т.к. e все таки 2.7, а я буду десятые складывать. Hо все равно попробую так. >> const int N = 10; >> const int R = (N-2)*(N-2); // количество расчитываемых элементов >> матрицы double m[N][N] = {{0},{0}}; double m2[N][N] = {{0},{0}}; >> double nm[R] = {0}; // массив для определения завершения итераций >> >> while(1) { >> for(int i=1; i<N-1; i++) >> for(int j=1; j<N-1; j++) >> m[i][j] = >> (m2[i-1][j]+m2[i+1][j]+m2[i][j-1]+m2[i][j+2])*.25; SK> тут описка j+2 Это не описка, а самая натуральная ошибка. SK> и в этом же цикле стоит смотреть изменение Точно, а то ниже идет тот же самый цикл, в котором делается проверка. Да, оптимизация у меня хромает. SK> double new_value =(m2[i-1][j]+m2[i+1][j]+m2[i][j-1]+m2[i][j+1])*.25; SK> double delta =std::abs(new_value-m[i][j]); SK> if(max_delta<delta) max_delta =delta; SK> m[i][j] =new_value; >> //условие выхода из цикла >> //находим последнее изменение для всех расчитываемых >> элементов >> int r=0; >> for(int i=1; i<N-1; i++) >> for(int j=1; j<N-1; j++) >> nm[r++] = m[i][j]-m2[i][j]; SK> m2 после этого дожен заполняться значениями из m, SK> следущая итерайия сравнивается с предыдущей, а не с SK> первым значением (или сразу подсчитывать изменение, SK> как указано выше) >> //находим максимальное изменение >> double res = 0; >> for(int i=0; i<R; i++) >> if(abs(nm[i]) > res) >> res = abs(nm[i]); >> >> if(res < 2.7) >> break; >> cpyMas(); // тут m копируется в m2 >> } >> >> Вот только что-то не то выходит. Я вообще понять не могу, какой >> требуется результат. SK> ну так ошибки :) Огромное спасибо за ответ. Вот сколько минусов нашлось, а все от того, что свежий ум. :-) -- Всего наилучшего. Maksim Pozdeyev aka Barlog M. --- GoldED+/W32 1.1.5-20010807 * Origin: От Парижа до Hаходки с водкой лучше чем без водки! (2:5090/67.6) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/28303e63ffe8.html, оценка из 5, голосов 10
|