Re: якобы Jacobi
- From
- Maksim Pozdeyev (2:5090/67.6)
- To
- Sergiy Kanilo ()
- Date
- 2003-03-04T06:52:40Z
- Area
- RU.ALGORITHMS
Мы к вам, профессор Sergiy Kanilo, и вот по какому делу...
03 Мар 03 21:09, Sergiy Kanilo -> Maksim Pozdeyev:
>> Напишите программу для решения краевой задачи:
>> 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> Например согласно первому в точке 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 случайными, по краям выставить условия и считать. Но тогда условие, когда максимальная разница между предидущим и следующим значением < e заставит цикл работать один раз, т.к. e все таки 2.7, а я буду десятые складывать. Но все равно попробую так.
>> 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: От Парижа до Находки с водкой лучше чем без водки! (2:5090/67.6)