Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
111
Добавлен:
17.04.2013
Размер:
1.46 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);

Соседние файлы в папке mpm_1a
  • #
    17.04.20131.46 Mб111kursach.doc
  • #
    17.04.20131.31 Кб88pavel.m
  • #
    17.04.2013883 б83pav_eps.m
  • #
    17.04.20131.09 Кб83pav_p.m
  • #
    17.04.201377 б85readme