- •Московский институт электронной техники (Технический университет)
- •Курсовая работа
- •Постановка задачи и её физическая интерпретация.
- •Применение метода сеток при решении уравнения Пуассона.
- •Реализация метода сеток на эвм в среде Matlab.
- •Приложение. Текст основной программы pavel.M.
- •Подпрограммаpav_eps.M определения погрешности при заданном параметре сходимости.
- •Подпрограммаpav_p.M доказывающая сходимость разностной схемы.
- •Литература.
Реализация метода сеток на эвм в среде Matlab.
Будем решать данную систему методом верхней релаксации, который является обобщением метода Зайделя. (Метод верхней релаксации вырождается в метод Зайделя при параметре сходимости.)
Применительно к нашей конечно-разностной схеме, метод верхней релаксации записывается в виде:
Данный метод реализован в программе pavel.m (см. Приложение).
Итерационный процесс сходится для всех , удовлетворяющих неравенству. Вопрос о выборе оптимального значенияиз данного промежутка, которое обеспечивало бы максимальную скорость сходимости метода верхней релаксации очень сложен в теоретическом отношении. Но применительно к конкретной задаче оптимальное значение параметра сходимости можно определить из машинного эксперимента. Автором была написана программаpav_eps.m (см. Приложние) в средеMatlab для изучения скорости сходимости в зависимости от параметра сходимости. За основу алгоритма было взято решение данного уравнения на сетке фиксированного размера за фиксированное число шагов была получена зависимость погрешности (которую можно связать с величиной, обратной скорости сходимости) от параметра сходимости. Графики этой функции на различных интервалах представлены на рисунках.
Таким образом было получено оптимальное значение параметра сходимости. Это значение и использовалось автором при конечных вычислениях в программеpavel.m. График найденой функции и её лини уровня представлены на рисунках.
Матрица решения заданного уравнения для M=N=10, приведена в Приложении.
Для доказательства сходимости полученной конечно-разностной схемы я проверил условия теоремы, приведенной в использованной мною литературе, для матрицы А данной задачи. Теорема утверждает, что если А – самосопряженный и положительно определённый оператор в пространстве сеточных функций и оператор(т.е. положительно определен в), тогда стационарный двухслойный итерационный процесс сходится в нормек точному решениюu системы. ГдеB=D+L, D - диагональ матрицы А,L - элементы матрицы А, расположенные ниже главной диагонали. Для метода Зайделя. Текст программы pav_p.m, реализующей эту проверку можно найти в Приложении. В случае невыполнении одного из условий теоремы, программа выдаёт соответствующее сообщение об ошибке, иначе сообщение о положительном результате проверки. В данном случае проверка матрицы А дала положительный результат.
Также было получено несколько результирующихматриц u1, u2, u3, u4, которые здесь не были зафиксированы.
u1 приeps = 0.001;
u2 при eps = 0.0001;
u3 при eps = 0.00001;
u4 при eps = 0.000001;
Получили следующие нормы разности матриц:
NORM(u1-u2) = 0.0017
NORM(u2-u3) = 0.00012589
NORM(u3-u4) = 0.000016398
Приложение. Текст основной программы pavel.M.
% Ввод числа разбиений по X и по Y.
M = input('Input the grid size on X: ');
N = input('Input the grid size on Y: ');
h1 = 1/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)=30*(i/M*i/M+j/N*j/N-i/M-j/N);
end
end
% Аппроксимация граничных условий по X и заполнение служебного
% массива x(i).
for i = 1:(M+1),
u(i,1) = 0;
u(i,N+1) = sin(pi*(i-1)*h1/2);
x(i) = (i-1)*h1;
end
% Аппроксимация граничных условий по Y и заполнение служебного
% массива y(i).
for i = 1:(M+1),
u(i,1) = 0;
u(i,M+1) = 0;
x(i) = (i-1)*h1;
end
for j = 1:(N+1),
u(N+1,j) = 15*exp(pi)*sin(pi*(j-1)*h2);
u(1,j) = 15*sin(pi*(j-1)*h2);
y(j) = (j-1)*h2;
end
k = 0; % Инициализация числа выполненных шагов.
% Ввод параметра сходимости (рекомендуется mu = 1.536).
mu = input('Input the parameter mu ( 1<mu<2 ): ');
% Ввод максимального числа шагов.
MAX = input('Input the maximum number of steps MAX: ');
% Инициализация погрешности вычислений.
A = 100;
% Заблаговременное вычисление коэффициентов для ускорения
% рекуррентной процедуры.
a1 = 1/(2*(1+q^2));
a2 = q^2;
a3 = h2^2*a1;
% Условие продолжения цикла.
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) + a2*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);