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


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)
 
 

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

 Тема:    Автор:    Дата:  
 якобы 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/6577c7299247.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional