Приведение уравнения квадратичной формы к каноническому виду

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Математическое программирование (линейное, динамическое)
  • 20 20 страниц
  • 17 + 17 источников
  • Добавлена 23.12.2023
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
Оглавление
Глава 1. Анализ задания и алгоритмы решения………………………………...2
1.1. Текст задания……………………………………………………………….2
1.2. Собственные вектора и собственные значения линейного оператора….2
1.3. Особенности алгоритмов…………………………………………………..3
1.4. Сравнение алгоритмов……………………………………………………..8
Глава 2. Практическая реализация алгоритма…………………………………9
2.1. Выбор структуры данных для хранения матриц………………………….9
2.2. Особенности реализации алгоритма……………………………………….10
2.3. Результаты экспериментов (результаты запуска кода)…………………...13
Заключение……………………………………………………………………….15
Список литературы………………………………………………………………16
Приложение………………………………………………………………………17

Фрагмент для ознакомления

n}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){B[i][j] = A[i][j];}for (int j = n; j < 2 * n; j++){if (i == j - n) B[i][j] = 1;}}for (int i = n - 1; i > 0; i--){if (B[i - 1, 0]>= B[i, 0]) continue;for (int j = 0; j < 2 * n; j++){float temp = B[i][j];B[i][j] = B[i - 1][j];B[i - 1][j] = temp;}}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i == j) continue;float temp = B[j][i] / B[i][i];for (int k = 0; k < 2 * n; k++){B[j][k] -= B[i][k] * temp;}}}for (int i = 0; i < n; i++){float temp = B[i][i];for (int j = 0; j < 2 * n; j++){B[i][j] = B[i][j] / temp;}}auto C = std::make_shared< std::shared_ptr[] >(n);for (size_t i = 0; i < n; i++) {C[i]= std::make_shared(n);}for (int i = 0; i < n; i++){for (int j = n; j < 2 * n; j++){C[i][j - n] = B[i][j];}}return C;}public: static std::shared_ptr[]> Sqrt(intn, std::shared_ptr[]> A){std::shared_ptr[]> B = Duplicate(n, A);for (int i = 0; i < n; i++){if (A[i][i] <= 0) { thrownew std::exception("Divide by zero"); };B[i][i] = (float)std::sqrt(A[i][i]);}return B;}public: static std::string toString(introwCount, intcolumnCount, std::shared_ptr[]> A){std::string text = "";for (int i = 0; i < rowCount; i++){if (i > 0) text +=',';text +='{';for (int j = 0; j < columnCount; j++){if (j > 0) text +=',';text +=A[i][j];}text +='}';}return text;}// распечаткавектораpublic: static std::string toString(intn, std::shared_ptr a){std::string text = "{";for (int i = 0; i < n; i++){if (i > 0) text +=',';text +=a[i];}text +='}';return text;}};SolveEigenvaluesEigenvectors.h#pragmaonce#include#include#include#include"LinearAlgebra.h"classSolveEigenvaluesEigenvectors{// A - исходнаяматрица// iterations - числоитераций// eigenvalues - собственные значения// eigenvectors - собственные вектораpublic: staticvoid find(intn,std::shared_ptr[]> A,intiterations,std::shared_ptr[]>& eigenvalues,std::shared_ptr[]>& eigenvectors){std::shared_ptr[]> B = LinearAlgebra::Duplicate(n, A);std::shared_ptr[]> U = LinearAlgebra::Identity(n);for (int i = 0; i < iterations; i++){std::shared_ptr[]> Q, R;decomposition(n, B, Q, R);B =LinearAlgebra::Product(n, R, Q);U =LinearAlgebra::Product(n, U, Q);}eigenvalues= std::make_shared< std::shared_ptr[] >(n);for (size_t i = 0; i < n; i++) {eigenvalues[i]= std::make_shared(n);}for (int i = 0; i < n; i++){eigenvalues[i][i] = B[i][i];}eigenvectors= U;}private: staticvoid decomposition(intn,std::shared_ptr[]> A,std::shared_ptr[]>& Q,std::shared_ptr[]>& R){std::shared_ptr[]> U = LinearAlgebra::Duplicate(n, A);for (int j = 1; j < n; j++){std::shared_ptr u = LinearAlgebra::GetColumn(n, U, j);std::shared_ptr v = LinearAlgebra::GetColumn(n, U, j);for (int k = j - 1; k >= 0; k--){std::shared_ptr uk = LinearAlgebra::GetColumn(n, U, k);u =LinearAlgebra::Subtract(n, u, LinearAlgebra::Project(n, uk, v));}for (int i = 0; i < n; i++){U[i][j] = u[i];}}for (int j = 0; j < n; j++){std::shared_ptr u = LinearAlgebra::GetColumn(n, U, j);float magnitude = LinearAlgebra::Magnitude(n, u);for (int i = 0; i < n; i++){U[i][j] = u[i] / magnitude;}}Q= U;R=LinearAlgebra::Product(n, LinearAlgebra::Transpose(n, Q), A);}};JacobSolve.h#pragmaonce#include#include"Matrix.h"#include"LinearAlgebra.h"classJacobSolve{private:staticbool symmetrycheck(Matrix& m) {for (int i = 0; i < m.n - 1; i++) {for (int j = i + 1; j < m.n; j++) {if (m.mat[i][j] != m.mat[j][i]) {returnfalse;}}}returntrue;}public:static std::string solve(Matrix& m) {if (!symmetrycheck(m)) {std::cout <<"матрицанесимметрична"<< std::endl;return 0;}auto Delta = std::make_shared(m.n);for (int minor_i = 1; minor_i <= m.n; minor_i++) {auto submat = std::make_shared< std::shared_ptr[] >(minor_i);for (size_t i = 0; i < minor_i; i++) {submat[i]= std::make_shared(minor_i);}for (int i = 0; i < minor_i; i++) {for (int j = 0; j < minor_i; j++) {submat[i][j] = m.mat[i][j];}}float det = LinearAlgebra::Determinant(minor_i, submat);Delta[minor_i - 1] = det;}std::string s = "Q(";for (int i = 0; i < m.n; i++) {s +="y"+ std::to_string(i + 1);if (i != m.n - 1) s +=",";}s +=")=";for (int i = 0; i < m.n; i++) {float koeff = 0;if (i > 0) {koeff = Delta[i] / Delta[i - 1];}else {koeff = Delta[0];}if (koeff >= 0)s +=" + ";elses +=" - ";s += std::to_string(abs(koeff)) +"*y"+ std::to_string(i + 1) +"^2";}return s;}};main.cpp#include#include"LinearAlgebra.h"#include"SolveEigenvaluesEigenvectors.h"#include"Matrix.h"#include"JacobSolve.h"#include#includeint main(){std::system("chcp 1251");int n = 3;auto matrix = std::make_shared< std::shared_ptr[] >(n);for (size_t i = 0; i < n; i++) {matrix[i]= std::make_shared(n);}Matrix mat1(n, matrix);std::cout <<"Введитематрицувформате:"<< std::endl <<"[размерность]"<< std::endl <<"[a11] ... [a1n]"<< std::endl<<"..."<< std::endl <<"[an1] ... [ann]"<< std::endl;std::cin >> mat1;//float matrix_data[3][3] = {//{1, 2, 3},//{2, 3, 5},//{3, 5, 6}//};//for (size_t i = 0; i < n; i++) {//for (size_t j = 0; j < n; j++) {//matrix[i][j] = matrix_data[i][j];//}//}std::cout <<"Нахождение квадратичной формы, метод Якоба:"<< std::endl;JacobSolve jacobSolve;std::string jbStr = jacobSolve.solve(mat1);std::cout <<"Каноническая запись:"<< std::endl;std::cout << jbStr;std::cout << std::endl;std::cout << std::endl;// число итерацийint numberOfIterations = 10;std::shared_ptr[]> eigenvalues;std::shared_ptr[]> eigenvectors;// выполняем поиск собственных веторов и чиселSolveEigenvaluesEigenvectors::find(mat1.n,mat1.mat,numberOfIterations,eigenvalues,eigenvectors);std::cout <<"Тензор"<< std::endl;std::cout << mat1 << std::endl;for (size_t i = 0; i < n; i++) {for (size_t j = 0; j < n; j++) {std::cout << matrix[i][j]<<" ";}std::cout << std::endl;}std::cout << std::endl;std::cout << std::endl;auto sortEV = std::vector< std::pair >();for (int i = 0; i < n; i++) {sortEV.push_back(std::pair(i, eigenvalues[i][i]));}std::sort(sortEV.begin(), sortEV.end(), [](const std::pair& x,const std::pair& y){return (x.second > y.second);});std::cout <<"Собственные значения (отсортированы по убыванию)"<< std::endl;/*for (size_t i = 0; i < n; i++) {for (size_t j = 0; j < n; j++) {std::cout << eigenvalues[i][j] << " ";}std::cout << std::endl;}*/for (auto it = sortEV.begin(); it != sortEV.end(); it++) {int i = it->first;std::cout << eigenvalues[i][i]<<" ";}std::cout << std::endl;std::cout << std::endl;std::cout <<"Собственные вектора"<< std::endl;//for (size_t i = 0; i < n; i++) {//for (size_t j = 0; j < n; j++) {//std::cout << eigenvectors[i][j] << " ";//}//std::cout << std::endl;//}for (auto it = sortEV.begin(); it != sortEV.end(); it++) {int i = it->first;for (size_t j = 0; j < n; j++) {std::cout << eigenvectors[j][i]<<" ";}std::cout << std::endl;}std::cout << std::endl;std::cout <<"Нахождение квадратичной формы, собственные значения и вектора:"<< std::endl;for (size_t j = 0; j < n; j++) {float val = 0;for (size_t i = 0; i < n; i++) {val += eigenvectors[i][j] * eigenvectors[i][j];}val = sqrt(val);for (size_t i = 0; i < n; i++) {eigenvectors[i][j] /= val;}}std::cout <<"Каноническаязапись:"<< std::endl;std::cout <<"Q(";for (int i = 0; i < n; i++) {std::cout <<"y"<< (i + 1);if (i != n - 1) std::cout <<",";}std::cout <<")=";for (int i = 0; i < n; i++) {if (eigenvalues[i][i] >= 0)std::cout <<" + ";elsestd::cout <<" - ";std::cout << abs(eigenvalues[i][i]) <<"*y"<< (i + 1) <<"^2";}std::cout << std::endl;std::cout <<"P=";Matrix mNormEV(n, eigenvectors);std::cout << mNormEV;std::cout << std::endl;}

Список литературы
1. Кормен, Т. Алгоритмы: Построение и анализ / Т. Кормен, Ч. Лейзерсон, Р. Ривест. [Пер. с англ.: К. Белов и др.] - М.: МЦНМО, 1999. - 955 с. ISBN 5-900916-37-5
2. Wans, S-X. The Improved Dijkstra's Shortest Path Algorithm and Its Application / S-X Wang // Procedia Engineering. – 2012 - №29. – Pp. 1186 – 1190. doi: 10.1016/j.proeng.2012.01.110
3. Керниган, Б. Язык программирования C. 2-е изд. / Б. Керниган, Д.М. Ритчи. — М.: Вильямс, 2016. — 288 c.
4. Страуструп, Б. Язык программирования C++: Специальное издание / Б. Страуструп; Пер. с англ. Н.Н. Мартынов. — М.: БИНОМ, 2017. — 1136 c.
5. Галовиц, Я. С++17 STL. Стандартная библиотека шаблонов – Санкт-Петербург : Питер, 2018. – 432 с.
6. Васильев, А. Н. Программирование на C++ в примерах и задачах – Москва : Эксмо, 2019. – 368 с.
7. Приведение квадратичной формы к каноническому виду. Математический портал [Электронный ресурс] Режим доступа: http://mathportal.net/index.php/analiticheskaya-geometriya/privedenie-kvadratichnoj-formy-k-kanonicheskomu-vidu