You are on page 1of 47

Форма N Н-6.

01

_________________Вінницький національний технічний університет_________________


(повне найменування вищого навчального закладу)

____________________________Кафедра комп’ютерних наук__________________________


(повна назва кафедри, циклової комісії)

КУРСОВА РОБОТА
__________________з дисципліни «Алгоритмізації та програмування»_________________
(назва дисципліни)
на тему: Розробка програми для знаходження власних значень і власних
векторів матриці

Студента __І__ курсу __1КН-16б__ групи


напряму підготовки 6.050101 Комп’ютерні науки

________________Мельник С.М. ___


(прізвище та ініціали)
Керівник __асистент Петришин С. І._____
(посада, вчене звання, науковий ступінь, прізвище та ініціали)

Національна шкала ___________________________


Кількість балів: __________ Оцінка: ECTS _______

Члени комісії ________________ ___________________________


(підпис) (прізвище та ініціали)

________________ ___________________________
(підпис) (прізвище та ініціали)

________________ ___________________________
(підпис) (прізвище та ініціали)

Вінниця 2017
Міністерство освіти і науки України
Вінницький національний технічний університет
Факультет інформаційних технологій та комп’ютерної інженерії
Кафедра комп’ютерних наук

ЗАТВЕРДЖУЮ
Зав. каф. КН, д.т.н., проф.
____________ А. А. Яровий
«__» _____________ 20__ р.

ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
на курсову роботу з дисципліни « Алгоритмізація та програмування »
студента групи __1КН-16б__Мельника С. М.__

1. Тема курсової роботи_Розробка програми для знаходження власних значень


і власних векторів матриці_затверджена на засіданні кафедри комп’ютерних
наук, протокол №___від «__» 20 р.

2. Термін здачі студентом зазначеної роботи: «__» 20 р.

3. Вхідні дані до роботи: використання мов програмування для розробки


системи знаходження власних значень і власних векторів.

4. Зміст пояснювальної записки: Вступ; Постановка задачі; Схема алгоритму


функціонування програмного забезпечення; Опис алгоритму; Характеристика
даних; Опис роботи програми; Аналіз результатів; Висновки; Список
використаних джерел; Додатки.

5. Перелік графічного матеріалу схеми алгоритмів функціонування системи та


основних модулів програмного забезпечення, віконні форми.

5. Дата видачі завдання: «__» 20 р.

Завдання видав _____Петришин С. І._____ ____________


(ПІП керівника курсової роботи) (підпис)

Завдання прийняв до виконання __Мельник С. М.__ ____________


(ПІП студента) (підпис)
АНОТАЦІЯ

У курсовій роботі розроблено програму для знаходження власних


значень і власних векторів матриці. Для розробки програми було використано
мову програмування С++. Для реалізації було використано програмне
середовище Visual Studio 2013. Робота включає в себе можливість введення
матриці 2х2, знаходження власних значень матриці, складання
характеристичного рівняння і знаходження власних векторів матриці.
В результаті виконання курсової роботи отримано програмний засіб,
який може бути використано учнями старшої школи, студентами вищих
навчальних закладів та викладачами вищої математики для перевірки
правильності рішення прикладу.
АННОТАЦИЯ

В курсовой работе разработана программа для нахождения собственных


значений и собственных векторов матрицы. Для разработки программы были
использованы язык программирования С++. Для реализации было
использовано программное среду Visual Studio 2013. Работа включает в себя
возможность введения матрицы 2х2, нахождение собственных значений
матрицы, составление характеристического уравнения и нахождение
собственных векторов матрицы.
В результате выполнения курсовой работы получены программное
средство, которое может быть использовано учащимися старших классов,
студентами высших учебных заведений и преподавателями высшей
математики для проверки правильности решения примера.
ANNOTATION

In the course work had been develop a program for finding eigenvalues and
vectors of a matrix. For develop the program I used programming language C ++.
To develop the program environment used Visual Studio 2013. The program
includes the possibility of introducing a 2x2 matrix, eigenvalues of matrix assembly
characteristic equation and finding eigenvectors matrix.
As a result of the project a software tool that may be used by high school
students, university students and professors for validation solution example.
ЗМІСТ

ПЕРЕЛІК СКОРОЧЕНЬ 7
ВСТУП 8
1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ «ЗНАХОДЖЕННЯ ВЛАСНИХ
ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ МАТРИЦІ» 9
1.1 Теорія, про обрану предметну область 9
1.2 Постановка задачі розробки... 9
2 ПРОЕКТУВАННЯ СИСТЕМИ НАЗВА СИСТЕМИ ЗНАХОДЖЕННЯ
ВЛАСНИХ ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ МАТРИЦІ 10
2.1 Розробка структури системи назва системи знаходження власних значень і
власних векторів 10
2.2 Розробка алгоритму функціонування системи знаходження власних
значень і власних векторів 10
2.3 Розробка алгоритмів функціонування основних модулів системи
знаходження власних значень і власних векторів 10
3 ПРОГРАМНА РЕАЛІЗАЦІЯ СИСТЕМИ НАЗВА СИСТЕМИ
ЗНАХОДЖЕННЯ ВЛАСНИХ ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ МАТРИЦІ
11
3.1 Обґрунтування вибору мови програмування 11
3.2 Основні оператори мови програмування назва обраної мови 11
3.3 Особливості середовища в якому буде розроблятися система 11
3.4 Реалізація системи знаходження власних значень і власних векторів 11
3.5 Тестування розробленої системи знаходження власних значень і власних
векторів 11
ВИСНОВКИ 12
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 13
ДОДАТКИ 14
ДОДАТОК А ЛІСТИНГ ПРОГРАМНОЇ РЕАЛІЗАЦІЇ ОСНОВНИХ МОДУЛІВ
СИСТЕМИ ЗНАХОДЖЕННЯ ВЛАСНИХ ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ
МАТРИЦІ 15
ДОДАТОК Б ІНСТРУКЦІЯ КОРИСТУВАЧА СИСТЕМИ ЗНАХОДЖЕННЯ
ВЛАСНИХ ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ МАТРИЦІ 16
ДОДАТОК В ГРАФІЧНА ЧАСТИНА 17
ПЕРЕЛІК СКОРОЧЕНЬ
СЛР — Система лінійних рівнянь.
VS — Visual Studio.
ПЗ — Програмне забезпечення.
Max — Максимум.
Min — Мінімум.
WF — Windows Form.
MSVC — Microsoft Visual C++.
API — Application Standart Interface.
MFC — Microsoft Foundation Classes.
ВСТУП
Головною метою курсової роботи є отримання нових знань для
професійної реалізації в житті. Основною задачею є створення додатку для
пошуку власних векторів та власних значень матриці 2х2 та набуття навичок
програмування для подальшої навчальної роботи і професійної діяльності.
Основними критеріями вибору даної теми є вузька спеціалізація даної теми в
основних математичних постулатах, можливість використання усіх навичок
програмування. Також однією з головних причин є програмний запис
математичного алгоритму пошуку, що потребує аналізу методу та його
складових, а також цілковите розуміння системи в цілому. Алгоритм пошуку
власних векторів та власних значень матриці широковідомий у світі завдяки
його оптимізації та простоті розуміння.
Актуальність дослідження полягає втому, що цілий ряд інженерних
задач зводиться до розгляду систем рівнянь, що мають єдиний розв’язок лише
в тому випадку, коли відоме значення деякого вхідного в них параметра. Цей
особливий параметр називається характеристичним, або власним, значенням
системи. Із задачами на власні значення інженер стикається в різних
ситуаціях. При динамічному аналізі механічних систем власні значення
відповідають власним частотам коливань, а власні вектори характеризують
моди цих коливань. При розрахунку конструкцій власні значення дозволяють
визначати критичні навантаження, перевищення яких приводить до втрати
стійкості. Вибір найбільш ефективного методу обчислення власних значень
або власних векторів для даної інженерної задачі залежить від ряду чинників,
таких, як тип рівнянь, число шуканих власних значень і їх характер.
Враховуючи актуальність даного напрямку, в якості теми для курсової
роботи була прийнята тема «Розробка програми, що реалізує пошук власних
векторів та власних значень матриці 2х2» та мова програмування С++, для
реалізації.
1 АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ «ЗНАХОДЖЕННЯ
ВЛАСНИХ ВЕКТОРІВ І ВЛАСНИХ ЗНАЧЕНЬ МАТРИЦІ»

1.1 Теорія, про обрану предметну область.


Історично першим розділом лінійної алгебри був розділ теорії лінійних
рівнянь. Згодом у зв’язку з розв’язанням системи лінійних рівнянь було
введено поняття "визначник" в 1750 році Крамером. У зв’язку з вивченням
лінійних рівнянь та визначників вводиться поняття матриці в 1877 році Г.
Фробеніусом. В кінці 19 століття з’явився новий розділ лінійної алгебри
"Власні значення та власні вектори матриць". Цей розділ має прикладне
значення. Як з’ясувалося, деякі спеціалісти донині цікавляться такою
проблемою лінійної алгебри, як обчислення власних значень та власних
векторів матриць. Ця проблема виникає в багатьох областях математики,
механіки, інженерної справи та геології.[1]
Матриця – це прямокутна таблиця, що складається з m рядків та n
стовпців і елементами якої є дійсні або комплексні числа. Елемент матриці,
який знаходиться на перетині і-го рядка та j-го стовпця, аij. Зазвичай матриці
позначають великими літерами А,В,С,… Інколи матрицю А зручно записувати
у формі (А1,А2,…,Аn), де А1,А2,…,Аn – відповідно 1-й, 2-й і т.д. п-ий стовпець
матриці А.
Матриця називається квадратною (square matrix), якшо кількість її
рядків дорівнює кількості стовпців. Матрицю розмірності 1хп називають
матрицею - рядком (row vector) або просто рядком. Матрицю розмірності тх1
називають матрицею-стовпцем (column vector) або просто стовпцем. Якщо А -
квадратна матриця розмірності пхп, то її елементи {а11,а22,…,апп} утворюють
головну діагональ матриці (main diagonal of matrix), а елементи {а1п,а2,п-
1,…,ап1} — побічну діагональ. Квадратна матриця називається діагональною
(diagonal matrix), якщо всі її елементи, шо не належать головній діагоналі,
дорівнюють нулю. Діагональна матриця називається скалярною (scalar matrix),
якщо всі її елементи, що лежать на головній діагоналі, - однакові. Скалярна
матриця називається одиничною (identity matrix), якщо її головна діагональ
складається з одиниць. Одиничну матрицю будемо позначати через Е.
Матриця називається нульовою (zero matrix), якщо всі її елементи є нулі.
Нульову матрицю позначають через О.
До основних операцій над матрицями належать такі: додавання і
віднімання двох матриць, множення двох матриць, множення числа на
матрицю і транспонування матриці. Операції додавання і віднімання (addition
and subtraction) визначені лише для двох матриць однакової розмірності. Якщо
А і В - матриці однакової розмірності, то (за означенням) елементи сіj матриці
А+В знаходиться за правилом: cij = aij + bij, де aij і bij – відповідні елементи
матриць А і В.
Нехай А – матриця розмірності тхk, а В — матриця розмірності rхп.
Операція множення матриці А на матрицю В визначена у випадку, коли k=r,
тобто кількість стовпців матриці А дорівнює кількості рядків матриці В, і
елементи сij матриці добутку А*В обчислюються за правилом: сij = ai1*b1j +
a21*b2j +…+ aik*bkj, де (ai1, ai2,…, ak1) — і-й рядок матриці А, а (b1j, b2j,…, bkj)
— j-ий стовпець матриці B. Зазначимо, що у випадку коли k=r, розмірність
матриці А*В дорівнює mxn.
Нехай А – довільна матриця розмірності тхп, а λ – довільне число.
Добуток числа λ на матрицю А – це матриця розмірності тхп, яка
позначається через λ*А і елементи якої cij обчислюються за правилом: cij= λaij,
де aij – елементи матриці А.
Нехай – А довільна матриця розмірності тхп. Транспонована (transpose)
матриця позначається через АТ і утворюється з матриці А шляхом заміни
кожного і-го рядка матриці А на і-ий стовпець матриці АТ. Розмірність
матриці АТ дорівнює пхт.
Детермінант (або визначник) — це основна числова характеристика
квадратної матриці.
Для матриці другого порядку детермінант це число що дорівнює a11*a22
– a12*a21. Його позначають через det A або |A|.

Задача про знаходження власних значень і власних векторів матриці

𝐴 = (𝑎11 𝑎12 … 𝑎1𝑛 𝑎21 𝑎22 … 𝑎2𝑛 … … … … 𝑎𝑛1 𝑎𝑛2 … 𝑎𝑛𝑛 )

Зводиться до матричного рівняння

(𝑎11 𝑎12 … 𝑎1𝑛 𝑎21 𝑎22 … 𝑎2𝑛 … … … … 𝑎𝑛1 𝑎𝑛2 … 𝑎𝑛𝑛 ) ∗ (𝑥1 𝑥2 ⋮ 𝑥𝑛 )
= 𝜆(𝑥1 𝑥2 ⋮ 𝑥𝑛 )

Або у розгонутій формі у вигляді системи n лінійних рівнянь з n


невідомими: (*){(𝑎11 − 𝜆)𝑥1 + 𝑎12 𝑥2 + ⋯ + 𝑎1𝑛 𝑥𝑛 = 0 𝑎11 𝑥1 + (𝑎12 − 𝜆)𝑥2 +
⋯ + 𝑎1𝑛 𝑥𝑛 = 0 … … … … … … … … … … … … … … … … … … 𝑎𝑛1 𝑥1 + 𝑎𝑛2 𝑥2 + ⋯ +
(𝑎𝑛𝑛 − 𝜆)𝑥𝑛 = 0

Або у компактній формі det(A-λE)=0. Рівняння det(A-λE)=0 називається


характеристичним рівнянням. Це алгебраїчне рівняння п-го степення з
невідомою λ.
Щоб знайти власні значення і власні вектори матриці А потрібно:
1. Розв’язати характеристичне рівняння det(A-λE)=0 і знайти усі власні
значення λ1, λ2,…, λk.
2. Власне значення λі (і=1,2,…,k) підставити в СЛР (*) і відшукати
ненульові розв’язки. Ці ненульові розв’язки і є власними векторами
що відповідають власному значення λі.[2]

1.2 Постановка задачі

Постановка задачі складається з чотирьох етапів, що являють собою


створення інтерфейсу користувача, запис програмного коду методу,
компонування системи та приведення додатка до релізу.
Три етапи постановки задачі:
1. Створення інтерфейсу користувача.
2. Створення можливості повторного запуску системи без операції
перезапуску програми.
3. Створення тіла програми шляхом запису коду в середовищі
програмування.
Зважаючи на це код повинен бути оптимізований, унікальний, містити
повну реалізацію знаходження власних значень і власних векторів матриці.
Компонування системи полягає у виконанні збірки усіх модулів системи в
одне ціле шляхом компіляції системи та першочерговий запуск усієї системи.
Приведення програмного додатку до релізу полягає в коригуванні системи на
предмет помилок та оптимізацію програми.
2 ПРОЕКТУВАННЯ СИСТЕМИ ЗНАХОДЖЕННЯ ВЛАНИХ ЗНАЧЕНЬ
ТА ВЛАСНИХ ВЕКТОРІВ

2.1 Розробка структури системи знаходження власних значень та


власних векторів.
Структура програми складається з чотирьох модулів: трьох основних і
одного додаткового. Основні модулі включають в себе запис алгоритму
знаходження власних векторів і власних чисел матриці та виконання основних
операцій математичної логіки. Додатковий модуль складається з інтерфейсу
користувача. Перший основний модуль містить в собі систему отримання та
виведення даних, яка складається з операторів введення та виведення
інформації, а також систему перетворення даних у аргументи функції, які
використовуються другим і третім основним модулем. Другий основний
модуль містить в собі алгоритмом знаходження власних значень. Третій
основний модуль містить в собі алгоритм знаходження власних векторів. Дані
модулі будуть представленні у вигляді системи функцій. Схема взаємодії
модулів системи зображена на Рисунку 2.1 та Рисунку В.4 в Додатку В.

Рисунок 2.1 – Схема взаємодії модулів системи.


2.2 Розробка алгоритму функціонування системи знаходження власних
значень та власних векторів.
Алгоритм знаходження власних значень і власних векторів складається з
3 складових. Спочатку потрібно перевірити чи матриця трикутна. Якщо так, то
власні значення лежать на головній діагоналі матриці. Інакше власні значення
є коренями квадратного рівняння . Наступна складова являє собою віднімання
від елементів на головній діагоналі першого власного значення і утворення
СЛР. Третя складова уособлює в собі розв’язання СЛР, тобто знаходження
ненульових розв’язків. Потім повертаємося до другої складової і продовжуємо
до тих пір, поки не використаємо останнє власне значення. Остання складова є
виведення власних значень і відповідних їм власних векторів. Алгоритм
знаходження власних значень і власних векторів зображено на Рисунку 2.2 а
також на Рисунку В.1 в Додатку В.
Рисунок 2.2 – Схема алгоритму знаходження власних значень і власних
векторів.
2.3 Розробка алгоритмів функціонування основних модулів системи
знаходження власних значень і власних векторів.
Перший основний модуль складається з операторів вводу та виводу
тому не потребує опису алгоритму. Другий модуль містить алгоритм
знаходження власних значень. Спочатку потрібно перевірити чи матриця
трикутна якщо так то власні значення лежать на головній діагоналі матриці
інакше власні значення є коренями квадратного рівняння, де другим
коефіцієнтом є сума елементів на головній діагоналі, а вільним членом –
різниця між добутком елементів на головній діагоналі і добутком елементів на
побічній діагоналі. Алгоритм цього модуля зображений на Рисунку 2.3 та на
Рисунку В.2 в Додатку В. Третій модуль містить алгоритм знаходження
власних векторів. Спочатку здійснюється віднімання від елементів на головній
діагоналі першого власного значення і утворення СЛР. Для розв’язку СЛР
спочатку потрібно додати рівняння. Потім знайти більше число (max) і менше
число (min) по модулю. Якщо min не дорівнює нулеві то елементу власного
вектора що відповідає max записуємо одиницю, а елементу що відповідає min
– частку від ділення max взятого з протилежним знаком на min інакше
елементу власного вектора що відповідає min записуємо 1 а елементу що
відповідає max якщо max дорівнює 0 то 1 інакше 0. Продовжувати доти коли
не використаємо останнє власне значення. Алгоритм цього модуля
зображений на Рисунку 2.4. та на Рисунку В.3 в Додатку В.
Рисунок 2.3 – Схема алгоритму другого основного модуля.
Рисунок 2.4 – Схема алгоритму третього основного модуля
3 ПРОГРАМНА РЕАЛІЗАЦІЯ СИСТЕМИ ЗНАХОДЖЕННЯ ВЛАСНИХ
ЗНАЧЕНЬ І ВЛАСНИХ ВЕКТОРІВ МАТРИЦІ
3.1 Обґрунтування вибору мови програмування.
Java— об'єктно-орієнтована мова програмування, випущена компанією
Sun Microsystems у 1995 році.
Java є кросплатформеною мовою програмування. Програма, написана на
мові Java, працюватиме на будь-якій підтримуваній апаратній чи системній
платформі без змін у початковому коді та перекомпіляції. Незалежність від
архітектури можна досягти, компілюючи початковий Java код у байт-код,
який являє собою спрощені машинні команди. Основна перевага
використання байт-коду — це портативність. Тим не менш, додаткові витрати
на інтерпретацію означають, що інтерпретовані програми будуть майже
завжди працювати повільніше, ніж скомпільовані у машинний код, і саме тому
Java одержала репутацію «повільної» мови. Стандартні бібліотеки
забезпечують загальний спосіб доступу до таких платформозалежних
особливостей, як обробка графіки, багатопотоковість та роботу з мережами.
Синтаксис було в значній мірі запозичено із С та С++. З основу взято
модифіковану об'єктну модель С++. Було автоматизовано роботу з кодом.
Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути
через помилки програміста та полегшено сам процес розробки об'єктно-
орієнтованих програм. У Java всі об'єкти є похідними від головного об'єкта
(він називається просто Object), з якого вони успадковують базову поведінку і
властивості. Хоча у C++ вперше стало доступне множинне успадкуваннях, але
у Java можливе тільки одинарне успадкування. В Java існує система винятків
або ситуацій, коли програма зустрічається з неочікуваними труднощами,
наприклад:

● операції над елементом масиву поза його межами або над порожнім
елементом
● читання з недоступного каталогу або неправильної адреси URL
● ввід недопустимих даних користувачем

Одна з особливостей концепції віртуальної машини полягає в тому, що


помилки (виключення) не призводять до повного краху системи. Проте мову
програмування Java не рекомендується використовувати в системах, збій в
роботі яких може призвести до смерті, травм чи значних фізичних ушкоджень
(наприклад, програмне забезпечення для керування атомними
електростанціями, польотами, систем життєзабезпечення чи систем
озброєння) через ненадійність програм, написаних на мові програмування
Java. Java використовує автоматичний збирач сміття для керування пам'яттю
під час життєвого циклу об'єкта. Проте, витік пам'яті все ж може статися,
якщо код, написаний програмістом, має посилання на вже непотрібні об'єкти,
наприклад на об'єкти, що зберігаються у діючих контейнерах.
C#— об'єктно-орієнтована мова програмування з безпечною системою
типізації для платформи.NET. Розроблена Андерсом Гейлсбергом, Скотом
Вілтамутом та Пітером Гольде при фірмі Microsoft.
Синтаксис C# близький до С++ і Java. Мова має строгу статичну типізацію,
підтримує поліморфізм, перевантаження операторів, вказівники на функції-
члени класів, атрибути, події, властивості, винятки, коментарі у форматі XML.
C++ (Сі-плюс-плюс) — мова програмування високого рівня з
підтримкою декількох парадигм програмування: об'єктно-орієнтованої,
узагальненої та процедурної. Розроблена Б'ярном Страуструпом в AT&T Bell
Laboratories [4]. У 1990-х роках С++ стала однією з найуживаніших мов
програмування загального призначення. Мову використовують для
системного програмування, розробки програмного забезпечення, написання
драйверів, потужних серверних та клієнтських програм, а також для розробки
розважальних програм таких як відео ігри. С++ суттєво вплинула на інші,
популярні сьогодні, мови програмування: С# та Java.
При створенні С++ прагнули зберегти сумісність з мовою С. Більшість
програм на С справно працюватимуть і з компілятором С++. С++ має
синтаксис, заснований на синтаксисі С.
До того, як в C++ з'явився механізм роботи з виключеннями, goto [5]
активно використовувався для виходу з циклів у виняткових ситуаціях. У Java
оператора goto немає. У ній є зарезервоване ключове слово goto, але це
зроблено лише щоб уникнути можливої плутанини - для того, щоб утримати
програмістів від його використання.
Таблиця 3.1 – Порівняння мов програмування
Об’єк
Мови тно
Передбачене Impera Functio Proced Generi Reflect
програмуван орієн Standardized?
використання tive nal ural c ive
ня тован
е
Application,
business, client- De facto standard
Java side, general, + + + + via Java Language
server-side, Specification
Web
Application,
RAD, business,
client-side,
C# + + + + + 2000, ECMA, ISO
general, server-
side, Web,
Robotics

1998, ISO/IEC
Application,
С++ + + + + + 1998, ISO/IEC
system
2003, ISO/IEC
2011

C++ отримав в спадок від C звичайні типи даних останнього. Ці типи


служать для представлення цілих і дійсних чисел різних розмірів і точності.
До нещастя, реальний діапазон і точність цих типів коливається залежно від
конкретної реалізації транслятора. Поведінка коду, який транслюється і
виконується на одній машині, може відрізнятися при зміні платформи. Різні
транслятори C++ можуть резервувати під цілий тип 16, 32 або 64 бита залежно
від розрядності машинного слова.
Таким чином, аналіз результатів багатокритеріального порівняння, які
відзначено в Таблиці 3.1 мов показує , що для розробки програми
оптимальною є мова програмування С++.

3.2 Основні оператори мови програмування С++.


Змінна — це іменована область пам’яті, у якій зберігаються дані
визначеного типу. Такими типами є:
● Цілочисельні типи даних:
short int, unsigned short int, int, unsigned int, long, unsigned long.
● Типи даних з плаваючою комою (дійсні типи):
float, double, long double.
● Символьний тип даних:
char (signed char), unsigned char, wchar_t.
● Логічний тип даних:
bool.
Оператори дозволяють виконувати різні дії над змінними, константами і
виразами.
● Арифметичні оператори: додавання +, віднімання -, множення *,
ділення / і остача від ділення %.
● Логічні оператори: І &&, АБО ||, НЕ !.
● Оператори порівняння: дорівнює ==, не дорівнює !=, більше >,
більше рівне >=, менше < і менше рівне <=.
● Оператори вибору: if, else I switch.
Оператори вибору дозволяють прийняти програму рішення,
грунтуючись на істинність або хибність умови. Якщо умова істинно (т. ч.
дорівнює true) значить, оператор в тілі if виконується, після чого виконується
наступний по порядку оператор. Якщо умова помилково (т. ч. дорівнює false)
значить, оператор в тілі if не виконується (ігнорується або пропускається) і
відразу ж виконується наступний по порядку оператор. Умова , що
перевіряється може бути будь-яким логічним вираженням. Логічні вирази
можуть бути утворені операціями рівності і відносини. Оператор if else
дозволяє визначити програмісту дію, коли умова істинна і коли умова
помилкова. Тоді як if дозволяв визначити дію при істинній умові. Синтаксис
оператора вибору if else:
if(/*умова*/){/* дії при істинній умові*/ }
else{/* дії при помилковій умові*/}

На початковому етапі аналізується вираз чи змінна. Далі здійснюється


перехід до тієї гілки програми, для якої значення змінної або виразу співпадає
з вказаним константним виразом. Далі виконується оператор або група
операторів поки не зустрінеться зарезервоване слово break або фігурна
скобочка. Якщо значення змінної або виразу не збігається ні з одним
константним виразом, то здійснюється перехід до гілки програми містить
зарезервоване слово default. Після чого виконується оператор або група
операторів даної гілки. Форма запису оператора множинного вибору:
switch (/*змінна чи вираз*/)
{
case /*константий вираз1/*:
{
/*группа операторів*/;
break;
}
case /* константий вираз2*/:
{
/*группа операторів*/;
break;
}
//. . .
default:
{
/*группа операторів*/;
}
}
● Циклічні оператори: for, while, do while.
Цикл – це багаторазове виконання певних операторів. Тіло циклу буде
виконуватися доти, поки умова буде істинною.
for(вираз1, вираз2, вираз3)
{оператор або група операторів}

Вираз 1 – оголошення (і) або ініціалізація, раніше оголошеної, змінної-


лічильника, яка відповідатиме за істинність умови в циклі for. Змінна-
лічильник завжди повинна мати цілочисельний тип даних. Якщо змінна була
оголошена в циклі, по завершенні циклу ця змінна буде знищена. Вираз 2 – це
умова продовження циклу for, вона перевіряється на істинність. Вираз 3
змінює значення змінної-лічильника. Без виразу3 цикл вважається
нескінченним, так як зміна вмісту змінної count виконуватися не буде, і якщо
спочатку умова була істинна, то цикл буде нескінченний, інакше програма
навіть не увійде в цикл. Вирази 1, 2, 3 відокремлюються один від одного
обов'язковим розділовим знаком, крапкою з комою. Тіло циклу обрамлюється
фігурними дужками, якщо тіло циклу складається з одного оператора ,то
фігурні дужки не потрібні.
Оператор циклу while або цикл while – цикл, повторює одну і ту ж дію,
поки умова продовження циклу while залишається істиною.
while (/*умова продовження циклу while*/)
{
/*блок операторів*/;
/*керування умовою*/;
}
Умова продовження циклу має бути істинною true, як тільки умова стала
хибною, виконується вихід з циклу. Також як і в умовних операторах вибору,
фігурні скобочки можуть опускатися в тому випадку, якщо тіло циклу – це
один оператор. Але як правило в циклі виконується декілька операторів, так як
крім виконання корисної дії необхідно робити умову циклу while хибною,
інакше цикл буде нескінченним, а це, в свою чергу, приведе до зациклення
програми. Цикл do while відрізняється від циклу while тим, що в do while
спочатку виконується тіло циклу, а потім перевіряється умова продовження
циклу. Таким чином, якщо умова do while хибна, то хоча б один раз блок
операторів в тілі циклу do while виконається. В підсумку do while
відрізняється від циклу while структурою.
do // початок циклу do while
{
/*блок операторів*/;
}
while (/*умова виконання циклу*/);

● Оператори continue і break.


Оператор continue використовується тільки в циклах. В операторах for,
while, do while, оператор continue виконує пропуск решти коду тіла циклу і
переходить до наступної ітерації циклу.
У тілі оператора множинного вибору switch оператор break переривав
виконання оператора switch. Коли оператор break виконується в циклі, то
достроково переривається виконання оператора циклу, і управління
передається наступному оператору після циклу.

3.3 Особливості середовища в якому буде розроблятися система.


Microsoft Visual C++ (MSVC) — інтегроване середовище розробки
програмного забезпечення на мові C++, розроблена фірмою Microsoft.
Постачається або як частина комплекту Microsoft Visual Studio, або окремо у
вигляді безкоштовного функціонально обмеженого комплекту Visual C++
Express Edition.Visual C++.NET підтримує розробку застосування як на
Managed C++, так і на звичайному С++, і тим самим дозволяє генерувати код
як для платформи .NET Framework, так і для виконання в середовищі «чистої»
Windows. У цьому відношенні Visual C++.NET є унікальним серед інших
мовних засобів, що надаються середовищем Visual Studio, оскільки ані Visual
Basic .NET, ані Visual J# не здатні генерувати код для чистого Win32, на
відміну від попередніх версій .
В першу чергу Visual C++ — це компілятор C++, але це також і
середовище, компоненти якого, взаємодіючи один з одним, спрощують процес
розробки прикладних програм. Середовище Visual C++ пропонує великі
можливості для програмування Windows-прикладних програм.
Найхарактернішою його компонентою є бібліотека основних класів Microsoft
(Microsoft Foundation Classes — MFC). Великий набір класів С++ інкапсулює
основну частину API (Application Standart Interface) і пропонує могутню
основу для написання типових прикладних програм.
Компілятор Visual C++ містить багато нових інструментальних засобів і
поліпшених можливостей для створення Windows — програм.
Прикладні програми Windows прості у використанні, але створювати їх
досить складно. Щоб полегшити програмістам роботу, фахівці Microsoft
розробили бібліотеку Microsoft Foundation Classes — MFC. Використовуючи
готові класи C++, можна набагато швидше і простіше розв'язувати багато
задач. Бібліотека MFC істотно полегшує програмування в середовищі
Windows. Ті, хто володіє достатнім досвідом програмування на C++, можуть
допрацьовувати класи або створювати нові, похідні від існуючих.
Класи бібліотеки MFC використовуються як для керування об'єктами
Windows, так і для розв'язання певних загальносистемних задач. Наприклад, в
бібліотеці є класи для керування файлами, рядками, часом, обробкою
виключень і інші. По суті, в MFC представлені практично всі функції
WindowsAPI. У бібліотеці є засоби обробки повідомлень, діагностики помилок
й інші засоби, звичні для прикладних програм Windows. MFC має такі
переваги:
Представлений набір функцій і класів відрізняється логічністю і
повнотою. Бібліотека MFC відкриває доступ до всіх часто використовуваних
функцій Windows API, включаючи функції управління вікнами прикладних
програм, повідомленнями, елементами управління, меню, діалоговими
вікнами, об'єктами GDI (Graphics Device Interface — інтерфейс графічних
пристроїв), такими як шрифти, кисті, пера і растрові зображення, функції
роботи з документами тощо.
Функції MFC легко вивчати. Фахівці Microsoft доклали всі зусилля для
того, щоб імена функцій MFC і пов'язаних з ними параметрів були
максимально близькі до їхніх еквівалентів з Windows API. Завдяки цьому
програмісти легко зможуть розібратися в їхньому призначенні.
Програмний код бібліотеки досить ефективний. Швидкість виконання
прикладних програм, заснованих на MFC, буде приблизно такою ж, як і
швидкість виконання прикладних програм, написаних з використанням
стандартних функцій Windows API, а додаткові витрати оперативної пам'яті
будуть досить незначними.
MFC містить засоби автоматичного керування повідомленнями.
Бібліотека MFC усуває необхідність в організації циклу обробки повідомлень
поширеного джерела помилок в Windows — програмах. У MFC передбачений
автоматичний контроль за появою кожного повідомлення.
MFC дозволяє організувати автоматичний контроль за виконанням
функцій. Ця можливість реалізується за рахунок того, що можна записувати в
окремий файл інформацію про різні об'єкти і контролювати значення змінних-
членів об'єкта в зручному для розуміння форматі.
MFC має чіткий механізм обробки виняткових ситуацій. Бібліотека MFC
була розроблена так, щоб тримати під контролем появу таких ситуацій. Це
дозволяє об'єктам MFC відновлювати роботу після появи помилок типу
«outofmemory» (брак пам'яті), неправильного вибору команд меню або
проблем із завантаженням файлів або ресурсів.
MFC забезпечує динамічне визначення типів об'єктів. Це надзвичайно
потужний програмний засіб, що дозволяє відкласти перевірку типу динамічно
створеного об'єкта до моменту виконання програми. Завдяки цьому можна
вільно маніпулювати об'єктами, не піклуючись про попередній опис типу
даних. Оскільки інформація про тип об'єкта повертається під час виконання
програми, програміст звільняється від цілого етапу роботи, пов'язаного з
типізацією об'єктів.
MFC може використовуватися спільно з підпрограмами, написаними на
мові С++. Важливою особливістю бібліотеки MFC є те, що вона може
«співіснувати» з прикладними програмами, заснованими на Windows API. У
одній і тій же програмі програміст може використовувати класи MFC і
викликати функції Windows API. Така прозорість середовища досягається за
рахунок узгодженості програмних позначень в двох архітектурах. Іншими
словами, файли заголовків, типи і глобальні константи MFC не конфліктують
з іменами з Windows API. Ще одним ключовим моментом, що забезпечує таку
взаємодію, є узгодженість механізмів управління пам'яттю.

3.4 Реалізація системи знаходження власних значень і власних векторів.


Реалізація системи знаходження власних значень і власних векторів
складається з чотирьох модулів. Перший модуль відповідає за інтерфейс
користувача, другий — за введення та виведення даних, третій модуль
знаходить власні значення матриці, а четвертий модуль обробляючи дані
отримані в третьому модулі знаходить власні вектори.
Перший модуль потрібен для створення інтерфейсу користувача. Він
являє собою Windows Forms. Windows Form — це форма, що автоматично
генеруються конструктором форм Visual Studio. Дана форма складаються з
label-ів, textbox-ів, button та властивостей форми. Label потрібний для
розміщення тексту на вікні програми. Textbox-и це поля для введення даних
матриці. Так як матриця квадратна розмірності 2х2, у формі чотири textbox-и.
Button — кнопка, для запуску роботи програми, що виконує розрахунок даних
слідуючи етапам виконання програми. Властивості форми визначають розмір,
колір, назву та її вміст.
Другий модуль відповідає за введення даних в поля на вікні програми та
їх вивід після обрахування результатів. Спочатку користувачем заповнюються
textbox-и. Для кожного елементу матриці призначено свій textbox. При
натисканні кнопки «Розрахувати» дані обробляються за допомогою vlas_vector
та виводяться в label-и. Label1 та label3 призначені для виводу власних
векторів, а label2 та label4 для виводу власних значень.
Третій модуль відповідає за знаходження власних значень матриці.
Власні значення розраховуються відповідно до сталого алгоритму. Розрахунок
власних значень відбувається у функції vlas_zn лістинг якої можна побачити в
Додатку А. За допомогою оператора if функція truangular_matrix лістинг якої
можна побачити в Додатку А виконує перевірку чи матриця є трикутною.
Якщо дана матриця трикутна, то елементи головної діагоналі є власними
векторами матриці і записуються в масив vlas_znach. Якщо матриця не є
трикутною, то програма звертається до функції kvad лістинг якої можна
побачити в Додатку А, що обчислює квадратне рівняння . Таким чином
знаходять власні значення і аналогічно записуються в масив vlas_znach.
Обробляючи дані отримані в третьому модулі четвертий модуль
знаходить власні вектори. Для цього виконується функція vlas-vector лістинг
якої можна побачити в Додатку А. На першому етапі знаходження власних
векторів створюється прототип введеної матриці що зосереджений в функції
prot лістинг якої можна побачити в Додатку А, за участю якого будуть
виконуватися наступні дії. Від прототипу матриці віднімаємо по черзі два
власних значення. Умовно створюється дві системи рівнянь які віднімаються
одна від одної. З отриманих даних виконується пошук мінімального та
максимального елемента за допомогою функцій min_el_row, max_el_row
лістинг яких можна побачити в Додатку А та запам’ятовуються індекси. Далі
відбувається розгалуження: якщо мінімальний елемент дорівнює нулю то
йому присвоюється одиниця і продовжується перевірка максимального
елемента. Якщо даний елемент дорівнює нулю то йому присвоюється
одиниця, інакше — нуль. Відповідно до першого розгалуження, якщо
мінімальний елемент не дорівнює нулю то максимальному елементу
присвоюється одиниця , а мінімальному результат частки максимального
елементу взятого з протилежним знаком на мінімальний елемент. Відповідним
чином виводяться власні вектори даної матриці.
3.5 Тестування розробленої системи знаходження власних значень та
власних векторів.
Тестування розробленої системи складається з 9 етапів:
● Перший етап тестування — тестування створених полів для вводу
елементів матриці 2х2. З Рисунку 3.1 бачимо, що поля для введення
елементів матриці створено успішно, і користувач має можливість
ввести потрібні дані.

Рисунок 3.1 – Поля для введення елементів матриці.


● Другий етап тестування — це перевірка програмою, чи введена матриця
трикутна. Трикутна матриця — квадратна матриця, всі елементи якої
нижче або вище від головної діагоналі дорівнюють нулю. Коли матриця
трикутна елементи головної діагоналі є її власними значеннями.
Перевіряючи введені елементи програма визначає що матриця не є
трикутною. В такому випадку переходимо до третього етапу.
● Третій етап тестування — це тестування на правильність рішення
квадратного рівняння. Програма знаходить корені квадратного рівняння.
Дані корені є власними значеннями матриці.
● Четвертий етап тестування — тестування виведення власних значень
введеної матриці. Пройшовши попередні три етапи тестування та
перевіривши їх на правильність програма виводить інформацію про h1
та h2 — власні значення матриці. На Рисунку 3.2 проілюстровано
правильність виводу.
Рисунок 3.2 – Виведення власних значень матриці.
● П’ятий етап тестування. Створюється прототип введеної функції. Далі
програма віднімає від елементів головної діагоналі створеного
прототипу власні значення. Спочатку віднімається перше, а потім друге
власне значення. Даний етап потрібен для створення систем рівнянь.
Створивши системи рівнянь переходимо до шостого етапу.
● Шостий етап тестування. Створивши системи лінійних рівнянь потрібно
додати рівняння між собою. Додавши системи лінійних рівнянь та
виконавши вручну перевірку роботи програми пересвідчуємось, що
програма обраховує п’ятий та шостий етапи без помилок.
● Сьомий етап тестування — це проміжний етап тестування, що потрібен
для знаходження мінімального та максимального елемента. Знайшовши
даний елемент програма запам’ятовує його індекс.
● Восьмий етап тестування — це остаточний етап тестування, що визначає
власні значення системи. Дана дія відбувається наступним чином: якщо
мінімальний елемент дорівнює нулю то йому присвоюється одиниця і
продовжується перевірка максимального елемента. Якщо максимальний
елемент дорівнює нулю то йому присвоюється одиниця, інакше — нуль.
Відповідно до першого розгалуження, якщо мінімальний елемент не
дорівнює нулю то максимальному елементу присвоюється одиниця , а
мінімальному результат частки максимального елементу взятого з
протилежним знаком на мінімальний елемент. Протестувавши даних
етап вручну пересвідчуємось, що програма знаходить власні вектори
вірно.
● Дев’ятий етап тестування — кінцевий етап тестування що перевіряє
виведення даних Х1 та Х2, що є власними векторами матриці. На
Рисунку 3.3 проілюстровано, що власні вектори матриці виведено
правильно.

Рисунок 3.3 – Виведення власних векторів матриці.


Отже, програму знаходження власних векторів та власних значень
успішно протестований. В результаті тестування помилок під час
функціонування не виявлено.
ВИСНОВКИ
В курсовій роботі розроблено програму для знаходження власних
значень і власних векторів матриці розмірності 2х2. Програму було
розроблено з використанням мови програмування С++ та програмного
середовища Microsoft Visual Studio 2013. . Програмне забезпечення включає в
себе можливість введення матриці 2х2, знаходження власних значень матриці,
складання характеристичного рівняння і знаходження власних векторів
матриці. Ідея роботи може бути використана в різних напрямах під час
навчання. Наприклад: учнями старшої школи, студентами вищих навчальних
закладів та викладачами вищої математики для перевірки правильності
рішення прикладу.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Енциклопедія сучасної України. [Електронний ресурс] – Режим доступу:
http://esu.com.ua/search_articles.php?id=55537.
2. Лінійна алгебра. Векторні та евклідові простори. Лінійні оператори :
навчальний посібник / А.А.Бараковська, В.Д.Дереч. – Вінниця :
ВНТУ,2016. – 120с.
3. Страуструп Б. Язык программирования С++. Специальное издание, –
Перев. с англ. – М.: Бином, 2011. - 1136 с.
4. Буч Г., Рамбо Д., Якобсон И. Язык UML. Руководство пользователя. 2-е
изд.: Пер. с англ. Мухин Н. – М.: ДМК Пресс, 2006. – 496 с.: ил.
5. Петзольд Ч. Программирование для Windows 95, том 1. – Пер. с анг. –
СПб.: BHV – Санкт-Петербург, 1997. – 495с., ил.
6. CppStudio . [Електронний ресурс] – Режим доступу:
http://cppstudio.com/uk/cat/274/.
ДОДАТКИ
ДОДАТОК А
ЛІСТИНГ ПРОГРАМНОЇ РЕАЛІЗАЦІЇ ОСНОВНИХ МОДУЛІВ
СИСТЕМИ ЗНАХОДЖЕННЯ ВЛАСНИХ ЗНАЧЕНЬ І ВЛАСНИХ
ВЕКТОРІВ
Truangular_matrix — перевірка чи матриця є трикутною:
bool truangular_matrix(double **a, int n){
for (size_t i = 0; i < n; i++)
{
for (int j = n - 1; j >= 0; j--)
{
if (a[i][j] == 0)
{
return 1;
}
}
}
return 0;
}
Kvad — розв’язок квадратного рівняння:
void kvad(double **a, double *vlas_znach, int n){
int j = n - 1;
double b = 0, c = 1, c1 = 1, d;
for (size_t i = 0; i < n; i++)
{
b += a[i][i];
c *= a[i][i];
}
for (size_t i = 0; i < n; i++)
{
c1 *= a[j][i];
j--;
}
c = c - c1;
d = (-b)*(-b) - 4 * c;
if (d >= 0)
{
vlas_znach[0] = (b - sqrt(d)) / 2;
vlas_znach[1] = (b + sqrt(d)) / 2;
}
}
Prot — створення прототипу матриці:
void prot(double **a, double **a1, int n) {
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < n; j++)
{
a1[i][j] = a[i][j];
}
}
}
Min_el_row — пошук мінімального значення:
int min_el_row(double **a1, int n, int k){
int index = 0, min;
min = abs(a1[k][0]);
for (size_t i = 1; i < n; i++)
{
if (min > abs(a1[k][i]))
{
min = abs(a1[k][i]);
index = i;
}
}
return index;
}
Max_el_row — пошук максимального значення:
int max_el_row(double **a1, int n, int k){
int index = 0, max;
max = abs(a1[k][0]);
for (size_t i = 1; i < n; i++)
{
if (max <= abs(a1[k][i]))
{
max = abs(a1[k][i]);
index = i;
}
}
return index;
}
Vlas_zn — розрахунок власних значень:
void vlas_zn(double **a, double *vlas_znach, int n){
if (truangular_matrix(a, n) == 1)
{
for (size_t i = 0; i < n; i++)
{
vlas_znach[i] = a[i][i];
}
}
else kvad(a, vlas_znach, n);
}
Vlas-vector — розрахунок власних векторів:
void vlas_vector(double **a1, double **a, double **vl_vector, double *vlas_znach, int n){
int min = 0, max = 0, i = 0;
vlas_zn(a,vlas_znach,n);
for (size_t i1 = 0; i1 < n; i1++)
{
prot(a, a1, n);
matrix_vl(a1, vlas_znach, n, i1);
matrix_equat(a1, n);
max = max_el_row(a1, n, i);
min = min_el_row(a1, n, i);

if (a1[i][min] == 0)
{
vl_vector[i1][min] = 1;
if (a1[i][max] == 0) vl_vector[i1][max] = 1;
else vl_vector[i1][max] = 0;
}
else
{
vl_vector[i1][max] = 1;
vl_vector[i1][min] = (-a1[i][max]) / a1[i][min];
}
}
ДОДАТОК Б
ІНСТРУКЦІЯ КОРИСТУВАЧА СИСТЕМИ ЗНАХОДЖЕННЯ
ВЛАСНИХ ЗНАЧЕНЬ І ВЛАСНИХ ВЕКТОРІВ
Інструкція призначення для користувача, що використовує програму для
знаходження власних значень і власних векторів матриці.
Для того, щоб запустити програму у користувача є два шляхи. У
першому випадку потрібно відкрити папку, що знаходиться за адресою
E:\програмування\visuail studio\Project1. В даній папці запустити файл
Project1.sln як це показано на Рисунку Б.1.

Рисунок Б.1 – Перший шлях запуску програми (1).


Запустивши файл, його буде відкрито в програмному середовищі Visual
Studio. Перед користувачем з’явиться код даної програми та буде можливість
його відкомпілювати. Для того щоб відкомпілювати файл та почати
користуватися програмою знаходження власних векторів та власних значень
матриці потрібно натиснути на кнопку Локальный отладчик Windows, як це
показано на Рисунку Б.2 або скористатись набором клавіш Ctrl+F5.

Рисунок Б.2 – Перший шлях запуску програми (2).


Другий шлях запуску програми: відкрити папку Debug, що знаходиться
за адресою E:\програмування\visuail studio\Project1\Debug та запустити exe-
файл під назвою Project1.exe. Ілюстрацію даної дії можна побачити на Рисунку
Б.3.

Рисунок Б.3 – Другий шлях запуску програми.


Виконавши запуск програми першим або другим шляхом перед
користувачем відкриється програма знаходження власних значень та власних
векторів квадратної матриці розмірності 2х2. Ілюстрацію даної дії бачимо на
Рисунку Б.4.

Рисунок Б.4 – Вікно програми знаходження власних значень та власних


векторів.
Програма пристосована до того, щоб її міг використовувати користувач,
з мінімальними знаннями вищої математики. Тому її інтерфейс є досить
легким у розумінні. Все що необхідно користувачеві — ввести елементи
матриці у відповідні комірки, як це зображено на Рисунку Б.5.
Рисунок Б.5 – Введення даних для подальшого розрахунку.
Ввівши дані, для того щоб отримати відповідь користувачеві потрібно
натиснути кнопку Розрахувати, як це показано на Рисунку Б.6.

Рисунок Б.6 – Розрахунок.


Натиснувши кнопку Розрахувати користувач побачить результат роботи
програми в такому вигляді як це зображено на Рисунку Б.7.

Рисунок Б.7 – Результат роботи програми.


ДОДАТОК В
ГРАФІЧНА ЧАСТИНА

Рисунок В.1 – Схема алгоритму знаходження власних значень і власних


векторів.
Рисунок В.2 – Схема алгоритму другого основного модуля.
Рисунок В.3 – Схема алгоритму третього основного модуля.
Рисунок В.4 – Схема взаємодії модулів системи.

You might also like