Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






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





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.

Date: 2015-09-02; view: 350; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию