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

Подпрограммаgetep.M определения погрешности при заданном параметре сходимости.

function [ep] = getep(mu)

M = 10; N = 10;

a = 1; b = 1;

h1 = a/M; h2 = b/N; q = h2/h1;

u = ones(M+1, N+1);

x = zeros(M+1,1);

y = zeros(N+1,1);

x = 0:h1:1;

y = 0:h2:1;

for i = 1:(M+1),

u(i,1) = 0;

u(i,N+1) = sin(pi*(i-1)*h1/2);

end

for j = 1:(N+1),

u(1,j) = 0;

u(M+1,j) = (j-1)*h2;

end

k = 0;

MAX = 15;

A = 100;

a1 = 1/(2*(1+q^2));

a2 = q^2;

a3 = h2^2*a1;

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)+a2*u(i+1,j))-a3;

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

end

ep = A;

Программа scanmu.M построения зависимости достигнутой погрешности вычислений от параметра сходимости.

left = input('Введите левую границу диапазона: ');

right = input('Введите левую границу диапазона: ');

epmu = input('Введите точность mu-параметра: ');

mu = left:epmu:right;

ep = zeros(size(mu));

N = (right-left)/epmu;

for i=1:(N+1),

ep(i) = getep(mu(i));

end

ep(N+1) = ep(N);

plot(mu, ep);

Подпрограммаshod.M доказывающая сходимость разностной схемы.

N=input('Введите размерность матрицы A: ');

q = 1;

a=4;

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

if(A==A') disp('OK:Matrix A is autocomplimentare'); end

for i=1:N^2,

B=A(1:i, 1:i);

if det(B)<=0

disp('ERROR: Matrix A is not positive definded!');

break;

end

end

B=A;

for i=1:N^2,

for j=i+1:N^2,

B(i,j) = 0;

end

end

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

Литература.

В. Г. Долголаптев, В. Н. Земсков. Численные методы решения разностных уравнений математической физики. Москва, МИЭТ, 1987г.

15

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