- •Московский Государственный Институт Электронной Техники
- •Курсовая работа
- •Классификация задачи и ее физическая интерпретация.
- •Применение метода сеток при решении уравнения Пуассона.
- •Разностная аппроксимация
- •Метод верхней релаксации.
- •Выводы.
- •Текст основной программы kurs.M.
- •Подпрограммаgetep.M определения погрешности при заданном параметре сходимости.
- •Программа scanmu.M построения зависимости достигнутой погрешности вычислений от параметра сходимости.
- •Подпрограммаshod.M доказывающая сходимость разностной схемы.
- •Литература.
Выводы.
Для доказательства
сходимости полученной конечно-разностной
схемы я проверил условия теоремы,
приведенной в использованной мною
литературе, для матрицы А данной задачи.
Теорема утверждает, что если А –
самосопряженный и положительно
определённый оператор в пространстве
сеточных функций и оператор
(т.е. положительно определен в
),
тогда стационарный двухслойный
итерационный процесс сходится в норме
к точному решениюu системы
.
ГдеB=D+L, D - диагональ
матрицы А,L - элементы
матрицы А, расположенные ниже главной
диагонали. Для метода Зайделя
.
Текст программы shod.m,
реализующей эту проверку можно
найти в Приложении 4. В случае невыполнения
одного из условий теоремы, программа
выдаёт соответствующее сообщение об
ошибке, иначе сообщение о положительном
результате проверки. В данном случае
проверка матрицы А дала положительный
результат.
Таблица
2. Результаты вычислений программы
kurs.m
при значениях
N=M=10,
.
|
i \ j |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
1 |
0 |
0.0012 |
0.0026 |
0.0111 |
0.0210 |
0.0339 |
0.0495 |
0.0683 |
0.0913 |
0.1198 |
0.1564 |
|
2 |
0 |
0.0023 |
0.0129 |
0.0291 |
0.0494 |
0.0749 |
0.1056 |
0.1425 |
0.1871 |
0.2415 |
0.3090 |
|
3 |
0 |
0.0095 |
0.0273 |
0.0521 |
0.0831 |
0.1208 |
0.1657 |
0.2192 |
0.2831 |
0.3601 |
0.4540 |
|
4 |
0 |
0.0177 |
0.0440 |
0.0784 |
0.1200 |
0.1694 |
0.2273 |
0.2953 |
0.3758 |
0.4719 |
0.5878 |
|
5 |
0 |
0.0272 |
0.0632 |
0.1075 |
0.1594 |
0.2195 |
0.2888 |
0.3691 |
0.4629 |
0.5740 |
0.7071 |
|
6 |
0 |
0.0377 |
0.0841 |
0.1386 |
0.2006 |
0.2705 |
0.3494 |
0.4392 |
0.5427 |
0.6642 |
0.8090 |
|
7 |
0 |
0.0494 |
0.1072 |
0.1723 |
0.2440 |
0.3226 |
0.4092 |
0.5056 |
0.6147 |
0.7410 |
0.8910 |
|
8 |
0 |
0.0629 |
0.1331 |
0.2092 |
0.2904 |
0.3768 |
0.4692 |
0.5692 |
0.6793 |
0.8042 |
0.9511 |
|
9 |
0 |
0.0790 |
0.1633 |
0.2511 |
0.3416 |
0.4350 |
0.5317 |
0.6325 |
0.7393 |
0.8553 |
0.9877 |
|
10 |
0 |
0.1000 |
0.2000 |
0.3000 |
0.4000 |
0.5000 |
0.6000 |
0.7000 |
0.8000 |
0.9000 |
1.0000 |
Текст основной программы kurs.M.
% Ввод числа разбиений по X и по Y.
M = input('Введите размерность сетки по X: ');
N = input(' Введите размерность сетки по Y: ');
h1 = 1/M;
h2 = 1/N;
q = h2/h1;
% Ввод погрешности вычислений.
ep = input(' Введите погрешность вычислений (ep): ');
% Начальное заполнение искомой матрицы.
u = ones(M+1, N+1);
x = zeros(M+1,1);
y = zeros(N+1,1);
% Аппроксимация правой части
f = -1.*ones(size(u));
% Аппроксимация граничных условий по 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 j = 1:(N+1),
u(1,j) = 0;
u(M+1,j) = (j-1)*h2;
y(j) = (j-1)*h2;
end
k = 0; % Инициализация числа выполненных шагов.
% Ввод параметра сходимости (рекомендуется mu = 1.5485).
mu = input('Введите параметр сходимости mu ( 1<mu<2 ): ');
% Ввод максимального числа шагов.
MAX = input('Введите максимальное число шагов MAX: ');
% Инициализация погрешности вычислений.
A = 100;
% Заблаговременное вычисление коэффициентов для ускорения
% рекуррентной процедуры.
a1 = 1/(2*(1+q^2));
a2 = q^2;
a3 = h2^2*a1;
% Условие продолжения цикла.
while (A > ep)
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 Слишком большое число шагов !!!', MAX)
break;
end
end
% Вывод результатов вычислений.
sprintf('Качество аппрокксимации %f', A)
if (k ~= MAX)
sprintf('Riched by %d steps', k)
end
mesh(x,y,u);
pause;
contour(x,y,u,50);
