Re: якобы Jacobi

From
Sergiy Kanilo ()
To
Maksim Pozdeyev ()
Date
2003-03-03T21:09:02Z
Area
RU.ALGORITHMS
From: "Sergiy Kanilo" <skanilo@artannlabs.com>

"Maksim Pozdeyev" <Maksim.Pozdeyev@p6.f67.n5090.z2.fidonet.org> wrote in
message news:1046539860@p6.f67.n5090.z2.ftn...
> Мы к вам, профессор All, и вот по какому делу...
>
> Вот есть нобходимость в выполнении такого задания, попросили помочь.
>
> Напишите программу для решения краевой задачи:
> 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

ты уверен, что граничный условия правильны?
Например согласно первому в точке 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)