Розрахунок норм вектору
Розрахунок норм вектору
Розрахунок норм вектору
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ КПІ»
ФАКУЛЬТЕТ ПРИКЛАДНОЇ МАТЕМАТИКИ
Кафедра спеціалізованих комп’ютерних систем
КУРСОВА РОБОТА
з дисципліни «Технологія програмування»
Виконав Семенякін Володимир
Постановка завдання
Розробити програму для розрахунку норм вектору, отриманому по наступній формулі
, Де A, B, C — матриці й X, Y — вектори.
Теоретичні відомості
Для обрахунку заданої формули необхідно
a) Написати процедуру[1] множення матриці на матрицю.
b) Написати процедуру сумування матриць.
c) Написати процедуру віднімання векторів.
d) Написати функцію множення матриці на вектор
e) Написати функцію для обчислення евклідової норми вектора.
f) Написати функцію обчислення норми вектора
g) Написати функцію обчислення норми вектора
h) Створити зручний інтерфейс для користувача.
Множення матриць
Звідки легко бачити, що при множені матриці розмірами NM на матрицю розмірами МК буде отримана матриця розміром NК.
Сумування матриць
Легко бачити, що задана дія ніяк не впливає на розмірність результуючої матриці. Матриці, що сумуються, мають бути однакових розмінностей.
Множення матриці на вектор
Аналогічно множенню матриці на матрицю. Другим операндом у такій ситуації виступає матриця розміром М1. В результаті виникає матриця розміром N1, або ж просто вектор з N координатами.
Віднімання векторів
Обчислення евклідової норми[2]
Відбувається за наступною формулою
Частіше всього евклідова норма використовується для обчислення довжини вектора.
Норми й не потребують пояснення. Їх зміст у їх вигляді.
Обґрунтування доцільності використання модулів
Модулі дозволяють використання функцій, процедур й типів для роботи з матрицями і векторами у інших програмах. Отже модульне програмування додає універсальності.
Функції й процедури доцільні, коли виникає багаторазове повторення одних й тих же алгоритмів. Ця курсова робота — як раз той випадок.
Код програми
Код головної програми
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ComCtrls, matrix, Menus;
type
TmatrEditor = class (TForm)
Label1 TLabel;
Button2 TButton;
operList TListView;
l2 TLabel;
objInf TGroupBox;
matrViev TStringGrid;
vectViev TStringGrid;
itemNomb TEdit;
infLab TLabel;
Button3 TButton;
GroupBox2 TGroupBox;
Label2 TLabel;
vectorRB TRadioButton;
matrixRB TRadioButton;
l4 TLabel;
GroupBox3 TGroupBox;
Button1 TButton;
Button4 TButton;
TEST TButton;
MainMenu1 TMainMenu;
File1 TMenuItem;
Save1 TMenuItem;
Open1 TMenuItem;
Exit1 TMenuItem;
opViev TEdit;
GroupBox1 TGroupBox;
plusA TRadioButton;
minusA TRadioButton;
multA TRadioButton;
Button5 TButton;
Button7 TButton;
Button6 TButton;
OpenD TOpenDialog;
saveD TSaveDialog;
Label3 TLabel;
procedure Button2Click (Sender TObject);
procedure FormCreate (Sender TObject);
procedure matrVievClick (Sender TObject);
procedure TESTClick (Sender TObject);
procedure Button1Click (Sender TObject);
procedure operListClick (Sender TObject);
procedure vectVievClick (Sender TObject);
procedure vectorRBClick (Sender TObject);
procedure matrixRBClick (Sender TObject);
procedure Button4Click (Sender TObject);
procedure itemNombKeyUp (Sender TObject; var Key Word;
Shift TShiftState);
procedure operListDblClick (Sender TObject);
procedure Button5Click (Sender TObject);
procedure Button6Click (Sender TObject);
procedure Button7Click (Sender TObject);
procedure Save1Click (Sender TObject);
procedure Open1Click (Sender TObject);
procedure itemNombChange (Sender TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const maxAct=15;
type matrRec = record
strName string [20];
case typeOf (vect,matr) of
matr (mt matrix_);
vect (vt vector);
end;
matrRecLink = ^matrRec;
var
matrEditor TmatrEditor;
nowCharCode byte;
nowMatr matrix_;
nowVect vector;
mainList TList;
nowEl matrRecLink;
i,j size;
nowItem integer;
fl boolean;
actionArr array [1. maxAct] of 0.5;
indexArr array [1. maxAct+1] of 0.60;
sizeOfAction,act 0.2;
opers array [1.2] of matrRecLink;
filePath string [255];
f file of matrRec;
newItem TListItem;
implementation
uses Unit3;
{$R *. dfm}
procedure TmatrEditor. Button2Click (Sender TObject);
begin
newItem =operList. Items. Add;
newItem. Caption =char (nowCharCode);
newItem. SubItems. Add (‘Vector’);
// ————————
new (nowEl);
nowEl^. typeOf =vect;
ziroVect (nowEl^. vt);
nowEl^. strName =char (nowCharCode);
mainList. Add (nowEl);
// ————————
nowCharCode =nowCharCode+1;
// ————————
operList. Enabled =true;
end;
procedure TmatrEditor. FormCreate (Sender TObject);
var newItem TListItem;
begin
mainList =TList. Create;
nowCharCode =65;
fl =true;
sizeOfAction =0;
end;
procedure TmatrEditor. matrVievClick (Sender TObject);
begin
itemNomb. Text =matrViev. Cells [matrViev. Col,matrViev. Row];
infLab. caption =matrRecLink (mainList [nowItem]) ^. strName+’ [‘+IntToStr (matrViev. Col+1) +’] [‘+IntToStr (matrViev. Row+1) +’] ‘;
end;
procedure TmatrEditor. TESTClick (Sender TObject);
begin
transp (nowMatr);
for i =1 to nmax do
for j =1 to nmax do
begin
matrViev. Cells [i-1,j-1] =FloatToStr (nowMatr [i] [j]);
end;
end;
procedure TmatrEditor. Button1Click (Sender TObject);
var nowRand real;
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = Matr then
for i =1 to nmax do
for j =1 to nmax do
begin
nowRand = (1-2*random (2)) *random (100) /10;
matrViev. Cells [i-1,j-1] =FloatToStr (nowRand);
matrRecLink (mainList [nowItem]) ^. mt [i] [j] =nowRand;
end;
// ———————
if matrRecLink (mainList [nowItem]) ^. typeOf = Vect then
for i =1 to nmax do
begin
nowRand = (1-2*random (2)) *random (100) /10;
vectViev. Cells [i-1,0] =FloatToStr (nowRand);
matrRecLink (mainList [nowItem]) ^. vt [i] =nowRand;
end;
end;
procedure TmatrEditor. operListClick (Sender TObject);
begin
if nowItem<>-1 then
begin
objInf. Enabled =true;
nowItem =operList. ItemIndex;
if matrRecLink (mainList [nowItem]) ^. typeOf=vect then
begin
l4. caption =’vect’;
for i =1 to nmax do
for j =1 to nmax do
matrViev. Cells [i-1,j-1] =»;
for i =1 to nmax do vectViev. Cells [i-1,0] =FloatToStr (matrRecLink (mainList [nowItem]) ^. vt [i]);
vectViev. Color =clWindow;
vectViev. Ctl3D =true;
vectViev. Enabled =true;
matrViev. Color =clScrollBar;
matrViev. Ctl3D =false;
matrViev. Enabled =false;
// ————————
vectorRB. Checked =true;
itemNomb. Text =vectViev. Cells [0,0];
end;
// ==================================================
if matrRecLink (mainList [nowItem]) ^. typeOf=matr then
begin
l4. caption =’matr’;
for i =1 to nmax do vectViev. Cells [i-1,0] =»;
for i =1 to nmax do
for j =1 to nmax do
matrViev. Cells [i-1,j-1] =FloatToStr (matrRecLink (mainList [nowItem]) ^. mt [i] [j]);
vectViev. Color =clScrollBar;
vectViev. Ctl3D =false;
vectViev. Enabled =false;
matrViev. Color =clWindow;
matrViev. Ctl3D =true;
matrViev. Enabled =true;
// ————————
matrixRB. Checked =true;
itemNomb. Text =matrViev. Cells [0,0];
end;
end;
end;
procedure TmatrEditor. vectVievClick (Sender TObject);
begin
itemNomb. Text =vectViev. Cells [vectViev. Col,0];
infLab. caption =matrRecLink (mainList [nowItem]) ^. strName+’ [‘+IntToStr (vectViev. Col+1) +’] ‘;
end;
procedure TmatrEditor. vectorRBClick (Sender TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = matr then
if MessageDlg (‘All matrix information will be lost. Change to vector? ‘, mtWarning, [mbYes, mbNo], 0) = mrYes then
begin
new (nowEl);
nowEl^. typeOf =vect;
ziroVect (nowEl^. vt);
nowEl^. strName =matrRecLink (mainList [nowItem]) ^. strName;
for i =1 to nmax do
for j =1 to nmax do
matrViev. Cells [i-1,j-1] =»;
for i =1 to nmax do vectViev. Cells [i-1,0] =FloatToStr (nowEl^. vt [i]);
dispose (mainList [nowItem]);
mainList [nowItem] =nowEl;
// ——————————
vectViev. Color =clWindow;
vectViev. Ctl3D =true;
vectViev. Enabled =true;
matrViev. Color =clScrollBar;
matrViev. Ctl3D =false;
matrViev. Enabled =false;
// ——————————
operList. Items [nowItem]. SubItems [0] =’Vector’;
end;
end;
procedure TmatrEditor. matrixRBClick (Sender TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = vect then
if MessageDlg (‘All vector information will be lost. Change to matrix? ‘, mtWarning, [mbYes, mbNo], 0) = mrYes then
begin
new (nowEl);
nowEl^. typeOf =matr;
ziroMatr (nowEl^. mt);
nowEl^. strName =matrRecLink (mainList [nowItem]) ^. strName;
for i =1 to nmax do vectViev. Cells [i-1,0] =»;
for i =1 to nmax do
for j =1 to nmax do
matrViev. Cells [i-1,j-1] =FloatToStr (nowEl^. mt [i] [j]);
dispose (mainList [nowItem]);
mainList [nowItem] =nowEl;
// ———————————
vectViev. Color =clScrollBar;
vectViev. Ctl3D =false;
vectViev. Enabled =false;
matrViev. Color =clWindow;
matrViev. Ctl3D =true;
matrViev. Enabled =true;
// ——————————
operList. Items [nowItem]. SubItems [0] =’Matrix’;
end;
end;
procedure TmatrEditor. Button4Click (Sender TObject);
begin
if matrRecLink (mainList [nowItem]) ^. typeOf = Vect then
begin
ziroVect (matrRecLink (mainList [nowItem]) ^. vt);
for i =1 to nmax do
vectViev. Cells [i-1,0] =’0′;
end;
// ———————
if matrRecLink (mainList [nowItem]) ^. typeOf = Matr then
begin
ziroMatr (matrRecLink (mainList [nowItem]) ^. mt);
for i =1 to nmax do
for j =1 to nmax do
matrViev. Cells [i-1,j-1] =’0′;
end;
end;
procedure TmatrEditor. itemNombKeyUp (Sender TObject; var Key Word;
Shift TShiftState);
var saveVal real;
begin
if (matrRecLink (mainList [nowItem]) ^. typeOf=vect) and not (Key=46) then
begin
try
// saveVal =matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col];
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col] =StrToFloat (itemNomb. text);
saveVal =matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col];
vectViev. Cells [vectViev. Col,0] =itemNomb. text;
except
on EConvertError do
begin
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col] =saveVal;
text =FloatToStr (saveVal);
showMessage (‘Put only number! ‘);
end;
end;
end;
{if matrRecLink (mainList [nowItem]) ^. typeOf=matr then
begin
saveVal =matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row];
matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row] =StrToFloatDef (text,saveVal);
text =FloatToStr (matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col] [matrViev. Row]);
matrViev. Cells [vectViev. Col,vectViev. Row] =text;
end; }
end;
procedure TmatrEditor. operListDblClick (Sender TObject);
begin
if (nowItem<>-1) and (sizeOfAction<2) then
begin
if length (opViev. Text) >0 then
begin
if multA. Checked then begin
opViev. Text =opViev. text+’x’; act =0; end;
if minusA. Checked then begin
opViev. Text =opViev. text+’-‘; act =1; end;
if plusA. Checked then begin
opViev. Text =opViev. text+’+’; act =2; end;
end;
new (opers [sizeOfAction+1]);
opers [sizeOfAction+1] ^. typeOf =matr;
for i =1 to nmax do
for j =1 to nmax do
opers [sizeOfAction+1] ^. mt [i] [j] =matrRecLink (mainList [nowItem]) ^. mt [i] [j];
sizeOfAction =sizeOfAction+1;
opViev. Text =opViev. text+matrRecLink (mainList [nowItem]) ^. strName;
end;
end;
procedure TmatrEditor. Button5Click (Sender TObject);
var newItem TListItem;
begin
// ——————————————
if fl then begin
for nowCharCode =65 to 67 do
begin
newItem =operList. Items. Add;
newItem. Caption =char (nowCharCode);
newItem. SubItems. Add (‘Matrix’);
// ————————
new (nowEl);
nowEl^. typeOf =matr;
ziroMatr (nowEl^. mt);
nowEl^. strName =char (nowCharCode);
mainList. Add (nowEl);
// ————————
operList. Enabled =true;
end;
// =========================================
for nowCharCode =88 to 89 do
begin
newItem =operList. Items. Add;
newItem. Caption =char (nowCharCode);
newItem. SubItems. Add (‘Vector’);
// ————————
new (nowEl);
nowEl^. typeOf =vect;
ziroVect (nowEl^. vt);
nowEl^. strName =char (nowCharCode);
mainList. Add (nowEl);
// ————————
operList. Enabled =true;
end;
fl =false;
end;
ziroMatr (nowMatr);
// ==================================================
writeMatr (nowMatr,matrRecLink (mainList [0]) ^. mt);
multMatrToMatr (nowMatr,matrRecLink (mainList [1]) ^. mt,nowMatr);
sumMatr (nowMatr,matrRecLink (mainList [2]) ^. mt,nowMatr);
// —————————————————
writeVect (nowVect,matrRecLink (mainList [3]) ^. vt);
decVect (nowVect,matrRecLink (mainList [4]) ^. vt,nowVect);
// —————————————————
multMatrToVect (nowMatr,nowVect,nowVect);
// —————————————————
for i =1 to nmax do rezults. rezVect. Cells [i-1,0] =FloatToStr (nowVect [i]);
rezults. visible =true;
rezults. Left =331;
rezults. Top =222;
// ————————
rezults. norm1. Text =FloatToStr (longOfVect (nowVect));
rezults. norm2. Text =FloatToStr (absSum (nowVect));
rezults. norm3. Text =FloatToStr (absMax (nowVect));
end;
procedure TmatrEditor. Button6Click (Sender TObject);
begin
opViev. Text =»;
dispose (opers [1]);
dispose (opers [2]);
sizeOfAction =0;
end;
procedure TmatrEditor. Button7Click (Sender TObject);
begin
if sizeOfAction=2 then
begin
// ziroMatr (nowMatr);
// ==================================================
// writeMatr (nowMatr,opers [1] ^. mt);
multMatrToMatr (opers [1] ^. mt,opers [2] ^. mt,nowMatr);
for i =1 to nmax do
for j =1 to nmax do
rezults. rezMatr. Cells [i-1,j-1] =FloatToStr (nowMatr [i] [j]);
end;
rezults. visible =true;
rezults. Left =331;
rezults. Top =222;
// ——————-
opViev. Text =»;
dispose (opers [1]);
dispose (opers [2]);
sizeOfAction =0;
end;
procedure TmatrEditor. Save1Click (Sender TObject);
var writeRec matrRec; var i integer;
begin
fl =saveD. Execute;
if fl then
begin
filePath =saveD. FileName;
assignFile (f,filePath);
rewrite (f);
for i =0 to mainList. Count-1 do
begin
writeRec =matrRecLink (mainList [i]) ^;
write (f,writeRec);
end;
end;
end;
procedure TmatrEditor. Open1Click (Sender TObject);
var writeRec matrRec;
begin
fl =openD. Execute;
operList. Clear;
mainList. Clear;
if fl then
begin
filePath =openD. FileName;
assignFile (f,filePath);
reset (f);
while not (eof (f)) do
begin
new (nowEl);
read (f,nowEl^);
mainList. Add (nowEl);
newItem =operList. Items. Add;
newItem. Caption =nowEl^. strName;
if nowEl^. typeOf=vect then
newItem. SubItems. Add (‘Vector’)
else
newItem. SubItems. Add (‘Matrix’);
if operList. Items. Count>0 then
nowItem =0;
operList. Enabled =true;
end;
end;
end;
procedure TmatrEditor. itemNombChange (Sender TObject);
var saveVal real;
begin
if matrRecLink (mainList [nowItem]) ^. typeOf=matr then
begin
saveVal =matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col+1,matrViev. Row+1];
try
matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col+1,matrViev. Row+1] =StrToFloat (itemNomb. Text);
matrViev. Cells [matrViev. Col,matrViev. Row] =FloatToStr (matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col+1,matrViev. Row+1]);
except
on EConvertError do begin
matrRecLink (mainList [nowItem]) ^. mt [matrViev. Col+1,matrViev. Row+1] =saveVal;
matrViev. Cells [matrViev. Col,matrViev. Row] =FloatToStr (saveVal);
itemNomb. Text =FloatToStr (saveVal);
end;
end;
end;
if matrRecLink (mainList [nowItem]) ^. typeOf=vect then
begin
saveVal =matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col+1];
try
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col+1] =StrToFloat (itemNomb. Text);
Label3. Caption =FloatToStr (vectViev. Col);
vectViev. Cells [vectViev. Col,vectViev. Row] =FloatToStr (matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col+1]);
except
on EConvertError do begin
showMessage (‘Convert error! ‘);
matrRecLink (mainList [nowItem]) ^. vt [vectViev. Col+1] =saveVal;
vectViev. Cells [vectViev. Col,vectViev. Row] =FloatToStr (saveVal);
itemNomb. Text =FloatToStr (saveVal);
end;
end;
end;
end;
end.
Код модуля «MATRIX»
unit matrix;
interface
const
nmax = 10;
type
size = 1. nmax;
vector = array [size] of real;
matrix_ = array [size,size] of real;
// Vector working ===============================
procedure writeVect (var op1 vector; op2 vector);
procedure ziroVect (var op1 vector);
// — ———— — ——————————
procedure sumVect (op1,op2 vector; var rez vector);
procedure decVect (op1,op2 vector; var rez vector);
procedure multVectToNomb (var op1 vector; nomb real);
function multVectToVect (op1,op2 vector) real;
// NORMS — —
function longOfVect (op1 vector) real;
function absSum (op1 vector) real;
function absMax (op1 vector) real;
// ============== ================================
// matrix_ working ================================
// ============== ================================
procedure writeMatr (var op1 matrix_; op2 matrix_);
procedure ziroMatr (var op1 matrix_);
// — ———— — ——————————
procedure sumMatr (op1,op2 matrix_; var rez matrix_);
procedure decMatr (op1,op2 matrix_; var rez matrix_);
procedure multMatrToNomb (var op1 matrix_; nomb real);
procedure multMatrToVect (op1 matrix_; op2 vector; var rez vector);
procedure multMatrToMatr (op1,op2 matrix_; var rez matrix_);
procedure transp (var op1 matrix_);
// NORMS — —
function longOfMatr (op1 matrix_) real;
function ijMaxSum (op1 matrix_) real;
function jiMaxSum (op1 matrix_) real;
implementation
// =============== HELP FUNCTIONS ================
// ———— — writeVect — ——————-
procedure writeVect (var op1 vector; op2 vector);
var i size;
begin
for i =1 to nmax do op1 [i] =op2 [i];
end;
// ———— — writeMatr — ——————-
procedure writeMatr (var op1 matrix_; op2 matrix_);
var i,j size;
begin
for i =1 to nmax do
for j =1 to nmax do
op1 [i] [j] =op2 [i] [j];
end;
// ————- — ziroVect — ——————-
procedure ziroVect (var op1 vector);
var i size;
begin
for i =1 to nmax do op1 [i] =0;
end;
// ————- — ziroMatr — ——————-
procedure ziroMatr (var op1 matrix_);
var i,j size;
begin
for i =1 to nmax do
for j =1 to nmax do
op1 [i] [j] =0;
end;
// =================================================
// ————- — sumVect — ———————
procedure sumVect (op1,op2 vector; var rez vector);
var i size;
begin
for i =1 to nmax do rez [i] =op1 [i] +op2 [i];
end;
// ————- — decVect — ———————
procedure decVect (op1,op2 vector; var rez vector);
var i size;
begin
for i =1 to nmax do rez [i] =op1 [i] — op2 [i];
end;
// ——— — multVectToNomb — ——————
procedure multVectToNomb (var op1 vector; nomb real);
var i size;
begin
for i =1 to nmax do op1 [i] =op1 [i] *nomb;
end;
// ———— — longOfVect — ——————
function longOfVect (op1 vector) real;
var i size; tmpVal real;
begin
tmpVal =0;
for i =1 to nmax do tmpVal =tmpVal+op1 [i] *op1 [i];
longOfVect =sqrt (tmpVal);
end;
// ——— — multVectToVect — ——————
function multVectToVect (op1,op2 vector) real;
var i size; tmpVal real;
begin
tmpVal =0;
for i =1 to nmax do tmpVal =tmpVal+op1 [i] *op2 [i];
multVectToVect =tmpVal;
end;
// ————- — absSum — ———————
function absSum (op1 vector) real;
var i size; tmpVal real;
begin
tmpVal =0;
for i =1 to nmax do tmpVal =tmpVal+abs (op1 [i]);
absSum =tmpVal;
end;
// ————- — absMax — ——————-
function absMax (op1 vector) real;
var i size; tmpVal real;
begin
tmpVal =op1 [1];
for i =2 to nmax do if op1 [i] >tmpVal then tmpVal =op1 [i];
absMax =tmpVal;
end;
// ================================================
// =============== matrix_ ================
// ================================================
// ————- — sumMatr — ——————
procedure sumMatr (op1,op2 matrix_; var rez matrix_);
var i,j size;
begin
for i =1 to nmax do
for j =1 to nmax do
rez [i] [j] =op1 [i] [j] +op2 [i] [j];
end;
// ————- — decMatr — ——————
procedure decMatr (op1,op2 matrix_; var rez matrix_);
var i,j size;
begin
for i =1 to nmax do
for j =1 to nmax do
rez [i] [j] =op1 [i] [j] — op2 [i] [j];
end;
// ————- — multMatrToNomb — ——————
procedure multMatrToNomb (var op1 matrix_; nomb real);
var i,j size;
begin
for i =1 to nmax do
for j =1 to nmax do
op1 [i] [j] =op1 [i] [j] *nomb;
end;
// ————- — multMatrToVect — ——————
procedure multMatrToVect (op1 matrix_; op2 vector; var rez vector);
var i,j size; tmpVal real;
begin
for i =1 to nmax do
begin
tmpVal =0;
for j =1 to nmax do
tmpVal =tmpVal+op1 [i] [j] *op2 [j];
rez [i] =tmpVal;
end;
end;
// ————- — multMatrToMatr — ——————
procedure multMatrToMatr (op1,op2 matrix_; var rez matrix_);
var i,j,j1 size; tmpVal real;
begin
for i =1 to nmax do
for j1 =1 to nmax do
begin
tmpVal =0;
for j =1 to nmax do
tmpVal =tmpVal+op1 [i] [j] *op2 [j] [j1];
rez [i] [j1] =tmpVal;
end;
end;
// —————— — transp — ———————
procedure transp (var op1 matrix_);
var i,j size; tmpVal real;
begin
for i =1 to nmax do
for j =i+1 to nmax do
begin
tmpVal =op1 [i] [j];
op1 [i] [j] =op1 [j] [i];
op1 [j] [i] =tmpVal;
end;
end;
// —————- — longOfMatr — ——————-
function longOfMatr (op1 matrix_) real;
var i,j size; tmpVal real;
begin
tmpVal =0;
for i =1 to nmax do
for j =1 to nmax do
tmpVal =tmpVal+op1 [i] [j] *op1 [i] [j];
longOfMatr =sqrt (tmpVal);
end;
// —————— — ijSumMax — ———————
function ijMaxSum (op1 matrix_) real;
var i,j size; tmpVal1,tmpVal2 real;
begin
for j =1 to nmax do
tmpVal2 =tmpVal2+op1 [i] [j];
for i =2 to nmax do
begin
tmpVal1 =0;
for j =1 to nmax do
tmpVal1 =tmpVal1+op1 [i] [j];
if tmpVal1>tmpVal2 then
tmpVal2 =tmpVal1;
end;
ijMaxSum =tmpVal2;
end;
// —————— — jiMaxSum — ———————
function jiMaxSum (op1 matrix_) real;
var i,j size; tmpVal1,tmpVal2 real;
begin
for i =1 to nmax do
tmpVal2 =tmpVal2+op1 [i] [j];
for j =2 to nmax do
begin
tmpVal1 =0;
for i =1 to nmax do
tmpVal1 =tmpVal1+op1 [i] [j];
if tmpVal1>tmpVal2 then
tmpVal2 =tmpVal1;
end;
jiMaxSum =tmpVal2;
end;
end.
Інтерфейс програми
Перевірка програми
Матриця А
програма вектор матриця інтерфейс
Матриця В
Матриця С
Вектор Х
Вектор Y
Результуючій вектор
Евклідова норма 206,434591820266
581,39
116
[1] Усі дії над матрицями та векторами, результатами яких не є скалярне значення треба робити з допомогою процедур, адже функція не може передавати складну структуру даних у якості результату.
[2] У найбільш широкому змісті нормою у лінійній алгебрі називається деяка функція, що ставить у відповідність матриці (вектору) деяке число (скаляр).
«