Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Матрицы курсовая работа.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
568.83 Кб
Скачать

Приложение а

Исходный код модуля для работы с матрицами

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.