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

3. Выбор сеточного шаблона и составление системы уравнений для явной разностной схемы

x

T

Рис. 2.

Так же как и для неявной схемы воспользуемся прямоугольной равномерной сеткой с (M+1) узлом на оси OX и (N+1) на оси OT. На данной сетке заменим частные производные разностными операторами и введём сеточную функцию, которая соответствует функции из пространства непрерывных функций.

Для решения задачи с применением явной разностной схемы воспользуемся перевернутым Т-образным шаблоном (Рис.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;

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