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


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Maksim Pozdeyev                      2:5090/67.6    02 Mar 2003  01:29:28
 To : All
 Subject : якобы Jacobi
 -------------------------------------------------------------------------------- 
 
 Вот есть нобходимость в выполнении такого задания, попросили помочь.
 
 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
 на равномерной сетке 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
 
 Или нет и можно внутренние элементы за границами двух левых столбцов и двух
 верхних строк заполнить случайными числами?
 
 Далее вот что я делал на C++: два массива, забиваю их числами, как показано, а
 потом такой цикл:
 
 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;
         //условие выхода из цикла
         //находим последнее изменение для всех расчитываемых элементов
         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];
 
         //находим максимальное изменение
         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
     }
 
  Вот только что-то не то выходит. Я вообще понять не могу, какой требуется
 результат.
 
 --
 Всего наилучшего.
 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/28303e60ee54.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional