Сравнение явной и неявной схем
Для сравнения решения явной и неявной схем используем следующий метод.
Берем матрицу решения явной схемы и матрицу такой же размерности решения неявной схемы и поэлементно сравниваем. Находим максимальное расхождение. Затем, увеличивая размерность матриц, снова сравниваем их и так далее. Расхождение должно убывать, так как при увеличении разбиения решения явной и неявной разностных схем стремятся к решению исходной краевой задачи.
Рассмотрим матрицы следующих размерностей: 40х25, 80х50, 160х100, 320х200.
Таблица норм сравнения явной и неявной схем.
|
NORMA(U1я-U1н) |
NORMA(U2я-U2н) |
NORMA(U3я-U3н) |
NORMA(U4я-U4н) |
|
0.1595 |
0.1301 |
0.1184 |
0.1133 |
Приложение
Текст функции, вычисляющий матрицу решения размерностью MxN, для явной схемы:
% YAV
% Решение краевой задачи с применением ЯВНОЙ разностной схемы.
N=input('Введите количество разбиений по оси времени (N):');
M=input('Введите количество разбиений по оси стержня (M):');
h=1/M;
t=1/N;
if t>h
clc
disp(' ВОЗМОЖНА НЕУСТОЙЧИВОСТЬ!!!');
disp(' (невыполнено условие устойчивости Куранта-Леви:N>=M)!!!');
pause;
end;
g=(t/h)^2;
U=zeros(M+1,N+1);
for j=0:N
U(1,j+1)=j*t;
end;
for i=1:(M-1)
U(i+1,2)=5*(i*h*t)^2+t*(1-i*h);
end;
U(M+1,2)=(5*t^2+g*h-t*M*h+t);
for j=1:(N-1)
for i=1:(M-1)
U(i+1,j+2)=2*(1-g)*U(i+1,j+1)+g*(U(i,j+1)+U(i+2,j+1))-U(i+1,j)+t^2*10*((i*h)^2-(j*t)^2);
end;
U(M+1,j+2)=2*g*(U(M,j+1)-U(M+1,j+1)*(1+h)+h*(1+(t*j)^2))+10*(t^2)-10*(t^4)*(j^2)-U(M+1,j)+2*U(M+1,j+1);
end;
mesh(U,[-50,25]);
pause;
contour(U,20);
clc
Текст функции, вычисляющий матрицу решения размерностью MxN для неявной схемы:
% NEYAV
% Решение краевой задачи с применением НЕЯВНОЙ разностной схемы
%------------- ОПРЕДЕЛЕНИЕ ЧИСЛА РАЗБИЕНИЙ ПО ОСЯМ x,t---------------
N=input('Введите количество разбиений по оси времени (N):');
M=input('Введите количество разбиений по оси стержня (M):');
%---ОПРЕДЕЛЕНИЕ ШАГОВ СЕТКИ:a=b/c,ГДЕ b-ПРЕДЕЛ ВЫЧИСЛЕНИЙ ПО ОСИ x ИЛИ t
h=1/M; t=1/N;
%--------------ОПРЕДЕЛЕНИЕ РАБОЧИХ КОНСТАНТ ---------------------------
u=zeros(M+1,N+1);
h2=h^2; t2=t^2; g2=t2/h2;
%------------- ЗАПОЛНЕНИЕ МАТРИЦЫ U(x,t) 1-ым НАЧАЛЬНЫМ УСЛОВИЕМ----
for i=0:M, u(i+1,1)=0; end
%-----------------------------------------------------------------------
A=zeros(M,1); C=zeros(M+1,1); B=A; A1=A; F=C; B1=C;
%------------ЭТАП ЗАПОЛНЕНИЯ МАТРИЦЫ U(x,t) 2-ым НАЧАЛЬНЫМ УСЛОВИЕМ----
%------------1) Определение прогоночных коэффициентов-------------------
for i=1:M-1, A(i)=g2/2; B(i+1)=g2/2; C(i+1)=1+g2;
F(i+1)=t*(1-i*h)+5*t2*(h2*i^2-t2);
end;
%------------2) Определение граничных прогоночных коэффициентов---------
A(M)=0; B(1)=0; C(1)=1; C(M+1)=1;
F(1)=t; F(M+1)=5*t2+g2*h-t*M*h+t;
%------------ ОПРЕДЕЛЕНИЕ U(i,1) МЕТОДОМ ПРОГОНКИ---------------
A1(1)=B(1)/C(1); B1(1)=F(1)/C(1);
for i=2:M
A1(i)=B(i)/(C(i)-A(i-1)*A1(i-1));
B1(i)=(F(i)+A(i-1)*B1(i-1))/(C(i)-A(i-1)*A1(i-1));
end;
B1(M+1)=(F(M+1)+A(M)*B1(M))/(C(M+1)-A(M)*A1(M));
u(M+1,2)=B1(M+1);
for i=M:-1:1,
u(i,2)=A1(i)*u(i+1,2)+B1(i);
end;
%------------ЭТАП ЗАПОЛНЕНИЯ МАТРИЦЫ U(x,t) ---------------------------
%------------1) Определение прогоночных коэффициентов-------------------
for i=1:M-1, A(i)=g2; B(i+1)=g2; C(i+1)=1+2*g2; end
%------------2) Определение граничных прогоночных коэффициентов---------
A(M)=0; B(1)=0; C(1)=1; C(M+1)=1;
%------------ ОПРЕДЕЛЕНИЕ U(i,j) МЕТОДОМ ПРОГОНКИ---------------
A1(1)=B(1)/C(1);
for i=2:M,
A1(i)=B(i)/(C(i)-A(i-1)*A1(i-1));
end;
for j=2:N,
F(1)=t*j;
for i=1:M-1,
F(i+1)=2*u(i+1,j)-u(i+1,j-1)+10*t2*(h2*i^2-t2*(j-1)^2);
end;
F(M+1)=2*g2*(u(M-1,j)-u(M,j)*(1+h)+h*(1+(j-1)*t))+10*t^2-10*t^4*(j-1)^2-u(M,j-1)+2*u(M,j);
B1(1)=F(1)/C(1);
for i=2:M,
B1(i)=(F(i)+A(i-1)*B1(i-1))/(C(i)-A(i-1)*A1(i-1));
end;
B1(M+1)=(F(M+1)+A(M)*B1(M))/(C(M+1)-A(M)*A1(M));
u(M+1,j+1)=B1(M+1);
for i=M:-1:1,
u(i,j+1)=A1(i)*u(i+1,j+1)+B1(i);
end;
end;
mesh(u,[-50,25]);
pause;
contour(u,15);pause;
clc
