- •Московский Государственный Институт Электронной Техники
- •3. Порядок работы.
- •Теоретические сведения.
- •1. Классификация задач.
- •2. Метод сеток.
- •Порядок выполнения работы.
- •Классификация краевой задачи и её физический смысл
- •2. Выбор сеточного шаблона и составление системы уравнений для неявной разностной схемы
- •X t Рис. 1.
- •3. Выбор сеточного шаблона и составление системы уравнений для явной разностной схемы
- •Для применения данной системы для решения поставленной задачи необходимо выполнение условия
- •4. Тексты программы для неявной схемы.
- •4. Тексты программы для явной схемы.
- •5. Анализ полученных данных
- •Список литературы
Для применения данной системы для решения поставленной задачи необходимо выполнение условия
4. Тексты программы для неявной схемы.
Используя описанную выше схему,представляю программу для нахождения решения уравнений.
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*h;
b0 = 1;
ai = 1;
ci = 2+(h^2)/r;
bi = 1;
am = 1;
cm = 1+(h^2)/(2*r)-kof_b2*h;
%проверка на устойчивость
%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; end;