Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ (МП-3) / Курсовые / mpm_21b / Курсач ЧМ.doc
Скачиваний:
82
Добавлен:
17.04.2013
Размер:
385.02 Кб
Скачать

Для применения данной системы для решения поставленной задачи необходимо выполнение условия

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;

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