Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
84
Добавлен:
17.04.2013
Размер:
458.75 Кб
Скачать

Реализация метода сеток на эвм в средеMatlab.

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

Применительно к нашей конечно-разностной схеме, метод верхней релаксации записывается в виде:

Данный метод реализован в программе tikhiy.m (см. Приложение 1).

Итерационный процесс сходится для всех, удовлетворяющих неравенству. Вопрос о выборе оптимального значенияиз данного промежутка, которое обеспечивало бы максимальную скорость сходимости метода верхней релаксации очень сложен в теоретическом отношении. Но применительно к конкретной задаче оптимальное значение параметра сходимости можно определить из машинного эксперимента. Автором была написана программаgeteps.m (см. Приложние 2) в средеMatlab для изучения скорости сходимости в зависимости от параметра сходимости. За основу алгоритма было взято решение данного уравнения на сетке фиксированного размера за фиксированное число шагов. Результатом выполнения данной программы была погрешность, достигнутая на последнем итерационном шаге. Используя эту функцию в программеscanmu.m (см. Приложение 3) была получена зависимость погрешности (которую можно связать с величиной, обратной скорости сходимости) от параметра сходимости. Графики этой функции на различных интервалах представлены на рисунках.

Таким образом было получено оптимальное значение параметра сходимости. Это значение и использовалось автором при конечных вычислениях в программеtikhiy.m. График найденой функции и её лини уровня представлены на рисунках.

Матрица решения заданного уравнения для M=N=10, приведена в Приложении 4.

Для доказательства сходимости полученной конечно-разностной схемы я проверил условия теоремы, приведенной в использованной мною литературе, для матрицы А данной задачи. Теорема утверждает, что если А – самосопряженный и положительно определённый оператор в пространстве сеточных функций и оператор(т.е. положительно определен в), тогда стационарный двухслойный итерационный процесс сходится в нормек точному решениюu системы. ГдеB=D+L, D - диагональ матрицы А,L - элементы матрицы А, расположенные ниже главной диагонали. Для метода Зайделя. Текст программы shod.m, реализующей эту проверку можно найти в Приложении 4. В случае невыполнении одного из условий теоремы, программа выдаёт соответствующее сообщение об ошибке, иначе сообщение о положительном результате проверки. В данном случае проверка матрицы А дала положительный результат.

Приложение 1.Текст основной программы tikhiy.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));

% Аппроксимация граничных условий по 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('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);

Соседние файлы в папке mpm_2b