Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 якобы Jacobi   Maksim Pozdeyev   02 Mar 2003 01:29:28 
 Re: якобы Jacobi   Maksim Pozdeyev   03 Mar 2003 22:49:28 
 Re: якобы Jacobi   Sergej Ivashchenko   04 Mar 2003 17:15:14 
 Re: якобы Jacobi   Sergiy Kanilo   03 Mar 2003 22:09:02 
 Re: якобы Jacobi   Maksim Pozdeyev   04 Mar 2003 07:52:40 
Архивное /ru.algorithms/28303e63ffe8.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional