- •Методические указания и постановка задачи.
- •1. Тема.
- •2. Цель работы.
- •3. Порядок работы.
- •Порядок выполнения работы.
- •Классификация краевой задачи и её физический смысл
- •2. Выбор сеточного шаблона и составление системы уравнений для неявной разностной схемы
- •3. Тексты программы для неявной схемы.
- •3. Выбор сеточного шаблона и составление системы уравнений для явной разностной схемы
- •Д ля применения данной системы для решения поставленной задачи необходимо выполнение условия
- •4. Тексты программы для явной схемы.
- •5. Анализ полученных данных
- •Список литературы
3. Выбор сеточного шаблона и составление системы уравнений для явной разностной схемы
x
T
Рис. 2.
Для решения задачи с применением явной разностной схемы воспользуемся перевернутым Т-образным шаблоном (Рис.2). По данному шаблону может быть составлена следующая двухслойная схема:
(9)
Преобразуя
к удобному для расчетов виду, получим
следующий вид формулы (1):
(10)
Использование полученной формулы для каждого последующего слоя (по T) даёт возможность получить для него на два значения меньше чем известно на текущем. Причем, неизвестными остаются краевые значения, для нахождения которых воспользуемся, полученными ранее для неявной схемы, уравнениями выведенными на базе аппроксимации краевых условий ((6),(7)), представив их в удобном для расчета виде:
(11)
(12)
Как и в неявной схеме для заполнения первого слоя по T воспользуемся начальным условием (уравнением 3). И, подставив конкретные значения для явной схемы, получаем систему уравнений:
Д ля применения данной системы для решения поставленной задачи необходимо выполнение условия
3. Тексты программы для неявной схемы.
Используя описанную выше схему,представляю программу для нахождения решения уравнений.
disp('---------- Прога -----------')
clear;
%---------ЗАПРОС И ВЫЧИСЛЕНИЕ ПРЕДВАРИТЕЛЬНЫХ ПАРАМЕТРОВ --------%
min_kol_uzlov = 5; %минимал. число узлов на оси
max_kol_uzlov = 100; %максим. число узлов на оси
M = zeros(1,1); %действит.число узлов на оси OX
N = zeros(1,1); %действит.число узлов на оси OT
h = zeros(1,1); %длина шага разбиения по оси OX
r = zeros(1,1); %длина шага разбиения по оси OT
vspomog = zeros(1,1); %вспомогательная переменная
%Запрос числа шагов по OX
vspomog=0;
while vspomog==0
disp('интервал :')
disp('от')
disp(min_kol_uzlov)
disp('до')
disp(max_kol_uzlov)
M=input('Задайте число узлов по OX (не выходите за интервал):');
if min_kol_uzlov<=M
if M<=max_kol_uzlov
vspomog=1;
end; end;
if vspomog==0
disp('Заданный параметр не входит в установленный интервал,')
disp(' попробуем еще раз...')
end; end;
%Запрос числа шагов по OT
vspomog=0;
while vspomog==0
disp('интервал :')
disp('от')
disp(min_kol_uzlov)
disp('до')
disp(max_kol_uzlov)
N=input('Задайте число узлов по OT (не выходите за интервал):');
if min_kol_uzlov<=N
if N<=max_kol_uzlov
vspomog=1;
end; end;
if vspomog==0
disp('Заданный параметр не входит в установленный интервал,')
disp(' попробуем еще раз...')
end; end;
%Расчет длины шагов
h=1.0/M;
r=1.0/N;
%-----------МЕТОД ПРОГОНКИ---------%
U = zeros(M+1,N+1); %матрица решений
c0 = zeros(1,1); %коэффициенты уравнений прогонки
b0 = zeros(1,1);
f0 = zeros(1,1);
ai = zeros(1,1);
ci = zeros(1,1);
bi = zeros(1,1);
fi = zeros(1,1);
am = zeros(1,1);
cm = zeros(1,1);
fm = zeros(1,1);
alfa = zeros(M+1,1); %массивы для хран. промежуточных данных
beta = zeros(M+1,1);
i = zeros(1,1); %переменные для циклов
j = zeros(1,1);
kof_b1 = 0; %коэф-ты определенные для данной
kof_b2 = 2; % функции см. (***)
k = zeros(1,1); %коэф. корек. (проверка на устойчивость)
%Заполнение первой строки матр. U
for i=1:1:M+1
U(i,1)=naus_Ux0(h*(i-1)); end;
%вычисление коэффициентов уравнений прогонки
c0 = 1+(h^2)/(2*r)+kof_b1;
b0 = 1;
ai = 1;
ci = 2+(h^2)/r;
bi = 1;
am = 1;
cm = 1+(h^2)/(2*r)-kof_b2;
%проверка на устойчивость
%i=c0*cm;
if (c0*cm)==0
disp(' Error:Условие устойчивости не выполняется => ');
Disp (‘ |c0|>0 = FALSE или |cm|>0 = FALSE’);
pause
exit; end;
if abs(c0)<abs(b0)
disp(' Error:Условие устойчивости не выполняется ');
disp(‘=> |c0|>=|b0| = FALSE’);
pause
exit; end;
if abs(cm)<abs(am)
disp(' Error:Условие устойчивости не выполняется => ');
disp(‘|cm|>=|bm| = FALSE’);
pause
exit; end;
k = 1; %строгое неравенство не выполняется
if abs(c0)>abs(b0)
if abs(cm)>abs(am)
k=0; %строгое неравенство выполняется
end; end;
if k==0
if abs(ci)<abs(ai)+abs(bi)
disp(' Error:Условие устойчивости не выполняется => ');
disp(‘|ci|>=|ai|+|bi| = FALSE’);
pause
exit; end; else
if abs(ci)<=abs(ai)+abs(bi)
disp(' Error:Условие устойчивости не выполняется => ');
disp('|ci|>|ai|+|bi| = FALSE при том,’);
disp(‘что |cm|==|bm| = TRUE или |c0|==|b0| = TRUE');
pause
exit; end; end;
%вычисление значений массива alfa
alfa(2) = b0/c0;
for i=3:1:M+1
alfa(i) = bi/(ci-ai*alfa(i-1)); end;
%основной цикл
for j=2:1:N+1
%вычисление значений массива beta
%вычисление текущего значения коэф. уравнения f0
f0 = (h^2)*U(1,j-1)/(2*r) + (h^2)*func_f(0*h,(j-1)*r)/2 + h*func_m1((j-1)*r);
beta(2) = f0/c0;
for i=3:1:M+1
%вычисление текущего значения коэф. уравнения fi
fi = (h^2)*func_f((i-2)*h,(j-1)*r) + (h^2)*U(i-1,j-1)/r;
beta(i) = (fi + ai*beta(i-1))/(ci - ai*alfa(i-1)); end;
%вычисление текущего значения коэф. уравнения fm
fm = (h^2)*U(M+1,j-1)/(2*r) + (h^2)*func_f(M*h,(j-1)*r)/2 - h*func_m2((j-1)*r);
%заполнение текущей строки матрицы решений
U(M+1,j) = (fm + am)/(cm - am*alfa(M+1));
for i=M:-1:1
U(i,j) = alfa(i+1)*U(i+1,j) + beta(i+1);
end; end;
%вывод результата
max = U(1,1); %максимальное значение функции
min = U(1,1); %минимальное значение функции
x = 0:h:1; %массив делений по оси X
y = 0:r:1; %массив делений по оси T
z = zeros(21,1); %массив высот
for i=1:1:M+1
for j=1:1:N+1
if max<U(i,j)
max = U(i,j);
end;
if min>U(i,j)
min = U(i,j);
end; end; end;
z = min:(max-min)/20:max;
contour(y,x,U,z);
grid;
xlabel('Ось T ');
ylabel('Ось X ');
disp(U);
disp('Для продолжения нажмите любую клавишу...')
pause;
%вращение
hag = 5; %шаг поворота в градусах
GP = 0; %величина поворота в горизонт плоскости
VP = 0; %величина поворота в вертикальной плоскости
vspomog = 0; %вспомогательная переменная
mesh(U,[VP,GP]);
while vspomog == 0
s=input('Задайте направление поворота <1,2,3,4 - поворот; 0 - завершение работы>:','s')
switch s,
case '4',
VP = VP + hag;
case '1',
VP = VP - hag;
case '3',
GP = GP + hag;
case '2',
GP = GP - hag;
case '0',
vspomog = 1; end;
mesh(U,[VP,GP]);
xlabel('Ось T ');
ylabel('Ось X '); end;
