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

Реализация метода сеток в среде 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!');

Соседние файлы в папке mpm_23a
  • #
    17.04.2013261.63 Кб9823.doc
  • #
    17.04.20132.53 Кб92kw1.m
  • #
    17.04.20131.28 Кб91kw2.m
  • #
    17.04.20131.1 Кб91kw3.m