Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ (МП-3) / Курсовые / mpm_25a / Курсач.doc
Скачиваний:
96
Добавлен:
17.04.2013
Размер:
352.77 Кб
Скачать

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

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

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

Данный метод реализован в программе написанной в среде MATLAB

Ниже приведен ее текст :

% Ввод числа разбиений по X и по Y.

M = input('Input the grid size on X: ');

N = input('Input the grid size on Y: ');

h1 = 2/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)=-1*(2*i/M)*(j/N);

end

end

% Аппроксимация граничных условий по X и заполнение служебного

% массива x(i).

for i = 1:(M+1),

u(i,1) = sqrt(2*(i-1)/M);

u(i,N+1) = 5-(2*(i-1)/M)*(2*(i-1)/M);

x(i) = (i-1)*h1;

end

% Аппроксимация граничных условий по Y и заполнение служебного

% массива y(i).

for j = 1:(N+1),

u(N+1,j) = sqrt(2/(1+(j-1)*h2));

u(1,j) = 5*(j-1)*h2;

y(j) = (j-1)*h2;

end

k=0; % Инициализация числа выполненных шагов.

% Ввод параметра сходимости

mu = 1.5374;

% Ввод максимального числа шагов.

MAX = input('Input the maximum number of steps MAX: ');

% Инициализация погрешности вычислений.

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);

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

.

Далее текст программы для вычисления оптимального коэффициента:

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) = sqrt(2*(i-1)/M);

u(i,N+1) = 5-(2*(i-1)/M)*(2*(i-1)/M);

x(i) = (i-1)*h1;

end;

for j = 1:(N+1)

u(N+1,j) = sqrt(2/(1+(j-1)*h2));

u(1,j) = 5*(j-1)*h2;

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)=-1*(2*i/M)*(j/N);

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.5374:0.000001:1.5376;

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)=-1*(2*i/M)*(j/N);

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,'.');

В результате работы программы было выявлено оптимальное значение .Это значение мю использовалось при построении искомой поверхности,апроксимированой

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

M=input('Input M: ');

N=input('Input N: ');

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!');

Было получено несколько результирующих матриц u1, u2, u3, u4, которые здесь не были зафиксированы.Данные матрицы вычислялись для разных значений параметра eps.

u1 при eps = 0.001;

u2 при eps = 0.0001;

u3 при eps = 0.00001;

u4 при eps = 0.000001;

Далее были вычесленны нормы попарных разностей этих матриц. Полученные результаты представлены ниже.

NORM(u1-u2) = 0.0035

NORM(u2-u3)

NORM(u3-u4)

Результат вычислений при N=M=10

i \ j

0

1

2

3

4

5

6

7

8

9

10

0

0

0.5000

1.0000

1.5000

2.0000

2.5000

3.0000

3.5000

4.0000

4.5000

5.0000

1

0.4472

0.8436

1.2617

1.6947

2.1386

2.5909

3.0505

3.5168

3.9899

4.4705

4.9600

2

0.6325

1.0159

1.4068

1.8059

2.2133

2.6288

3.0527

3.4852

3.9268

4.3781

4.8400

3

0.7746

1.1303

1.4904

1.8560

2.2280

2.6074

2.9947

3.3908

3.7965

4.2126

4.6400

4

0.8944

1.2129

1.5346

1.8609

2.1927

2.5313

2.8776

3.2326

3.5973

3.9728

4.3600

5

1.0000

1.2730

1.5489

1.8288

2.1139

2.4055

2.7046

3.0125

3.3303

3.6591

4.0000

6

1.0954

1.3154

1.5379

1.7643

1.9957

2.2334

2.4786

2.7327

2.9967

3.2721

3.5600

7

1.1832

1.3428

1.5048

1.6704

1.8410

2.0178

2.2020

2.3949

2.5980

2.8125

3.0400

8

1.2649

1.3572

1.4518

1.5500

1.6529

1.7618

1.8777

2.0020

2.1361

2.2815

2.4400

9

1.3416

1.3599

1.3810

1.4059

1.4356

1.4706

1.5117

1.5598

1.6160

1.6820

1.7600

10

1.4142

1.3484

1.2910

1.2403

1.1952

1.1547

1.1180

1.0847

1.0541

1.0260

1.0000

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