Академический Документы
Профессиональный Документы
Культура Документы
КУРСОВАЯ РАБОТА
Магнитогорск, 2022
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«МАГНИТОГОРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ИМ. Г.И. НОСОВА»
(ФГБОУ ВО «МГТУ ИМ. Г.И. НОСОВА»)
2
Введение
3
Содержание
Введение
1. Теоретическое обоснование шаблонного класса «Матрица»
1.1. История матриц
1.2. Функции и операции с матрицами
2. Практическая реализация шаблонного класса «Матрица»
2.1. Описание работы программы
2.2. Пример работы программы
Заключение
Список литературы
Приложение
4
1.Теоретическое обоснование шаблонного класса «Матрица»
5
3) Алгебраическое дополнение. Если минор матрицы по i-ой строке и j-го
столбца обозначить за Mij, тогда алгебраическим дополнением будет
число Aij = (-1)i+jMij
4) Определитель. Сумма элементов строки (столбца), каждый из которых
умножается на его соответствующее алгебраическое дополнение.
5) Обратная матрица. Это транспонированная матрица из алгебраических
дополнений разделенная на определитель.
6
2.Практическая реализация структуры данных «Матрица».
void clear();
T*& operator[](size_t);
public:
Matrix(size_t, size_t, const T& = T());
Matrix(const Matrix&);
~Matrix();
Matrix transposition();
double determinant();
double determinantAlgebraic();
double determinantGauss();
7
Созданный контейнерный класс имеет три поля: два беззнаковых
числа и двойной указатель типа Т, соответственно, размеры матрицы и
двумерный массив, в котором хранятся её элементы. В классе реализованы
два конструктора. В первом один параметр по умолчанию (им заполняются
все ячейки матрицы) и два беззнаковых числа – размеры матрицы, в данном
конструкторе создается двумерный динамический массив. Второй –
конструктор копирования. Прописан и деструктор, который очищает
созданный двумерный динамический массив.
8
если размер квадратной разницы больше 2. Плюсом является его
точность, поскольку потерь при делении чисел не возникает.
Расчет определителя методом Гаусса. По результатам тестов, данный
метод работает намного быстрее предыдущего, однако, точность
начинает падать при размерах матрицы выше 10. Его сложность
равняется О(n3).
9
элементов – время расчета определителя методом алгебраического
дополнения и методом Гаусса соответственно определенное количество раз.
10
В качестве второго примера выведем время расчета определителя
1000 раз матрицы 8х8 для каждого алгоритма в миллисекундах. Ниже
представлены выходные данные.
11
Заключение
12
Список литературы
1. Березкина Э. И. Математика древнего Китая / Отв. ред. Б. А.
Розенфельд. — М.: Наука, 1980. — С. 173-206. — 312 с.
2. Даан-Дальмедико А., Пейффер Ж. Пути и лабиринты. Очерки по
истории математики: Пер. с франц. — М.: Мир, 1986. — С. 397.
13
Приложение
main.cpp
#include <iostream>
#include "Utils.h"
#include "Matrix.h"
int main() {
srand(time(NULL));
setlocale(LC_ALL, "Russian");
TestMatrix test;
try {
test.testMath(1000);
}
catch (MyException& ex) {
std::cout << ex.what();
}
matrix.h
#pragma once
#ifndef MATRIX_H
#define MATRIX_H
#include <iostream>
#include <iomanip>
#include <math.h>
class MyException : public std::exception {
public:
14
MyException(const char* msg) : exception(msg) {}
};
void clear();
T*& operator[](size_t);
public:
Matrix(size_t, size_t, const T& = T());
Matrix(const Matrix&);
~Matrix();
Matrix transposition();
15
double determinant();
double determinantAlgebraic();
double determinantGauss();
if (rows == 1) {
return matrix[0][0];
}
else if (rows == 2) {
return matrix[0][0] * matrix[1][1] - matrix[0]
[1] * matrix[1][0];
}
else {
double d = 0;
for (size_t k = 0; k < rows; k++) {
Matrix<T> b(rows - 1, rows - 1);
for (size_t i = 1; i < rows; i++) {
for (size_t j = 0; j < rows; j++) {
if (j == k) {
continue;
}
else if (j < k) {
b(i - 1, j) = matrix[i][j];
}
else {
b(i - 1, j - 1) = matrix[i][j];
20
}
}
}
d += (k % 2 == 0 ? 1 : -1) * matrix[0][k] *
b.determinantAlgebraic();
}
return d;
}
}
template <typename T> double
Matrix<T>::determinantGauss() {
if (rows != cols) {
MyException exception("Non-square matrix");
throw exception;
}
size_t n = this->rows - 1;
Matrix<T> tmp(n, n);
#endif
Utils.h
#pragma once
#include <iostream>
#include <time.h>
#include "Matrix.h"
class Timer {
private:
clock_t startTime;
clock_t endTime;
23
public:
Timer();
void start();
void stop();
double getTimeMilliSec();
};
class TestMatrix {
private:
bool compare(Matrix<double>, Matrix<double>);
void rnd(Matrix<double>*);
public:
bool testMath(long long);
double* determinantTime(int, long long);
bool determinantAccuracy(int, long long);
};
Utils.cpp
#include "Utils.h"
Timer::Timer() {
startTime = -1;
endTime = -1;
}
void Timer::start() {
startTime = clock();
endTime = -1;
}
void Timer::stop() {
endTime = clock();
}
double Timer::getTimeMilliSec()
{
return (double)(endTime - startTime) * 1000 /
CLOCKS_PER_SEC;
}
return true;
}
void TestMatrix::rnd(Matrix<double>* myMatrix) {
for (size_t i = 0; i < myMatrix->getRows(); i++) {
for (size_t j = 0; j < myMatrix->getCols(); j+
+) {
(*myMatrix)(i, j) = ((double)rand() /
RAND_MAX) * 10 - 5;
}
}
}
timer->start();
m1->determinantAlgebraic();
timer->stop();
time[0] += timer->getTimeMilliSec();
timer->start();
m1->determinantGauss();
timer->stop();
time[1] += timer->getTimeMilliSec();
}
return time;
}
26