Определение ортогональной матрицы

 












КУРСОВАЯ РАБОТА

по дисциплине

«Программирование »

Тема курсовой работы «Определение ортогональной матрицы»

Содержание


Введение

.Разработка эскизного и технического проектов программы

.1Задание

.2Назначение и область применения

.3Технические характеристики

.3.1Постановка задачи

.3.2Описание алгоритма

.3.3Организация входных и выходных данных

.3.4Выбор состава технических и программных средств

.Разработка рабочего проекта

.1Разработка программы

.2Спецификация программы

.3Описание программы

.4Тестирование программы

Заключение

Список использованной литературы

Приложение «Листинг программы «Определение ортогональной матрицы»


Введение


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

Рабочая программа представляет оператору преобразование по методу Гаусса - Жордана заданной матрицы в обратную матрицу. Транспонирование расчетной матрицы. Умножение транспонированной матрицы на обратную матрицу и сравнивание результата с единичной матрицей с целью проверки верности нахождения обратной матрицы. Сравнивание транспонированной матрицы с обратной, с целью проверки ортогональности.

Рабочая программа реализуется в консольной технологии, занимает не более 15 кбайт памяти. Может работать под операционной системой Windows ХР и более ранних версиях Windows, на процессорах начиная 486 серии.

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


1. Разработка эскизного и технического проектов программы


.1 Задание


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

Консольное приложение должно:

автоматически преобразовывать исходную матрицу в обратную матрицу;

автоматически транспонировать исходную матрицу;

автоматически умножать транспонированную матрицу на обратную матрицу;

автоматически сравнивать произведение матриц с единичной матрицей;

автоматически сравнивать транспонированную матрицу с обратной;

автоматически просчитывать вывод об ортогональности матрицы;

выводить на экран результаты вычисления.

Интерфейс программы «Определение ортогональной матрицы» должен представлять собой собственное консольное окно с заголовком и выводом расчетных данных.


.2 Назначение и область применения


Назначение программы - «Определение ортогональной матрицы» позволяет производить проверку заданной матрицы на ортогональность.

Область применения программы - вычисления для дисциплины по курсу линейной алгебры при изучении темы «Матрицы» для учащихся старших классов и студентов первого курса.

.3 Технические характеристики


.3.1 Постановка задачи

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

В математике квадратная матрица А называется ортогональной, если АТ=А-1

Транспонированная матрица АТ - это матрица, полученная путем замены у исходной матрицы А строк на столбцы. Обратная матрица А-1 - это такая матрица, при умножении на которую исходной матрицы А, даёт в результате единичную матрицу. Единичная матрица - это такая матрица, в которой элементы главной диагонали принимают значение 1, остальные элементы 0. Главная диагональ матрицы - это диагональ, которая проходит через верхний левый и нижний правый углы матрицы.

Разрабатываемая программа «Определение ортогональной матрицы» должна по методу Гаусса - Жордана преобразовывать исходную матрицу в обратную и сравнивать её с транспонированной.

При выполнении арифметических действий с матрицами следует применить стандартные математические алгоритмы.


.3.2 Описание алгоритма

В программе решаются одновременно несколько задач:

Транспонирование исходной матрицы.

Нахождение обратной матрицы из исходной.

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

Сравнивание транспонированной и обратной матрицы на предмет ортогональности.

Вывод результатов вычислений.

Транспонирование исходной матрицы решается путем перезаписи элементов aij исходной матрицы в элементы aji транспонированной матрицы в двух циклах поэлементно.

Для нахождения обратной матрицы воспользуемся алгоритмом Гаусса - Жордана, а именно:

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

. Все элементы первой строки делим на верхний элемент выбранного столбца.

. Из оставшихся строк вычитаем первую строку, умноженную на первый элемент соответствующей строки, с целью получить первым элементом каждой строки (кроме первой) ноль.

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

. После повторения этой процедуры n-1 раз получаем верхнюю треугольную матрицу

. Вычитаем из предпоследней строки последнюю строку, умноженную на соответствующий коэффициент, с тем, чтобы в предпоследней строке осталась только 1 на главной диагонали.

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

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

Для проверки вычислений требуется вычислить произведение обратной матрицы на транспонированную матрицу и сравнить результат с единичной матрицей. Умножение матриц происходит поэлементно. Для этого используется три цикла, первый и второй используется для перебора элементов результирующей матрицы, второй и третий для перебора элементов транспонированной матрицы, первый и третий для перебора элементов обратной матрицы. После каждого прохождения третьего цикла, накапливаем сумму, которая после завершения цикла приравнивается к соответствующему элементу результирующей матрицы. Для того, чтобы значения были верными, после прохождения первого и второго цикла, объявляем текущий элемент результирующей матрицы равным нулю. После завершения работы всех циклов на выходе должна быть заполненная, не нулевая матрица. Далее поэлементно будем сравнивать полученную матрицу с единичной матрицей. Зная, что единичная матрица - это матрица, у которой главные элементы единицы, а остальные нули, будем использовать два цикла для прогона всей матрицы поэлементно. В конце каждого цикла зададим условие: если элемент находиться на главной диагонали (т.е. aij такое, что i=j) и он не равен единице, то будем накапливать счетчик «истины»; если элемент находиться не на главной диагонали (т.е. aij такое, что i!=j) и он не равен нулю, то так же будем накапливать счетчик «истины». В итоге, после прохождения всех циклов, сравним счетчик «истины» с исходным значением и программа сделает вывод, единичная ли матрица. Если полученная матрица единичная - то результат нахождения обратной и транспонированной матрицы верный. Примечание: т.к. мы не можем сравнить точно два действительных числа, то для этого будем использовать некую e, равную e=0,00001. Т.е. можно сказать, что результат вычислений мы получаем с точностью e.

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

В итоге, если счетчик «истины» будет больше исходного значения, то программа делает вывод об ортогональности матрицы.


.3.3 Организация входных и выходных данных

Входные данные - это заданная в задании матрица.

Выходные данные - это вывод об ортогональности матрицы.

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


.3.4 Выбор состава технических и программных средств

Средства, используемые в данной работе, содержатся в интегрированной среде разработки (IDE) Microsoft Visual C++ 2008 (далее VS). Эта среда предоставляет набор инструментов, которые помогают в создании и изменении кода, а также в обнаружении и исправлении ошибок. В VS для организации работы служат проекты и решения. При написании программы на языке C++ с помощью VS первым этапом является выбор типа проекта. Для каждого типа проекта VS устанавливает параметры компилятора и генерирует стартовый код. Так как задача ставились написать консольное приложение, то запускался мастер приложений Win32 и создавался пустой проект - без файлов исходного кода. В пустой проект через обозреватель решений добавлялись файлы исходного кода «main.cpp», «prototype.ccp» и файл включений «prototype.h». Далее все файлы компилировались, исправлялись ошибки, полученные при компиляции, создавался загрузочный (исполнительный) модуль, он запускался на выполнение. При запуске на выполнение возникали ошибки в логике программы, которые в дальнейшем были исправлены. В конечном итоге получился исполнительный модуль - рабочая программы «Определение ортогональной матрицы.exe».


2. Разработка рабочего проекта


.1 Разработка программы


Программа «Определение ортогональной матрицы» предназначена для функционирования в среде Windows. Это приложение, хотя и разрабатывалось в среде визуального программирования, но использует консольное окно. Таким образом, программирование строится на процессе написания кода, придающего консольному окну и программе в целом необходимую функциональность. Окно программы изображено на рисунке 1.


Рисунок 1. Консольное окно программы «Определение ортогональной матрицы»


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

2.2 Спецификация программы


В спецификации программы определены основные файлы программы «Определение ортогональной матрицы».


ОбозначенияНаименованиеПримечаниеОпределение ортогональной матрицы.exeИсполняемая программаВходная точка в программуmain.сррГлавная функцияЗанимается вызовом основных вычислительных функций prototype.ccpФайл для функцийЗанимается описанием всех функций для ввода и вывода расчетных данныхprototype.hФайл включенийОпределены прототипы файловых функций для выполнения расчетов

.3 Описание программы

ортогональный матрица программа

При создании программы использовался модульный принцип построения программ. Все исходные модули логически разделены на файлы. Программа состоит из 3-х файлов: «main.срр», «prototype.ccp», «prototype.h».

Файл «main.срр» - главный, является по своей сути управляющим. Здесь осуществляется вход в программу. Этот модуль вызывает функции из другого модуля - файла функций «prototype.ccp». Прототипы функций хранятся в файле включений «prototype.h».

Функции, используемые в «main.ccp» и описанные в модуле «prototype.срр» вызываются в ходе программы: print_mas(double **mas); - функция вывода на экран предложенной матрицы. Функция применяется для упрощения алгоритма, так как операция вывода на экран матрицы идентична для всех расчетных матриц. Входными данными является указатель, в котором записана требуемая для вывода на экран матрица. Выходных данных нет.sravnenie(double **mas); - функция сравнения матрицы с единичной матрицей. Функция применяется для упрощения алгоритма и наглядности кода программы. Входные данные - указатель, в котором записана требуемая функция для сравнения. Выходных данных нет.rezultat(double **mas, double **mast); - функция сравнения обратной матрицы и транспонированной матрицы, а также финальный вывод результатов программы. Функция применяется для упрощения алгоритма и наглядности кода программы. Входные данные - два указателя, в которых записаны обратная и транспонированная матрицы. Выходных данных нет.** obrat(double **mas); - функция для создания обратной матрицы. Функция применяется для упрощения алгоритма и наглядности кода программы. Входные данные - указатель, в котором записана расчетная матрица. Выходные данные - указатель, в котором записана обратная матрица.** trans(double **mas); - функция для создания транспонированной матрицы. Функция применяется для упрощения алгоритма и наглядности кода программы. Входные данные - указатель, в котором записана расчетная матрица. Выходные данные - указатель, в котором записана транспонированная матрица.** proizv(double **mas, double **mast); - функция для расчета произведения двух матриц. Функция применяется для упрощения алгоритма и наглядности кода программы. Входные данные - указатели требуемых для произведения матриц. Выходные данные - указатель с матрицей в которую записан результат произведения.** sozdanie(double mas[4][4]); - функция для перезаписи матрицы из массива в указатель. Функция применяется для упрощения алгоритма, так как данная операция идентична для всех расчетных матриц. Входные данные - двумерный массив. Выходные данные - указатель, в которые переписан массив.


2.4 Тестирование программы


Так как при выполнении программы не требуется вводить дополнительных данных, а входе выполнения программы, существует алгоритм автопроверки расчетов, то следует заметить, что данная программа не нуждается в многократном тестировании. Отмечу только что при компилировании программы в среде разработки (IDE) Microsoft Visual C++ 2008 никаких ошибок и замечаний не возникло.


Заключение


Программа «Определение ортогональной матрицы.ехе» - консольное приложение, занимает объем не более 15 Кбайт. Для ее выполнения необходим минимальный состав аппаратурных средств: операционная система Windows 95, процессор 486 серии, оперативная память 4 Мбайт, память видеокарты 512 Кбайт, жесткий диск 544 Мбайт, экран, клавиатура, мышь.

Рабочая программа из каталога «Release» проекта «Определение ортогональной матрицы», можно скопировать на жесткий или съемный диск.

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


Список использованной литературы


1.Герберт Шилдт. Полный справочник по С++. Четвертое издание. Москва. Издательский дом «Вильямс». 2009 г.

2.В.И. Шупляк, С++, Практический курс, Учебное пособие., Минск, «Новое знание», 2011 г.

.MSDN -справочник по системе, операторам, функциям для среды разработки Microsoft Visual Studoi 2008 (2010) по языку С++.

.Голуб Дж. (Gene H. Golub), Ван Лоун Ч. (Charles F. Van Loan) Матричные вычисления. - М.: Мир, 2009, 548с., ил. (ISBN 5-03-002406-9)

.Хорн Р. (Roger A. Horn), Джонсон Ч. (Charles C. Johnson) Матричный анализ. - М.: Мир, 2011, 655с., ил. (ISBN 5-03-001042-4)


Приложение


Листинг программы «Определение ортогональной матрицы»


Главный модуль программы - main.cpp

#include <stdio.h>

#include <locale.h>

#include <math.h>

#include <windows.h>

#include <stdlib.h>

#include <time.h>

#include "prototype.h"

#define NS printf_s(" \n \n")main()

{(LC_ALL,"");

//Задание рассчетной матрицыmas_general[4][4]= {1.00, 0.42, 0.54, 0.66,

.42, 1.00, 0.32, 0.44,

.54, 0.32, 1.00, 0.22,

.66, 0.44, 0.22, 1.00};null[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};**mas=sozdanie(mas_general);**obrat1=sozdanie(null);**trans1=sozdanie(null);**ras1=sozdanie(null);

//Запуск вывода на экран расчетной матрицы_s ("Расчетная матрица\n");_mas(mas);;

//Запуск функции создания обратной функции=obrat(mas);

//Запуск вывода на экран обратной матрицы_s ("Обратная матрица\n");_mas(obrat1);;


//Запуск функции создания транспонированной функции=trans(mas);

//Запуск вывода на экран транспонированной матрицы_s ("Транспонированная матрица\n");_mas(trans1);;

//Запуск функции умножения обратной на транспонированную=proizv(obrat1,trans1);

//Вывод на экран результата умножения расчетной матрицы на обратную_s ("Проверка подлинности получения обратной и транспонированной матрицы\nРезультат умножения транспонированной матрицы на обратную\n");_mas(ras1);;

//Запуск функции сравнения полученной матрицы с единичной(ras1);

//Запуск функции сравнения транспонированной матрицы с обратной(obrat1,trans1);0;

}

Модуль программы prototype.ccp

#include "prototype.h"

//Функция перезаписи из массива в указатели** sozdanie(double mas[4][4])

{

//Создаем указатель**ras;=new double *[4];(int i=0; i<4; i++)[i]= new double [4];

//Переписываем в него массив(int i=0; i<4; i++)(int j=0; j<4; j++)[i][j]=mas[i][j];

//Выводим указательras;

//Подчищаем за собой(int i = 0; i < 4; i++)[] ras[i];[] ras;

}

//Функция вывода на экран матрицыprint_mas (double **mas)

{(int i=0; i<4; i++)

{_s ("\n");(int j=0; j<4; j++)_s ("%4.2f ",mas[i][j]);

}

}

//Функция транспонирования матрицы** trans(double **mas)

{

//Создаем указатель**ras;=new double *[4];(int i=0; i<4; i++)[i]= new double [4];

//Переписываем из входящего указателя в новый, заменяя строки на столбцы(int i=0; i<4; i++)(int j=0; j<4; j++)[j][i]=mas[i][j];

//Выводим соданый указательras;

//Подчищаем за собой(int i = 0; i < 4; i++)[] ras[i];[] ras;

}

//Функция расчета обратной матрицы** obrat(double **mas)

{

//Создаем временный указатель**temp1 = new double *[4];(int i=0; i<4; i++)[i]= new double [4];

//Переписываем входной указатель на временный(int i = 0; i < 4; i++)(int j = 0; j < 4; j++)[i][j]=mas[i][j];

//Создание обратной матрицы

{

//Создаем временную матрицуtemp;

//Создаем указатель для единичной матрицы**E = new double *[4]; (int i = 0; i < 4; i++)[i] = new double [4];

//Заполняем единичную матрицу(int i = 0; i < 4; i++)(int j = 0; j < 4; j++)

{[i][j] = 0.00; (i == j)[i][j] = 1.00;

}

//Заполняем временную матрицу

//Все элементы первой строки делим на верхний элемент выбранного столбца.(int k = 0; k < 4; k++)

{= temp1[k][k]; (int j = 0; j < 4; j++)

{[k][j] = temp1[k][j]/temp;[k][j] = E[k][j]/temp;

}

//Из оставшихся строк вычитаем первую строку, умноженную на первый элемент соответствующей строки,

//с целью получить первым элементом каждой строки (кроме первой) ноль.(int i = k + 1; i < 4; i++)

{= temp1[i][k]; (int j = 0; j < 4; j++)

{[i][j] = temp1[i][j] - temp1[k][j] * temp;[i][j] = E[i][j] - E[k][j] * temp;

}

}

}

//Вычитаем из предпоследней строки последнюю строку, умноженную на соответствующий коэффициент,

//с тем, чтобы в предпоследней строке осталась только 1 на главной диагонали.(int k = 4 - 1; k > 0; k--)

{(int i = k - 1; i >= 0; i--)

{= temp1[i][k]; (int j = 0; j < 4; j++)

{[i][j] = temp1[i][j] - temp1[k][j] * temp;[i][j] = E[i][j] - E[k][j] * temp;

}

}

}

//Переписываем значения из обработаной единичной матрицы в расчетную матрицу(int i = 0; i < 4; i++)(int j = 0; j < 4; j++)[i][j] = E[i][j];

//Подчищаем за собой(int i = 0; i < 4; i++)[] E[i];[] E;

//Возвращаем указатель с результатомtemp1;

//Подчищаем за собой(int i = 0; i < 4; i++)[] temp1[i];[] temp1;

}

}

//Функция произведения двух матриц** proizv (double **mas, double **mast)

{

//Создаем указатель, в который будем записывать результат вычислений**ras;=new double *[4];(int i=0; i<4; i++)[i]= new double [4];

//Вычисляем значения по элементно(int i=0; i<4; i++)(int j=0; j<4; j++)[i][j]=0;(int i=0; i<4; i++)(int j=0; j<4; j++)

{(int k=0; k<4; k++)

{s = mas[k][j]*mast[i][k];

//Результат умножения записываем в результирующий указатель[i][j]=ras[i][j]+s;

}

}

//Выводим результирующий указательras;

//Подчищаем за собой(int i = 0; i < 4; i++)[] ras[i];[] ras;

}

//Функция сравнения матрицы с единичной матрицойsravnenie(double **mas)

{s=1; //Счетчик истины(int i=0; i<4; i++)(int j=0; j<4; j++)

{

//Сравнение по единичным наборам(i==j)

{(mas[i][j]!=1 && (fabs(mas[i][j]-1.0)>0.00001))

{=s+1; //Если условие не выполняется, то счетчик истины увеличивается

}

}

//Сравнение по нулевым наборамif (i!=j)

{(mas[i][j]!=0 && (fabs(mas[i][j])>0.00001))

{=s+1; //Если условие не выполняется, то счетчик истины увеличивается

}

}

}

//Сравнение счетчика истины с начальным значением(s>1)_s ("Матрица не единичная => Вычисления выполнены не правильно\n\n");_s ("Матрица единичная => Вычисления выполнены правильно\n\n");

}

//Функция сравнения матрицrezultat(double **mas, double **mast)

{s=1; //Счетчик истины(int i=0; i<4; i++)(int j=0; j<4; j++)(mas[i][j]!=mast[i][j])++; //При выполнении условия, счетчик накручиваем(s>1) printf_s ("Транспонированная матрица не идентична обратной => \nПредставленная матрица не ортогональна\n\n");printf_s ("Транспонированная матрица идентична обратной => \nПредставленная матрица ортогональна\n\n");

}

Модуль программы prototype.h

#ifndef PROTOTYPE_H

#define PROTOTYPE_H

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <math.h> print_mas(double **mas); //Функция вывода на экран матрицыsravnenie(double **mas); //Функция сравнения матрицы с единичнойrezultat(double **mas, double **mast);//Функция сравнения обратной и транспонированной матрицы и финальный вывод расчтов** obrat(double **mas); //Функция создания обратной матрицы** trans(double **mas); //Транспонирование матрицы** proizv(double **mas, double **mast); //Функция произведения матриц** sozdanie(double mas[4][4]); //Функция перезаписи из массива в указатели

#endif



КУРСОВАЯ РАБОТА по дисциплине «Программирование » Тема курсовой работы «Определение ортогона

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ