|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Sergiy Kanilo 2:5020/400 03 Mar 2003 22:09:02 To : Maksim Pozdeyev Subject : Re: якобы Jacobi -------------------------------------------------------------------------------- "Maksim Pozdeyev" <Maksim.Pozdeyev@p6.f67.n5090.z2.fidonet.org> wrote in message news:1046539860@p6.f67.n5090.z2.ftn... > Мы к вам, профессор All, и вот по какому делу... > > Вот есть нобходимость в выполнении такого задания, попросили помочь. > > 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 ты уверен, что граничный условия правильны? Hапример согласно первому в точке F(0,0) должно быть 1, а согласно второму - 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х ближайших соседей до тех пор, пока изменения я не смотрел как вычислялось, но идея состоит в том, чтобы удовлетворить уравнению > Собственно что мне надо, во первых желательно ссылочки на статьи о том, что > есть краевая задача, и что есть итерационный метод. > А во вторых помоч с решением. Я так понял, что массив нужно забить так: > 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 надо, чтобы выполнялись граничные условия, (по границе матрицы должны стояить 1 - левая, 2 - верхняя, 3 - правая, 4 - нижняя, поставь следнее в углах, или уточни условия у преподавателя) > 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; тут описка j+2 и в этом же цикле стоит смотреть изменение double new_value =(m2[i-1][j]+m2[i+1][j]+m2[i][j-1]+m2[i][j+1])*.25; double delta =std::abs(new_value-m[i][j]); if(max_delta<delta) max_delta =delta; 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]; m2 после этого дожен заполняться значениями из m, следущая итерайия сравнивается с предыдущей, а не с первым значением (или сразу подсчитывать изменение, как указано выше) > //находим максимальное изменение > 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 > } > > Вот только что-то не то выходит. Я вообще понять не могу, какой требуется > результат. ну так ошибки :) Cheers, Serge --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/6577c7299247.html, оценка из 5, голосов 10
|