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

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ







Курсовая работа

по программированию







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





























Комсомольск-на-Амуре 2010


Введение



Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. С тех пор он был портирован на многие другие операционные системы и стал одним из самых используемых языков программирования. Си ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ. Несмотря на то, что Си не разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка Си стал основой для многих других языков. 

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

Язык Си был создан для программистов, учитывая их интересы, и многократно проверялся на практике, прежде чем был окончательно реализован. Именно поэтому языки Си и Си++ стали наиболее популярными среди программистов высокого уровня.

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

Метод исследования – изучение литературы, написание и отладка программ на компьютере






1. Анализ вопроса и постановка задачи



1.1 Выбор метода решения



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

1. Метод понижения порядка. Нахождение определителя n-го порядка сводится к вычислению п определителей (n – 1)-го порядка. Метод неэффективен.

2. Нахождение определителя сводится к вычислению одного определителя (n – 1)-го порядка. Для этого достаточно все элементы, кроме одного, в каком-либо столбце (строке) сделать равными нулю. 

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







4. Вычисление определителя и обратной матрицы с помощью метода Гаусса

5. Метод Крамера

Рассмотрим метод Крамера созданный Габриелем Крамером в 1750 году. Метод Крамера (правило Крамера) — способ решения квадратных систем линейных алгебраических уравнений с ненулевым определителем основной матрицы.

Матрица - это прямоугольная таблица, составленная из чисел. Особое место среди матриц занимают квадратные матрицы. Рассмотрим произвольную квадратную матрицу порядка  или просто :



.



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

Определение 1. Численная характеристика квадратной матрицы называется ее определителем.

Рассмотрим матрицу первого порядка .

Определение 2. Численной характеристикой матрицы первого порядка, то есть определителем первого порядка, называется величина ее элемента .

Обозначается определитель одним из символов .

Определение 3. Определителем второго порядка, соответствующим матрице второго порядка, называется число, равное .

Обозначается определитель одним из символов



.



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

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

После того как рассмотрены определители 1-го и 2-го порядков, можно перейти к понятию определителя любого порядка. Но перед этим введем понятие минора.

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

Обычно минор элемента  обозначается .

Определение 5. Определителем порядка , соответствующим матрице порядка , называется число, равное 



.



Обозначается определитель одним из символов



.



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


.



В приведенном правиле вычисления определителя фигурирует лишь первая строка. Возникает вопрос, а нельзя ли вычислить определитель, используя элементы других строк?

Теорема 1. Каков бы ни был номер строки  (), для определителя -го порядка справедлива формула 



, 



называемая разложением этого определителя по -ой строке.

Нетрудно заметить, что в этой формулировке степень при (-1) равна сумме номеров строки и столбца, на пересечении которых стоит элемент .

Докажем сначала эту теорему для . В этом случае  может быть равно только 2, так как  входит в основное определение величины определителя. Итак:



.



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

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

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

Теорема 2. Каков бы ни был номер столбца  (), для определителя -го порядка справедлива формула



, 



называемая разложением этого определителя по -му столбцу.

Докажем теорему для :



.



Данное выражение равно величине определителя, введенной по определению.

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

Свойства определителей:

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

2. Определитель равен нулю, если все элементы какого-нибудь столбца равны нулю или если один из столбцов является линейной комбинацией любых его других столбцов (в частности, определитель, у которого хотя бы два столбца одинаковы, равен нулю).

3. Умножение всех элементов какого-нибудь столбца на скаляр k равнозначно умножению определителя на k (общий множитель элементов строки или столбца можно вынести за знак определителя).

4. Умножение матрицы n-го порядка на скаляр k соответствует умножению ее определителя на kn, т.е.

det(k[A]) = kndet[A].

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

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

Описание метода Крамера

Для системы n линейных уравнений с n неизвестными (над произвольным полем)







с определителем матрицы системы Δ, отличным от нуля, решение записывается в виде







(i-ый столбец матрицы системы заменяется столбцом свободных членов).

В другой форме правило Крамера формулируется так: для любых коэффициентов c1, c2, …, cn справедливо равенство:








В этой форме формула Крамера справедлива без предположения, что Δ отлично от нуля, не нужно даже, чтобы коэффициенты системы были бы элементами целостного кольца (определитель системы может быть даже делителем нуля в кольце коэффициентов). Можно также считать, что либо наборы b1,b2,...,bn и x1,x2,...,xn, либо набор c1,c2,...,cn состоят не из элементов кольца коэффициентов системы, а какого-нибудь модуля над этим кольцом. В этом виде формула Крамера используется, например, при доказательстве формулы для определителя Грама и Леммы Накаямы.



1.2 Выбор инструментальных средств



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

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

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

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

Шестнадцатеричный язык - упрощение за счет представления четырех двоичных цифр одной шестнадцатеричной. Используется в качестве дополнения к языкам высокого уровня для программирования критичных к времени выполнения фрагментов алгоритмов.

Язык Ассемблера - предназначен для представления в удобочитаемой символической форме программ, написанных на машинном языке. Используется для написания драйверов устройств, критических с точки зрения быстродействия, участков программ, а так же для написания стыковочных узлов (мостов) между модулями программы, написанной на двух разных языках.

Язык Макроассемблера - расширение языка Ассемблера. Позволяет определять и использовать новые, более мощные команды.

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

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

Язык VBA (Visual Basic for Application) используют для написания приложений, использующих графическую среду, в частности для приложений Microsoft Office, так как он является встроенным языком этих приложений.

И наконец Язык Cи, обладающий всеми необходимыми возможностями для решения поставленной задачи. Кроме того он был заложен в программу моего курса обучения и потому хорошо мне известен. Язык Си - это универсальный язык программирования, для которого характерны экономичность выражения, современный набор операторов и типов данных. Язык Си не является ни языком "очень высокого уровня", ни "большим" языком, и не предназначается для некоторой специальной области применения, но отсутствие ограничений и общность языка делают его для многих задач более удобным и эффективным, чем языки, предположительно более мощные. 

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



1.3 Выбор аппаратных средств



Минимальные системные требования для более - менее нормальной работы:

Процессор Intel Pentium II/400 MHz 

Microsoft Windows 98/2000 (SP2)/XP 

128 MB RAM (рекомендуется 256 MB) 

3 GB (рекомендуется 5 GB) свободного места на жестком диске (для полной установки операционной системы и среды для разработки программы) 

CD-ROM 

Монитор SVGA (разрешение экрана 800x600, 256 цветов) 

Мышь




1.4 Выводы по первой главе



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

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

Для более нормальной работы нам понадобятся:

Процессор Intel Pentium II/400 MHz 

Microsoft Windows 98/2000 (SP2)/XP 

128 MB RAM (рекомендуется 256 MB) 

3 GB (рекомендуется 5 GB) свободного места на жестком диске (для полной установки операционной системы и среды для разработки программы) 

CD-ROM 

Монитор SVGA (разрешение экрана 800x600, 256 цветов) 

Мышь






2. Практическая реализация



2.1 Общая структура программного модуля



Выполняемые действия

Название функции

Принимает размер матрицы и значения ее элементов, которые вводит пользователь с клавиатуры

Блок ввода

Вычисляет решения матрицы A размерности Razm при свободных членах B. В случае несовместности системы завершает работу программы.

Kramer(A,B,Razm)

Вычисляет детерминант матрицы A размерности Razm

Det(A,Razm)

Выводит на экран результаты решения

Блок вывода





Kramer(A,B,Razm)

Блок вывода данных

Конец программы

Det(A,Razm)

Блок ввода данных

Начало программы



2.2 Блок - схемы алгоритмов и их описание



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




Начало

Ввод Razm

i = 0

i < Razm

i = i + 1

j = 0

j < Razm

j = j + 1

Ввод A[i][j])

Ввод B[i]

i = 0

i < Razm

Рисунок 1 – Алгоритм выполнения программы






det=Det(A,Razm)

!det

нет

i = 0

i < Razm

j = 0

j < Razm

j = j + 1

i = i + 1

Вывод B[i]

A_[i][j] = A[i][j]

i = 0

i < Razm

j = 0

j < Razm

A_[j][i] = B[j]

det=Det(A_,Razm)

Вход в float *Kramer(float **A, float*B, int Razm)

Рисунок 2 – Алгоритм функции Kramer




i = 0

i < Razm

Вход в float Det(float**A,int Razm)

det = 0

i = 0

i < Razm

j = 1

j < Razm

i1 = i+1

det_ = A[i][0] 

i1 = 0

i1 == Razm

det+=det_

det_ *= A[i1++][j]

j = j + 1

i = i + 1

i1 = i+1

det_ = A[0][Razm-1]

	Рисунок 3 – Алгоритм нахождения Det

	
2.3 Контрольный текстовый пример

	

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

	

	

	

	

	

	
2.4 Выводы по второй главе

	

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

	

	

	
Заключение

	

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

Систематизированы и закреплены практические навыки использования ЭВМ, программного обеспечения, существующих средств обслуживания системных программистов, а также теоретические знания по основным разделам курса "Объектно-ориентированного программирования". 

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

Получены практические навыки работы в среде программировании С.






Библиографический список



	Алексеев Е.В. и др. Вычислительная техника и программирование. Практикум по программированию: Практ. пособие / В.Е. Алексеев, А.С. Ваулин, Г.Б. Петрова; Под ред. А.В. Петрова. – М.: Высш. шк., 1991. – 400 с.: ил

	Глушаков С.В., Мельников И.В. Персональный компьютер: Учебный курс / Худож. оформитель А.С. Юхтман. – Харьков: Фолио; М.: ООО «Издательство АСТ», 2001. – 520 с. – (Домашняя б-ка).

	Козлов В.В., Можаева Н.А., Зуева Н.Г. Информатика. Алгоритмизация и программирование. Мет. Указания и задания к курсовой работе, 2006. - 32 с.

	Громов Ю.Ю., Татаренко С.И. Программирование на языке СИ:

	Учебное пособие. -Тамбов, 1995.- 169 с.

	

	
Приложение

	

* Дата: 23/05/10 Время: 16:55 Версия: v.1.0 *

* Компилятор: BC v.3.1. *

* Лист 1/Листов 5 *

* Проект:PROJECT2.PRJ *

* Файл: project.cpp *

* Наименование: нет. *

* Назначение: решает матрицу произвольного порядка методом Крамера *

* Описатель: void main(void) *

* Входные параметры: нет. *

* Выходные параметры: нет. *

* Возвращаемое значение: нет. *

* Внешние ссылки: нет. *

*Программист: Кравченко Д.С. Группа: ИА-22 *



#include <stdio.h>

#include <conio.h>

// Нахождение детерминанта матрицы методом треугольников

float Det(float**A,int Razm)

{

float det = 0; // Детерминант матрицы

// пересчет суммы положительных "треугольников"

for (int i = 0; i<Razm; i++)

{ 		int i1 = i+1;

float det_ = A[i][0];

for(int j = 1; j<Razm; j++)

{ 		if(i1 == Razm) i1 = 0;

det_ *= A[i1++][j];

}

det+=det_;

}

// пересчет суммы отрицательных "треугольников"

for (i = 0; i<Razm; i++)

{ 		int i1 = i+1;

float det_ = A[0][Razm-1];

for(int j = Razm-2; j>-1; j--)

{		if(i1 == Razm) i1 = 0;

det_ *= A[i1++][j];

}

det -= det_;

}

return det;

}



* Дата: 23/05/10 Время: 16:55 Версия: v.1.0 *

* Компилятор: BC v.3.1. *

* Лист 2/Листов 5 *





15