Методом Крамера – это наиболее легкий метод решения систем линейных алгебраических уравнений, является наиболее точным по сравнению с другими методами решения. Достаточно прост и нагляден, обеспечивает приемлемое быстродействие для систем невысокого порядка. Сохраняет преимущества и недостатки методов вычисления определителей. Как вычислительный метод в научных и технических задачах применяется редко.
Блок-схема работы программы :
3.1 Формирование матрицы А:
3.2 Формирование матрицы R:
3.3 Формирование обратной матрицы R1:
3.4 Транспонирование матрицы А:
3.5 Вычисление матрицы AR1At :
3.6 Решение системы уравнений методом Крамера :
3.6.1 Описание процедуры замены:
3.6.2 Описание процедуры Opr:
3.6.3 Вычисление Х-ов:
3.7 Нахождение вектора Р:
4. Кодирование алгоритма.
В моём курсовом проекте я использовал 3 одномерных массива:
X : array [1..4] of real;
P : array [1..7] of real;
pr : array [1..4] of real;
Одномерный массив Х вещественного типа мне потребовался для формирования столбца из полученных корней уравнения, решенного методом Крамера.
Массив Р, вещественного типа, я использовал для формирования столбца значений вектора потоков Р.
Массив Pr , вещественного типа, я применил для формирования столбца проверочных данных.
Так же было использовано 6 двумерных массивов:
At : array [1..7,1..4] of shortint;
R : array [1..7,1..7] of shortint;
R1 : array [1..7,1..7] of real;
R1At : array [1..7,1..4] of real;
A : array [1..4,1..7] of shortint;
U,U1 : array [1..4,1..4] of real;
Массив At используется для формирования транспонированной матрицы А размерностью 7 строк и 4 столбца, элементы которой типа Shortint (т.к. все элементы матрицы являются целыми числами, а в Shortint входят все числа от -128 до +128 ).
Массив R используется для формирования диагональной матрицы размером 7 строк на 7 столбцов все элементы этой матрицы, как и элементы матрицы At Shortint типа.
Массив R1 – матрица размером 7 строк на 7 столбцов обратная матрице R типа real (вещественный тип данных) т.к. при формировании обратной матрицы нужно применить деление, а при делении частное получается почти всегда вещественного типа.
Массив R1At – матрица размером 7 строк на 4 столбца, полученная в результате умножения матрицы R1 на матрицу At, элементы этой матрицы, как и элементы массива R1 типа real.
Массив A – матрица элементов таб.№1(выделено заливкой) размером 4 строки на 7 столбцов тип Shortint.
Массивы U и U1 – это матрица размером 4 строки на 4 столбца полученная в результате умножения:
AR1At
тип элементов матрицы real.
Переменную S я использовал в процедурах умножения матриц, в качестве счётчика тип этой переменной вещественного типа real.
Переменные х1,х2,х3,х4 использованы в решении уравнения методом Крамера в качестве корней уравнения. Тип этих переменных так же вещественный.
d,dv,d1,d2,d3,d4 – переменные вещественного типа d – требуется для создания копии главного определителя dv. d1 - d4 – определители требующиеся для нахождения корней уравнения.
Переменные i,j нужны для счётчиков в операциях с матрицами i – это строки, j – это столбцы тип этих переменных integer (целый тип данных).
Переменная k использована при умножении матриц в качестве дополнительного счётчика тип integer.
n – переменная, использованная в процедуре замены для определения номера вырезаемого столбца тип переменной – integer.
nr – переменная типа byte (длина 1 байт, диапазон значений от 0 до 255) потребовалась в процедуре номеров пунктов меню.
5. Руководство ползователя.
5.1 Пуск
Запуск из среды Turbo Pascal производится нажатием клавиш Ctrl+F9, а из Norton Commander нажатием клавиши Enter на файле Inform.exe.
5.2 Ввод данных
Ввод данных производится только с цифровой клавиатуры. Цифры от 0 до 9.
5.3 Просмотр результатов.
После ввода цифры(нужного пункта в меню) выводится требуемый результат и после просмотра результата нужно нажать Enter. Затем вновь появится меню на экране.
5.4 Выход из программы
Выход из программы в среде Turbo Pascal и после запуска Inform.exe файла производится 0-ым пунктом меню.
Листинг программы.
uses crt;
var
pr,pro : array [1..4] of real;
s,x1,x2,x3,x4,d,d1,d2,d3,d4,dv : real;
i,j,k,n : integer;nr : byte;
const
Q : array [1..4] of integer = (70,100,-160,-80);
C : array [1..7] of byte = (4,5,7,6,5,8,5);
Procedure Titul; begin ClrScr; Window(1,1,80,25);
TextBackGround(blue);
TextColor(10);
ClrScr;
GoToXY(20,2); writeln('Кавминводский институт сервиса');
GoToXY(20,5); writeln('Курсовая работа по информатике');
GoToXY(10,8); writeln('студента 2-го курса очного отделения группы ИС-01');
GoToXY(18,11); writeln('Ханина Константина Александровича');
GoToXY(19,14); writeln('Тема работы " Транспортная задача "');
GoToXY(19,17); writeln('Руководитель ст. преп. Макаров Б.С.'); for i:=1 to 20 do Delay(30000)
end;
Procedure Vivod_a; begin
GoToXY(2,2);write('Матрица A');writeln;writeln; for i := 1 to 4 do begin
for j := 1 to 7 do begin
write(a[i,j]:5,' ');
end;writeln;
end
Procedure Vivod_R; begin
GoToXY(2,2);write('Матрица R');writeln;writeln; for i := 1 to 7 do begin
write(R[i,j]:3,' ');
Procedure Vivod_R1; begin
GoToXY(2,2);write('Матрица R1');writeln;writeln; for i := 1 to 7 do begin
write(R1[i,j]:3:1,' ');
Procedure Vivod_At; begin
GoToXY(2,2);write('Матрица At');writeln;writeln; for i := 1 to 7 do begin
for j := 1 to 4 do begin
write(At[i,j]:5,' ');
Procedure Vivod_AR1At; begin u := u1;
GoToXY(2,2);write('Матрица U');writeln;writeln; for i := 1 to 4 do begin
write(U[i,j]:5:1,' ');
Procedure Vivod_Q; begin
GoToXY(2,2);write('Столбец свободных членов Q');writeln;writeln; for i := 1 to 4 do
writeln(Q[i]:7);
Procedure Vivod_U; begin
GoToXY(2,2);write('Столбец вектора U');writeln;writeln; for i := 1 to 4 do
writeln(x[i]:7:1);
Procedure Vivod_P; begin
GoToXY(2,2);write('Столбец вектора P');writeln;writeln; for i := 1 to 7 do
writeln(P[i]:7:1);
Procedure Proverka; begin
for i := 1 to 4 do begin s := 0;
for j := 1 to 7 do
s := s + a[i,j] * p[j];
pr[i] := s;
for i := 1 to 4 do
writeln('pr = ',pr[i]:4:0)
Procedure Screen; begin
clrscr;
GotoXY(5,7);write('1. Сформировать матрицу A'); GoToXY(5,9);write('2. Сформировать матрицу R'); GoToXY(5,11);write('3. Найти обратную матрицу R1'); GoToXY(5,13);write('4. Транспонировать матрицу A'); GoToXY(5,15);write('5. Вычислить матрицу A*R1*At'); GoToXY(5,17);write('6. Сформировать стлбец свободных членов Q'); GoToXY(5,19);write('7. Pешить систему уравнений т.е. найти вектор U'); GoToXY(5,21);write('8. Найти вектор P'); GoToXY(5,23);write('9. Проверка !!!'); GoToXY(5,25);write('0. Выход ???');
GoToXY(20,30);write('В В Е Д И Т Е Н О М Е P П У Н К Т А - '); readln(nr);clrscr;
case nr of
1 : vivod_a;
2 : vivod_R;
3 : vivod_R1;
4 : vivod_At;
5 : vivod_AR1At;
6 : vivod_Q;
7 : vivod_U;
8 : vivod_P;
9 : Proverka;
0 : halt;
else
writeln('Вы ввели неправильно пункт');
Procedure opr; begin
dv := u[1,1]*u[2,2]*u[3,3]*u[4,4] + u[1,2]*u[2,3]*u[3,4]*u[4,1] +
u[1,3]*u[2,4]*u[3,1]*u[4,2] - u[1,4]*u[2,3]*u[3,2]*u[4,1] -
u[1,1]*u[2,4]*u[3,3]*u[4,2] - u[1,2]*u[2,1]*u[3,4]*u[4,3];
Procedure Zamena; begin
u[i,n] := Q[i]
Procedure formA; begin
(*------------------Формирование матрицы А------------------------*)
a[1,1]:=-1;a[1,2]:=0;a[1,3]:=0;a[1,4]:=0;a[1,5]:=1;a[1,6]:=0;a[1,7]:=0;
a[2,1]:=0;a[2,2]:=-1;a[2,3]:=0;a[2,4]:=0;a[2,5]:=-1;a[2,6]:=-1;a[2,7]:=0;
a[3,1]:=0;a[3,2]:=0;a[3,3]:=1;a[3,4]:=0;a[3,5]:=0;a[3,6]:=1;a[3,7]:=1;
a[4,1]:=0;a[4,2]:=0;a[4,3]:=0;a[4,4]:=1;a[4,5]:=0;a[4,6]:=0;a[4,7]:=-1; end;
Procedure formR; begin
(*--------------------Формиррование матрицы R-----------------------*)
for i := 1 to 7 do
if i=j then r[i,j] := c[i] else r[i,j]:=0;
Procedure formR1; begin
(*---------------------Формирование матрицы R1-----------------------*)
if i=j then
r1[i,j] := 1/r[i,j] else
r1[i,j] := 0;
Procedure transA; begin
(*--------------------Транспонирование матрицы А---------------------*)
for i := 1 to 4 do begin
At[j,i] := A[i,j]; end;end;
Procedure umnosh; begin
(*------------------------Умножение R1*At----------------------------*)
s := 0;
for k := 1 to 7 do
s := s + R1[i,k] * At[k,j];
R1At[i,j] := S end;
Procedure vychisl; begin
(*---------------------Вычисление матрицы A*R1At--------------------*)
for j := 1 to 4 do
begin
s := s + A[i,k] * R1At[k,j];
U[i,j] := s end;
(*---------------------Управляющая программа------------------------*)
Begin
TiTul;
FormA;
FormR;
FormR1;
TransA;
Umnosh;
Vychisl;
u1 := u;
opr;
d := dv;
n := 1;
zamena;
d1 := dv;
u := u1;
n := 2;
d2 := dv;
n := 3;
d3 := dv;
n := 4;
d4 := dv;
x1 := d1/d; x2 := d2/d; x3 := d3/d; x4 := d4/d;
x[1] := x1;x[2] := x2;x[3] := x3;x[4] := x4;
begin s := 0;
for k := 1 to 4 do
s := s - r1at[i,k] * x[k];
p[i] := s
for i := 1 to 10 do begin
Screen;readln; end;
End.
Страницы: 1, 2