Объектно-ориентированный модуль для работы с матрицами

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

Введение

1. Теоретическая часть

1.1 Матрицы. Основные обозначения

1.2 Основные операции над матрицами

2. Проектирование и разработка программы

2.1 Среда программирования

2.2 Проектирование объекта матрицы

2.3 Описание интерфейса

Заключение

Литература

Приложение А

Введение

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

В данной курсовой необходимо выполнить следующие задачи:

Проанализировать литературу и выявить основные понятия теории матриц.

Выявить основные операции с матрицами.

Спроектировать объектно-ориентированный модуль для работы с матрицами.

Разработать программу, которая позволяет выполнять различные действия над матрицами.

1 Теоретическая часть

1.1 Матрицы. Основные обозначения

Прямоугольную таблицу чисел (1)

будем называть матрицей. Если m = n, то матрица называется квадратной, а число m, называется ее порядком. В общем же случае матрица называется прямоугольной (с размерами) или -матрицей. Числа, составляющие матрицу, называются ее элементами.

При двухиндексном обозначении элементов первый индекс всегда указывает номер строки, а второй индекс -- номер столбца, на пересечении которых стоит данный элемент.

Наряду с обозначениями матрицы (1) употребляют и сокращенное обозначение:

Часто матрицу (1) обозначают также одной буквой, например матрица A. Если A -- квадратная матрица порядка n, то будем писать

Определитель квадратной матрицы будем обозначать так: или.

Введем сокращенные обозначения для определителей, составленных из элементов данной матрицы:

(2)

Прямоугольную матрицу, состоящую из одного столбца

мы будем называть столбцевой и обозначать так:.

Прямоугольную матрицу, состоящую из одной строки, мы будем называть строчной и обозначать так:

Квадратную матрицу, у которой все элементы, расположенные вне главной диагонали, равны нулю,

мы будем называть диагональной и обозначать так: или.

1.2 Основные операции над матрицами

Определим основные операции над матрицами: сложение матриц, умножение матрицы на число и умножение матриц.

Пусть величины выражаются через величины при помощи линейного преобразования

, (5)

а величины -- через те же величины при помощи преобразования

. (6)

Тогда

. (7)

В соответствии с этим мы устанавливаем

Суммой двух прямоугольных матриц и одинаковых размеров называется матрица тех же размеров, элементы которой равны суммам соответствующих элементов данной матрицы:

,

Если

Операция нахождения суммы данных матриц называется сложением матриц.

Пример

.

Согласно определению, складывать можно только прямоугольные матрицы одинаковых размеров.

Из определения сложения матриц непосредственно следует, что эта операция обладает переместительным и сочетательным свойствами:

1° ,

2°.

Здесь, , -- произвольные прямоугольные матрицы одинаковых размеров.

Операция сложения матриц естественным образом распространяется на случай любого числа слагаемых.

2. Умножим в преобразовании (5) величины на некоторое число из. Тогда

.

В соответствии с этим имеет место

Произведением матрицы на число из называется матрица элементы которой получаются из соответствующих элементов матрицы умножением на число:

,

Если

Операция нахождения произведения матрицы на число называется умножением матрицы на число.

Пример

Легко видеть, что

1° ,

2° ,

3°.

Здесь, -- прямоугольные матрицы одинаковых размеров,, -- числа из поля.

Разность двух прямоугольных матриц одинаковых размеров определяется равенством

Если -- квадратная матрица порядка, а -- число из, то

.

3. Пусть величины выражаются через величины при помощи преобразования

(8)

а величины -- через те же величины при помощи формул

. (9)

Тогда, подставляя эти выражения для в формулы (8), мы выразим через при помощи «составного» преобразования:

. (10)

В соответствии с этим имеет место

Произведением двух прямоугольных матриц

,

называется матрица

,

у которой элемент, стоящий на пересечении -й строки и -го столбца, равен «произведению» -й строки первой матрицы на -й столбец второй матрицы:

Операция нахождения произведения данных матриц называется умножением матриц.

Квадратную матрицу -го порядка, у которой на главной диагонали стоят единицы, а все остальные элементы равны нулю, будем называть единичной матрицей и обозначать через или просто. Название «единичная матрица» связано со следующим свойством матрицы: для любой прямоугольной матрицы

имеют место равенства

.

Очевидно,

Квадратную матрицу будем называть особенной, если. В противном случае квадратная матрица называется неособенной.

Рассмотрим преобразование

.

Мы получили «обратное» преобразование для матрицы A. Матрицу коэффициентов этого преобразования

мы назовем обратной матрицей для матрицы.

Транспонирование матрицы (обозначение: AT) -- операция, при которой матрица отражается относительно главной диагонали, то есть

Если A матрица размера, то AT — матрица размера

2. Проектирование и разработка программы

2.1 Среда программирования

Данный курсовой проект был разработан в среде Delphi7 с базовым языком программирования Object Pascal. Эту среду удобно использовать для создания сложных приложений, базами данных, приложения масштаба предприятия. Delphi так же прост в обучении, как и многие другие, но при этом средства языка программирования Pascal позволяет использовать все современные возможности объектно-ориентированного программирования.

Delphi -- это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi -- строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.

Delphi прост и логичен. Основные конструкции языка четко выделяются в программе, что способствует хорошему восприятию написанного кода. Графический интерфейс Delphi отлично продуман, среда разработки предоставляет доступ только к тем участкам кода, с которыми необходимо работать, скрывая основную часть программы, которая создается автоматически самой разработкой.

2.2 Проектирование объекта матрицы

Для разработки программы мы применим объектный подход в программировании, т. е. матрица будет объектом, который содержит собственно сами элементы матрицы и операции над ними.

Элементы матрицы будут располагаться в массиве. Выберем для проектирования квадратные матрицы, так как найти определитель можно только для квадратных матриц.

Объект матрицу мы опишем в отдельном иодуле, и назовем его uMatrix.

Назовем наш класс объектов TMatrix.

Этот объект содержит такие данные как: размер матрицы, элементы матрицы.

Объект содержит следующие методы для работы с данными:

Загрузка данных из файла LoadFromFile (FName: string), в которую передается один параметр, имя файла.

Функция сложения Add (M2: Tmatrix): Tmatrix, результат которой передается как объект типа TMatrix. На вход функции вводится второе слагаемое.

Функция вычитания function Sub (M2: Tmatrix): TMatrix, на вход которой передается вычитаемое, а разность выводится как результат работы функции в виде объекта TMatrix

Функция умножения двух матриц function Mult (M2: Tmatrix): Tmatrix, которая принимает параметр, второй сомножитель, результат выводится в виде объекта TMatrix.

Функция вычисления обратной матрицы, не имеет параметров, выдает в результате обратную матрицу в виде объекта TMatrix. Обратная матрица вычисляется методом Гаусса.

Функция вычисления транспонированной матрицы Transp (): Tmatrix, без параметров, выдает в результате транспонированную матрицу, объект типа TMatrix.

Функция умножения матрицы на число NumMul (Num: Real): TMatrix, принимает параметр, действительное число, на выходе объект матрица, типа TMatrix.

Функция вычисления определителя матрицы Det (M: Tmatrix): Real, принимает параметр, матрицу и выводит действительное число — определитель матрицы.

Процедура переставляющая местами строки Exchange_line (Nfirst, Nsecond: Integer) которая принимает два параметра номера строк, она переставляет строки в текущей матрице.

Функция getMatrix (M: TMatrix; Row, Col: Integer): TMatrix, которая получает минор текущей матрицы по номеру строки и столбца.

Процедура инициализации элементов матрицы, массива Matrix, по умолчанию инициализируется матрица размером 3×3.

Объект TMatrix содержит массив элементов, который мы назовем Matrix.

2.3 Описание интерфейса

Интерфейс программы интуитивно понятный. При загрузке программы сразу же инициализируется и загружается из файла матрица размера 3×3. Программа представляет из себя окно, со вкладками, каждая вкладка содержит одну операцию с матрицей, элементы матрицы отображаются в TStringGrid, каждая ячейка содержит 1 элемент. рассмотрим по порядку все вкладки.

Первая вкладка позволяет загрузить матрицу из файла (рис.1). Файл находится в той же папке что и программа и называется input. txt. Можно выбрать размерность матрицы, позволяется выбрать значения от 2 до 8. По щелчку на кнопке загрузить, инициализируется и загружается матрица.

Рис. 1. Вкладка загрузки матрицы

Вторая вкладка позволяет рассчитать транспонированную матрицу. Матрица строится на основе исходной, загруженной на 1-й вкладке. Расчет происходит по щелчку по кнопке. Результат выводится во вторую таблицу как показано на рисунке 2.

РРис. 2. Вычисление транспонированной матрицы

Для умножения матрицы на число используется третья вкладка рисунок 3. Выбирается число, на которое необходимо умножить элементы матрицы, во второй таблице отображается результат.

Рис. 3. Умножение матрицы на число

Вычисление обратной матрицы происходит на следующей вкладке рисунок 4. При нажатии на кнопку вычисляется результат — обратная матрица.

Рис. 4. Вычисление обратной матрицы

На пятой вкладке происходит вычисление определителя матрицы рисунок 5. При нажатии на кнопку вычисляется определитель и записывается в компонент TLabel.

Рис. 5. Вычисление определителя

Суммирование матриц выполняется в следующей вкладке рисунок 6. Второе слагаемое (вторая матрица) загружается из файла input2. txt. По нажатию на кнопку происходит вычисление суммы матриц.

Рис. 6. Суммирование матриц

Разность матриц аналогична суммированию, данные для второй матрицы загружаются из файла input2. txt. Как показано на рисунке 7 результат отображается в третьей таблице.

Рис. 7. Вычитание матриц

Последняя, седьмая вкладка позволяет умножить две матрицы. Вторая матрица загружается из файла input2. txt. Результат отображается в третьей таблице рисунок 7.

Рис. 7. Вычисление произведения матриц

Следует обратить внимание, что при переключении вкладок результаты предыдущих действий исчезают, т. е. очищается таблица, в которую необходимо поместить результат.

Заключение

В ходе работы над курсовой были выполнены следующие задачи. Был произведен анализ литературы и выявлены основные понятия теории матриц. Были выбраны основные операции с матрицами. Для реализации программы взяли квадратные матрицы, так как они более удобны для демонстрации возможностей работы с матрицами.

Спроектирован объект для хранения матрицы и выполнения операций с ней. Подготовлены функции и процедуры, реализующие эти операции.

Разработан модуль действий над матрицами, продуман интерфейс программы, а так же реализована сама программа.

Литература

Гантмахер Ф. Р. Теория матриц. — М.: Наука, 1968. — 576 с.

Валентин Озеров «Советы по Delphi», 1999

Зуев Е. А. Программирование на языке Turbo Pascal 6. 0,7.0. — М.: Радио и связь, Веста, 1993.

Фаронов В.В. Turbo Pascal 7.0. Начальный курс. — М.: Нолидж, 2000.

Фаронов В.В. «DELPHI. Программирование на языке высокого уровня». — Питер, 2005.

Бобровский С.И. Delphi 7. Учебный курс — Питер, 2007

Иллюстрированный онлайн учебник по Borland Delphi 7 с примерами, http: //delphi. support. uz/

Приложение А

матрица модуль программа

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

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;

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.

www.

ПоказатьСвернуть
Заполнить форму текущей работой