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

Причем
![]()
Данный метод реализован в программе kw1.m (см. Приложение 1).
Итерационный процесс
сходится для всех
,
удовлетворяющих неравенству
.
Вопрос о выборе оптимального значения
из данного промежутка, которое обеспечивало
бы максимальную скорость сходимости
метода верхней релаксации, очень сложен
в теоретическом отношении. Но применительно
к конкретной задаче оптимальное значение
параметра сходимости можно определить
из машинного эксперимента. В приложении
2, приведен пример программы kw2.m
в котором показывается зависимость
скорости сходимости от параметра
сходимости. За основу алгоритма было
взято решение данного уравнения на
сетке фиксированного размера за
фиксированное число шагов, была получена
зависимость погрешности (которую можно
связать с величиной, обратной скорости
сходимости) от параметра сходимости
.
Графики этой функции на различных
интервалах представлены на рисунках.

Эти
рисунки наглядно показывают, что
оптимальным значением, для параметра
лежит
в
промежутке от 1.448 до 1.45, дальнейшие более
точные исследования дали результат
приближенно равный 1.4491, который мы и
будем использовать в дальнейшем в
программе kw1.m
для построения искомой апроксимированой
поверхности.



Причем, заданной точности (eps = 0.001) мы достигаем за 26 шагов, и ошибка аппроксимация при заданных условиях равна 0.000078.
После многократных экспериментов, мною были получены несколько матриц коэффициентов u1, u2, u3, соответствующие разным значениям точности:
eps = 0.0001
eps = 0.00001
eps = 0.000001
Далее были вычислены нормы попарных разностей этих матриц. Полученные результаты представлены ниже.
Норма (u1 - u2) = 5.4420e-004
Норма (u2 - u3) = 6.1237e-005
Норма (u1 - u3) = 6.0440e-004
Здесь я вычислял спектральную норму, (есть максимум квадратного корня из чисел сингулярности разности матриц).
Результат
вычислений программы kw1.m
при значениях N=M=10,
окончательная погрешность итераций
0.000001,
=
1.4491:
|
1 |
1.5 |
2 |
2.5 |
3 |
3.5 |
4 |
4.5 |
5 |
5.5 |
6 |
|
1.4 |
1.8203 |
2.2406 |
2.6624 |
3.0872 |
3.5168 |
3.9534 |
4.3997 |
4.8593 |
5.3371 |
5.84 |
|
1.8 |
2.127 |
2.4536 |
2.7817 |
3.1138 |
3.4523 |
3.8001 |
4.1606 |
4.5377 |
4.9358 |
5.36 |
|
2.2 |
2.4134 |
2.6247 |
2.8363 |
3.0505 |
3.2698 |
3.4973 |
3.7362 |
3.9902 |
4.2634 |
4.56 |
|
2.6 |
2.677 |
2.7496 |
2.8193 |
2.8881 |
2.9583 |
3.0326 |
3.114 |
3.2063 |
3.3135 |
3.44 |
|
3 |
2.9205 |
2.8329 |
2.7374 |
2.6348 |
2.5264 |
2.4143 |
2.3012 |
2.1911 |
2.0888 |
2 |
|
3.4 |
3.1529 |
2.8923 |
2.616 |
2.3222 |
2.0097 |
1.6785 |
1.3304 |
0.96963 |
0.60301 |
0.24 |
|
3.8 |
3.3922 |
2.965 |
2.5118 |
2.025 |
1.4969 |
0.92085 |
0.29318 |
-0.3844 |
-1.1021 |
-1.84 |
|
4.2 |
3.6596 |
3.1045 |
2.5223 |
1.8922 |
1.1887 |
0.38404 |
-0.54967 |
-1.6347 |
-2.8767 |
-4.24 |
|
4.6 |
3.886 |
3.2884 |
2.7288 |
2.1444 |
1.4745 |
0.64893 |
-0.42643 |
-1.8894 |
-3.9535 |
-6.96 |
|
3 |
2.99 |
2.96 |
2.91 |
2.84 |
2.75 |
2.64 |
2.51 |
2.36 |
2.19 |
2 |
Для
доказательства сходимости полученной
конечно-разностной схемы были проверены
условия теоремы, приведенной в
использованной литературе, для матрицы
А данной задачи. Теорема утверждает,
что если А – самосопряженный и
положительно определённый оператор в
пространстве
сеточных функций и оператор
(т.е. положительно определен в
),
тогда стационарный двухслойный
итерационный процесс
сходится в норме
к точному решению u
системы
.
Где B=D+L,
D - диагональ
матрицы А, L -
элементы матрицы А, расположенные ниже
главной диагонали. Для метода Зайделя
.
Текст программы kw3.m,
реализующей эту проверку приведен в
приложении 3. В случае невыполнении
одного из условий теоремы, программа
выдаёт соответствующее сообщение об
ошибке, иначе - сообщение о положительном
результате проверки.
Приложение 1
% kw1.m
% Ввод числа разбиений по X и по Y.
%M = input('Input the grid size on X: ');
%N = input('Input the grid size on Y: ');
M = 10;
N = 10;
h1 = 2/M;
h2 = 1/N;
q = h2/h1;
% Ввод погрешности вычислений.
%eps = input('Input the quality (eps): ');
for kk = 1:3
if (kk == 1) eps = .0001; end
if (kk == 2) eps = .00001; end
if (kk == 3) eps = .000001; end
% Начальное заполнение искомой матрицы
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)= 8*(i^2)/(M^2) + (8*i*j)/(N*M);
end
end
% Аппроксимация граничных условий по X и заполнение служебного
% массива x(i).
for i = 1:(M+1)
u(i,1) = 1 + 4*(i-1)/M;
u(i,N+1) = 6-4*(2*(i-1)/M)^2;
x(i) = (i-1)*h1;
end;
% Аппроксимация граничных условий по Y и заполнение служебного
% массива y(i).
for j = 1:(N+1)
u(1,j) = 1 + 5*(j-1)*h2;
u(N+1,j) = 3 - ( (j-1)*h2)^2;
y(j) = (j-1)*h2;
end;
k=0; % Инициализация числа выполненных шагов.
% Ввод параметра сходимости
mu = 1.4491;
% Ввод максимального числа шагов.
%MAX = input('Input the maximum number of steps MAX: ');
MAX = 1000;
% Инициализация погрешности вычислений.
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);
pause;
if (kk == 1) u1 = u; end
if (kk == 2) u2 = u; end
if (kk == 3) u3 = u; end
end
norm (u1 - u2,2)
norm (u2 - u3,2)
norm (u1 - u3,2)
Приложение 2
% kw2.m
clear;
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) = 1 + 4*(i-1)/M;
u(i,N+1) = 6-4*(2*(i-1)/M)^2;
x(i) = (i-1)*h1;
end;
% Pologaem N = 1/h2
for j = 1:(N+1)
u(1,j) = 1 + 5*(j-1)*h2;
u(N+1,j) = 3 - ( (j-1)*h2)^2;
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)= 8*(i^2)/(M^2) + (8*i*j)/(N*M);
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.448:0.000001:1.45;
mu=1.0:0.001:2;
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)= 8*(i^2)/(M^2) + (8*i*j)/(N*M);
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,'.');
Приложение 3
% kw3.m
clear;
%M=input('Input M: ');
M = 10;
%N=input('Input N: ');
N = 10;
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!');
