- •Бийский технологический институт (филиал)
- •«Объектно-ориентированный модуль для работы с матрицами» пояснительная записка к курсовому проекту (работе)
- •Содержание
- •Введение
- •1 Теоретическая часть
- •1.1 Матрицы. Основные обозначения
- •1.2 Основные операции над матрицами
- •2 Проектирование и разработка программы
- •2.1 Среда программирования
- •2.2 Проектирование объекта матрицы
- •2.3 Описание интерфейса
- •Заключение
- •Приложение а
Приложение а
Исходный код модуля для работы с матрицами
unit umatrix;
interface
uses Classes;
type
TMatrix = class(TComponent)
private
N : Integer; // Размерность матрицы
public
Matrix : array of array of Real; // Элементы матрицы
property Razmer : Integer read N;
procedure Init(Num : Integer = 3);
procedure ShowScreen;
procedure LoadFromFile(FName : string);
function Add(M2 : Tmatrix) : Tmatrix;
function Sub(M2 : Tmatrix) : TMatrix;
function Mult(M2 : Tmatrix) : tmatrix;
function Obrat(): Tmatrix;
function Transp() : Tmatrix;
function NumMul(Num : Real) : TMatrix;
function Det(M : Tmatrix): Real;
procedure Exchange_line(Nfirst, Nsecond: Integer);
function getMatrix(M : TMatrix; Row, Col: Integer ):TMatrix;
end;
implementation
// Инициализация матрицы
procedure TMatrix.Init(Num : Integer = 3);
var i : Integer;
begin
//Инициализация массива
N := Num;
SetLength(Matrix, N);
for i:=0 to N-1 do
SetLength(Matrix[i], N);
end;
// Вывод матрицы на экран
procedure TMatrix.ShowScreen;
var i, j: Integer;
begin
for i := 0 to N-1 do
for j := 0 to N - 1 do
Writeln(Matrix[i,j]);
end;
// Ввод матрицы из файла с указанным названием
procedure TMatrix.LoadFromFile(FName : string);
var
i,j : Integer;
F : TextFile;
begin
AssignFile(F, FName);
Reset(F);
for i := 0 to N - 1 do
begin
for j := 0 to N - 1 do
begin
Read(F, Matrix[i,j]);
end;
Readln(F);
end;
CloseFile(F);
end;
// Сложение двух матриц +
function TMatrix.Add(M2 : Tmatrix) : TMatrix;
var
i, j : Integer;
Msum : TMatrix;
begin
Msum := TMatrix.Create(Self);
Msum.Init(Razmer);
for i := 0 to N-1 do
for j := 0 to N-1 do
begin
Msum.Matrix[i,j] := Matrix[i,j] + M2.Matrix[i,j];
end;
Result := Msum;
end;
// Вычитание двух матриц +
function TMatrix.Sub(M2 : Tmatrix): TMatrix;
var
M : TMatrix;
i, j : Integer;
begin
M := TMatrix.Create(Self);
M.Init(Razmer);
for i := 0 to N-1 do
for j := 0 to N-1 do
begin
M.Matrix[i,j] := Matrix[i,j] - M2.Matrix[i,j];
end;
Result := M;
end;
// Умножение двух матриц +
function TMatrix.Mult(M2 : Tmatrix) : TMatrix;
var
M : TMatrix;
i, j, k : Integer;
begin
M := TMatrix.Create(Self);
M.Init(M2.Razmer);
for i := 0 to M2.Razmer - 1 do // перебираем строки
begin
for j := 0 to M2.Razmer - 1 do
begin
for k := 0 to M2.Razmer - 1 do
begin
M.Matrix[i,j] := M.Matrix[i,j] + Self.Matrix[i,k] * M2.Matrix[k,j];
end;
end;
end;
Result := M;
end;
// Умножение матрицы на число +
function TMatrix.NumMul(Num : Real) : TMatrix;
var i, j : Integer;
M : TMatrix;
begin
// Создаем вспомогательную матрицу
M := TMatrix(Self);
M.Init(Razmer);
for i := 0 to N-1 do
begin
for j := 0 to N-1 do
begin
M.Matrix[i,j] := Num * Matrix[i,j];
end;
end;
Result := M;
end;
// Транспонированная матрица +
function TMatrix.Transp : TMatrix;
var
M : TMatrix;
i, j : Integer;
begin
M := TMatrix.Create(Self);
M.Init(Razmer);
for i := 0 to Razmer - 1 do
begin
for j := 0 to Razmer - 1 do
begin
M.Matrix[i,j] := Matrix[j,i];
end;
end;
Result := M;
//
end;
// Поменять местами две строки +
procedure TMatrix.Exchange_line(Nfirst, Nsecond: Integer);
var
temp : Real;
i : Integer;
begin
for i := 0 to Razmer -1 do begin
temp := Matrix[Nfirst, i];
Matrix[Nfirst, i] := Matrix[Nsecond, i];
Matrix[Nsecond, i] := temp;
end;
end;
// Получение матрицы +
function TMatrix.getMatrix(M : TMatrix; Row, Col: Integer ):TMatrix;
var
Res : TMatrix;
i, j : Integer;
ii, jj : Integer;
begin
Res := TMatrix.Create(nil);
Res.Init(M.Razmer - 1);
ii := 0; jj := 0;
for i := 0 to Res.Razmer - 1 do
begin
if i >= Row then ii := i + 1 else ii := i;
for j := 0 to Res.Razmer - 1 do
begin
if j >= Col then jj := j + 1 else jj := j;
Res.Matrix[i,j] := M.Matrix[ii, jj];
end;
end;
Result := Res;
end;
function TMatrix.Det(M : TMatrix): Real;
var
i, j, znak : Integer;
begin
if M.Razmer = 1
then Result := M.Matrix[1,1]
else
if M.Razmer = 2 then Result := M.Matrix[0,0]*M.Matrix[1,1] - M.Matrix[0,1] * M.Matrix[1,0]
else
begin // Вычисляем определитель по строке
for i :=0 to M.Razmer -1 do begin
if Odd(i+1) then znak := -1 else znak := 1;
Result := Result + znak * M.Matrix[i, 1] * Self.Det(M.getMatrix(M, i, 1));
end;
end;
end;
// Обратная матрица
function TMatrix.Obrat(): TMatrix;
var
dop, Temp : TMatrix;
i, j, k : Integer;
koef, koefStr : Real;
begin
// Создаем еденичную матрицу
dop := TMatrix.Create(Self);
dop.Init(Self.Razmer);
for i := 0 to dop.Razmer - 1 do
begin
For j := 0 to dop.Razmer - 1 do begin
if (i <> j) then dop.Matrix[i,j] := 0
else dop.Matrix[i,j] := 1;
end;
end;
// Создаем вспомогательную матрицу
Temp := TMatrix.Create(self);
Temp.Init(Razmer);
For i := 0 to Razmer -1 do
for j := 0 to Razmer - 1 do
Temp.Matrix[i, j] := Matrix[i, j];
// Начинаем прямой ход
For i := 0 to Razmer - 2 do
begin
if Temp.Matrix[i,i] = 0 then
begin
Temp.Exchange_line(i, i+1);
dop.Exchange_line(i, i+1);
end;
koef := Temp.Matrix[i,i];
// Делим строку на коэффициент
for j := 0 to Razmer - 1 do
begin
Temp.Matrix[i, j] := Temp.Matrix[i, j] / koef ;
dop.Matrix[i, j] := dop.Matrix[i, j] / koef ;
end;
// вычитаем строку из остальных
for j := i + 1 to Razmer -1 do begin
koefStr := Temp.Matrix[j, i];
for k := 0 to Razmer - 1 do begin
Temp.Matrix[j,k] := Temp.Matrix[j,k] - koefStr*Temp.Matrix[i,k];
dop.Matrix[j,k] := dop.Matrix[j,k] - koefStr*dop.Matrix[i,k];
end;
end;
end;
// Превращаем последний элемент в 1
koef := Temp.Matrix[Razmer - 1, Razmer - 1];
for k := 0 to Razmer - 1 do begin
Temp.Matrix[Razmer - 1, k] := Temp.Matrix[Razmer - 1, k] / koef;
dop.Matrix[Razmer - 1, k] := dop.Matrix[Razmer - 1, k] / koef;
end;
{}
// Обратный ход
for i := Razmer - 1 downto 1 do begin
for j := i - 1 downto 0 do begin
koefStr := Temp.Matrix[j, i];
for k := 0 to Razmer -1 do begin
Temp.Matrix[j, k] := Temp.Matrix[j,k] - Temp.Matrix[i,k]* koefStr;
dop.Matrix[j, k] := dop.Matrix[j,k] - dop.Matrix[i,k]* koefStr;
end;
end;
end;
{}
Result := dop;
end;
end.
