Реализация метода сеток на эвм в среде Matlab.
Будем
решать данную систему методом верхней
релаксации, который является обобщением
метода Зайделя. (Метод верхней релаксации
вырождается в метод Зайделя при параметре
сходимости
.)
Применительно к нашей конечно-разностной схеме, метод верхней релаксации записывается в виде:

Данный метод реализован в программе написанной в среде MATLAB
Ниже приведен ее текст :
% Ввод числа разбиений по X и по Y.
M = input('Input the grid size on X: ');
N = input('Input the grid size on Y: ');
h1 = 2/M;
h2 = 1/N;
q = h2/h1;
% Ввод погрешности вычислений.
eps = input('Input the quality (eps): ');
% Начальное заполнение искомой матрицы
u = ones(M+1, N+1);
x = zeros(M+1,1);
y = zeros(N+1,1);
% Аппроксимация правой части
f = -1.*ones(size(u));
for i=1:M,
for j=1:N,
f(i,j)=-1*(2*i/M)*(j/N);
end
end
% Аппроксимация граничных условий по X и заполнение служебного
% массива x(i).
for i = 1:(M+1),
u(i,1) = sqrt(2*(i-1)/M);
u(i,N+1) = 5-(2*(i-1)/M)*(2*(i-1)/M);
x(i) = (i-1)*h1;
end
% Аппроксимация граничных условий по Y и заполнение служебного
% массива y(i).
for j = 1:(N+1),
u(N+1,j) = sqrt(2/(1+(j-1)*h2));
u(1,j) = 5*(j-1)*h2;
y(j) = (j-1)*h2;
end
k=0; % Инициализация числа выполненных шагов.
% Ввод параметра сходимости
mu = 1.5374;
% Ввод максимального числа шагов.
MAX = input('Input the maximum number of steps MAX: ');
% Инициализация погрешности вычислений.
A = 100;
% Заблаговременное вычисление коэффициентов для ускорения
% рекуррентной процедуры.
t = (h1*h1)/(h2*h2);
a1 = t/(2*t+1);
a2 = 1/(4*t + 2);
a3 = (h1*h1)/(8*t + 4);
while (A > eps) % Условие продолжения цикла.
k = k + 1; % Инкремент числа шагов.
A = 0; % Инициализация погрешности.
for i=2:M,
for j=2:N,
% Собственно сами рекуррентные формулы
X = a1*(u(i,j+1)+u(i,j-1))+a2*(u(i+1,j)+u(i-1,j)) + a3*f(i,j);
X = mu*X + (1-mu)*u(i,j);
% Вычисление погрешности очередного шага
R = abs(X - u(i,j));
% и выбор наибольшей
if (R > A) A = R; end
u(i,j) = X;
end
end
% Принудительный выход из цикла по ограничению на число шагов
% с выводом соответствующей диагностики.
if k == MAX
sprintf('%d Steps was made !!!', MAX)
break;
end
end
% Вывод результатов вычислений.
sprintf('Quality of approximation is %f', A)
if (k ~= MAX)
sprintf('Riched by %d steps', k)
end
mesh(x,y,u);
pause;
contour(x,y,u,50);
Итерационный
процесс сходится для всех
,
удовлетворяющих неравенству
.
Вопрос о выборе оптимального значения
из данного промежутка которое обеспечивало
бы максимальную скорость сходимости
метода верхней релаксации очень сложен
в теоретическом отношении. Но применительно
к конкретной задаче оптимальноезначение параметра
сходимости можно определить из машинного
эксперимента. Программа ,написаная в
среде Matlab
для изучения скорости сходимости в
зависимости от параметра сходимости.
За основу алгоритма было взято решение
данного уравнения на сетке фиксированного
размера за фиксированное число шагов.
Была получена зависимость погрешности
(которую можно связать с величиной,
обратной скорости сходимости) от
параметра сходимости
.
Графики этой функции на интервале
представлен на рисунке.
.
Далее текст программы для вычисления оптимального коэффициента:
M=10;
N=10;
a=2; b=1;
h1=a/M; h2=b/N;
q=h2/h1;
u=ones(M+1,N+1);
x=ones(M+1,1);
y=ones(N+1,1);
f=ones(size(u));
for i = 1:(M+1)
u(i,1) = sqrt(2*(i-1)/M);
u(i,N+1) = 5-(2*(i-1)/M)*(2*(i-1)/M);
x(i) = (i-1)*h1;
end;
for j = 1:(N+1)
u(N+1,j) = sqrt(2/(1+(j-1)*h2));
u(1,j) = 5*(j-1)*h2;
y(j) = (j-1)*h2;
end;
for i=2:M
for j=2:N
u(i,j)=1;
end;
end;
for i=1:M+1
for j=1:N+1
f(i,j)=-1*(2*i/M)*(j/N);
end;
end;
MAX=10;
A=100;
t = (h1*h1)/(h2*h2);
a1 = t/(2*t+1);
a2 = 1/(4*t + 2);
a3 = (h1*h1)/(8*t + 4);
mu=1.5374:0.000001:1.5376;
for c=1:length(mu)
for i=2:M
for j=2:N
u(i,j)=1;
end;
end;
for i=1:M+1
for j=1:N+1
f(i,j)=-1*(2*i/M)*(j/N);
end;
end;
for k=1:MAX
A=0;
for i=2:M
for j=2:N
X = a1*(u(i,j+1)+u(i,j-1))+a2*(u(i+1,j)+u(i-1,j)) + a3*f(i,j);
X = mu(c)*X + (1-mu(c))*u(i,j);
R = abs(X - u(i,j));
if (R > A) A = R; end
u(i,j) = X;
end
end
end
eps(c)=A;
end;
plot(mu,eps,'.');
В результате работы
программы было выявлено оптимальное
значение
.Это
значение мю использовалось при построении
искомой поверхности,апроксимированой


Для
доказательства сходимости полученной
конечно-разностной схемы были проверены
условия теоремы, приведенной в
использованной литературе, для матрицы
А данной задачи. Теорема утверждает,
что если А – самосопряженный и положительно
определённый оператор в пространстве
сеточных функций и оператор
(т.е. положительно определен в
),
тогда стационарный двухслойный
итерационный процесс
сходится в норме
к точномурешению
u
системы
.
ГдеB=D+L,
D
- диагональ матрицы А, L
- элементы матрицы А, расположенные ниже
главной диагонали. Для метода Зайделя
.
Текст программы , реализующей эту роверку
приведен ниже. В случае невыполнении
одного из условий теоремы, программа
выдаёт соответствующее сообщение об
ошибке, иначе - сообщение о положительном
результате проверки.
M=input('Input M: ');
N=input('Input N: ');
q=(M/N)^2;
a=2*(1+q);
%Создание матрицы А
A=zeros(N*N,N*N);
for i=1:N,
A(N*(i-1) + 1,N*(i-1) + 1)=a;
A(N*(i-1) + 1,N*(i-1) + 2)=-q;
if (i~=N) A(N*(i-1) + 1,N*i + 1)=-1; end
if (i~=1) A(N*(i-1) + 1,N*(i-1) + 1 - N)=-1; end
for j=2:N-1,
A(N*(i-1) + j,N*(i-1) + j)=a;
A(N*(i-1) + j,N*(i-1) + j-1)=-q;
A(N*(i-1) + j,N*(i-1) + j+1)=-q;
if (i~=N) A(N*(i-1) + j,N*i + j)=-1; end
if (i~=1) A(N*(i-1) + j,N*(i-1) + j - N)=-1; end
end
A(N*i,N*i)=a;
if (i~=1) A(N*i,N*i-N)=-1; end
if (i~=N) A(N*i,N*i+N)=-1; end
A(N*i,N*i-1)=-q;
end
%Создание матрицы B
B=A;
for i=1:N^2,
for j=i+1:N^2,
B(i,j) = 0;
end
end
%Приоверка положительной определённости оператора B-tA/2
C=B-0.5*A;
for i=1:N^2,
B=C(1:i, 1:i);
if det(B)<=0
disp('ERROR: Matrix B-1/2*A is not positive definded!');
break;
end
end
disp('If no ERROR occurs then system is good!');
Было получено несколько результирующих матриц u1, u2, u3, u4, которые здесь не были зафиксированы.Данные матрицы вычислялись для разных значений параметра eps.
u1 при eps = 0.001;
u2 при eps = 0.0001;
u3 при eps = 0.00001;
u4 при eps = 0.000001;
Далее были вычесленны нормы попарных разностей этих матриц. Полученные результаты представлены ниже.
NORM(u1-u2) = 0.0035
NORM(u2-u3)![]()
NORM(u3-u4)![]()
Результат вычислений при N=M=10
![]()
|
i \ j |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
0 |
0 |
0.5000 |
1.0000 |
1.5000 |
2.0000 |
2.5000 |
3.0000 |
3.5000 |
4.0000 |
4.5000 |
5.0000 |
|
1 |
0.4472 |
0.8436 |
1.2617 |
1.6947 |
2.1386 |
2.5909 |
3.0505 |
3.5168 |
3.9899 |
4.4705 |
4.9600 |
|
2 |
0.6325 |
1.0159 |
1.4068 |
1.8059 |
2.2133 |
2.6288 |
3.0527 |
3.4852 |
3.9268 |
4.3781 |
4.8400 |
|
3 |
0.7746 |
1.1303 |
1.4904 |
1.8560 |
2.2280 |
2.6074 |
2.9947 |
3.3908 |
3.7965 |
4.2126 |
4.6400 |
|
4 |
0.8944 |
1.2129 |
1.5346 |
1.8609 |
2.1927 |
2.5313 |
2.8776 |
3.2326 |
3.5973 |
3.9728 |
4.3600 |
|
5 |
1.0000 |
1.2730 |
1.5489 |
1.8288 |
2.1139 |
2.4055 |
2.7046 |
3.0125 |
3.3303 |
3.6591 |
4.0000 |
|
6 |
1.0954 |
1.3154 |
1.5379 |
1.7643 |
1.9957 |
2.2334 |
2.4786 |
2.7327 |
2.9967 |
3.2721 |
3.5600 |
|
7 |
1.1832 |
1.3428 |
1.5048 |
1.6704 |
1.8410 |
2.0178 |
2.2020 |
2.3949 |
2.5980 |
2.8125 |
3.0400 |
|
8 |
1.2649 |
1.3572 |
1.4518 |
1.5500 |
1.6529 |
1.7618 |
1.8777 |
2.0020 |
2.1361 |
2.2815 |
2.4400 |
|
9 |
1.3416 |
1.3599 |
1.3810 |
1.4059 |
1.4356 |
1.4706 |
1.5117 |
1.5598 |
1.6160 |
1.6820 |
1.7600 |
|
10 |
1.4142 |
1.3484 |
1.2910 |
1.2403 |
1.1952 |
1.1547 |
1.1180 |
1.0847 |
1.0541 |
1.0260 |
1.0000 |
