Разработка прикладной программы для решения систем линейных алгебраических уравнений
Изучение основных этапов проектирования программных систем, создание прикладной программы, которая выполняет решение систем линейных алгебраических уравнений методом Гаусса. Вычисление определителя и обращение матриц. Листинг разработанной программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.07.2012 |
Размер файла | 563,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
2
Содержание
Введение
1. Аналитическая часть
- 1.1 Постановка задачи
- 1.2 Обзор программных средств для решения СЛАУ
- 1.3 Этапы разработки программных систем
2. Разработка проекта системы
- 2.1 Описание алгоритма решения СЛАУ
2.2 Компьютерная реализация алгоритма решения СЛАУ
3. Реализация проекта
- 3.1 Требования к программе
- 3.2 Описание модульных структур
- 3.3 Описание диалога с пользователем
- 3.4 Контрольный пример
Заключение
Список использованной литературы
Приложение
Введение
Системы линейных уравнений используются во многих областях науки и техники и являются, пожалуй, наиболее часто встречающимися типами математических задач.
Целью данной курсовой работы является изучение основных этапов проектирования программных систем, а также создание прикладной программы выполняющей решение систем линейных алгебраических уравнений методом Гаусса, вычисление определителя и обращение матриц.
Программа должна позволять производить расчеты для СЛАУ с последующим выводом результатов на экран монитора.
Курсовая работа состоит из трех частей: аналитической, алгоритмической и программной. В первой части документации будет представлен обзор методов, связанных с программированием. Во второй будет информация относительно функции и принципов работы алгоритма решения СЛАУ, структурная схема и схема Насси-Шнейдермана для алгоритма. А в третьей части будет рассмотрена структура программы, её назначение и инструкция пользователя и контрольный пример. Также курсовая работа будет содержать приложение - листинг программы.
1. Аналитическая часть
1.1 Постановка задачи
Разработка программного обеспечения для решения систем линейных алгебраических уравнений численными методами.
Задание: Методом Гаусса решить систему линейных алгебраических уравнений Аx = b, вычислить определитель и обратную матрицу заданной системы.
К задачам линейной алгебры относятся задачи: решения систем линейных алгебраических уравнений (СЛАУ), нахождения обратных матриц, вычисления определителей матриц, нахождения собственных векторов и собственных чисел матриц. Как показывают исследования, 75 % всех расчетных математических задач приходится на решение СЛАУ. Это объясняется тем, что большинство моделей физических систем сами по себе являются линейными. К системам линейных алгебраических уравнений сводятся после дискретизации системы дифференциальных и интегральных уравнений. Линейные алгебраические уравнения являются также результатом локальной линеаризации систем нелинейных уравнений.
Задача численного решения СЛАУ имеет незапамятную историю. Следует заметить, что классический метод исключения, активно изучаемый и развиваемый даже в наши дни, был открыт Гауссом в 1849 г. Однако задолго до этого в Древнем Китае были изданы «Девять книг о математическом искусстве», где этот алгоритм уже был изложен в характерной для того времени «натуральной» форме.
Несмотря на большие теоретические достижения в области решения СЛАУ и бурный рост вычислительных мощностей современных ЭВМ, проблема конструирования и исследования быстрых алгоритмов решения СЛАУ продолжает оставаться актуальной. Возникающие практические задачи требуют от вычислительных методов все большей точности и надежности. Поэтому можно говорить о постоянном дефиците машинных ресурсов, который стимулирует как постоянное наращивание вычислительных мощностей, так и разработку новых вычислительных алгоритмов. Причем, наибольший эффект дают алгоритмы, учитывающие особенности структуры матриц коэффициентов решаемых задач: ленточность, блочность, разреженность.
Численные методы решения СЛАУ делятся на две большие группы: конечные (точные) и приближенные (итерационные).
Конечными (точными) методами называются такие методы, в которых решение получается за конечное число элементарных арифметических операций, зависящее только от порядка системы n . Если элементы исходной матрицы A и вектора правой части B являются целыми или рациональными числами, представленными в виде обыкновенных дробей, и все действия выполняются точно по правилам действий над обыкновенными дробями, то результат будет абсолютно точным. Отсюда и второе название этих методов «точные». Однако при произвольном задании элементов матрицы A и вектора правой части B решение, полученное за конечное число шагов, уже не будет абсолютно точным. Его точность будет определяться точностью выполнения арифметических операций на данной ЭВМ.
В приближенных, или итерационных, методах решение получается в результате последовательного приближения, начиная от некоторого начального заданного значения. Количество шагов, приводящее к решению, заранее неизвестно и зависит как от типа решаемой системы, так и от выбора вектора начального приближения.
Метод Гаусса, который рассматривается в работе, относится к точным методам.
1.2 Обзор программных средств для решения СЛАУ
Во все времена инженерам, исследователям (т.е. специалистам в своих областях) был необходим удобный и достаточно эффективный (для своего времени) инструмент для решения своих задач. В этот «инструментальный» ряд можно включить логарифмическую линейку, арифмометр, калькулятор, универсальную ЭВМ, персональный компьютер. При использовании вычислительной техники встала проблема реализации алгоритмов решения в виде так называемых программ. Для решения этой проблемы в различные годы использовались следующие средства:
- программирование в машинных кодах (включая языки типа Ассемблер);
- программирование на языках высокого уровня (включая объектно-ориентированное программирование);
- системы компьютерной математики.
Разработка программы требует и соответствующей подготовки (назовем ее «программистской»), и достаточно большего количества времени (и то и другое часто отсутствует у «обычного пользователя»). Поэтому, начиная с 90-х годов прошлого века, широкую известность и заслуженную популярность приобрели так называемые системы компьютерной математики или, проще, математические пакеты.
Для решения СЛАУ существует множество программных средств: MathCad, Mathematica, MatLab и др.
MathCAD -- математически ориентированные универсальные системы. Помимо собственно вычислений они позволяют с блеском решать задачи, которые с трудом поддаются популярным текстовым редакторам или электронным таблицам. С их помощью можно не только качественно подготовить тексты статей, книг, диссертаций, научных отчетов, дипломных и курсовых проектов, они, кроме того, облегчают набор самых сложных математических формул и дают возможность представления результатов, в изысканном графическом виде.
С момента своего появления системы класса MathCAD имели удобный пользовательский интерфейс -- совокупность средств общения с пользователем в виде масштабируемых и перемещаемых окон, клавиш и иных элементов. У этой системы есть и эффективные средства типовой научной графики, они просты в применении и интуитивно понятны. Словом, системы MathCAD ориентированы на массового пользователя -- от ученика начальных классов до академика.
MatLab -- язык программирования и система научных и инженерных расчетов, построенная на основе интерпретатора этого языка. Matlab, сокращение от «Matrix Laboratory», предназначен в первую очередь для выполнения алгоритмов, использующих векторы и матрицы.
Matlab имеет большое число пакетов (toolboxes) -- как собственных, так и распространяемых независимыми разработчиками часто на условиях открытого кода. В Matlab включен Simulink -- визуальный редактор для моделирования динамических систем.
В конце прошлого века получила широкое распространение и сейчас быстро развивается система Mathematica. Ее успех в значительной степени объясняется ее широкими графическими возможностями, а также электронной документацией, которую можно рассматривать как электронную библиотеку, посвященную различным разделам математики и информатики. Mathematica имеет высокую скорость и практически не ограниченную точность вычислений, что позволяет ей работать как на очень мощных компьютерах, так и не очень сильных персональных компьютерах. Огромным достоинством программы Mathematica является справочная система. Она включает в себя не только очень качественное описание функций с примерами, а также учебник. В ней есть все материалы для тех кто только начинает работу с приложением, и для тех кто работает с ней очень давно.
Но часто бывает неудобно использовать вышеперечисленные программы для реализации конкретной задачи, каковой является решение СЛАУ, нахождение определителя и обратной матрицы. Иногда удобней реализовать задачу как отдельное приложение. В качестве языка программирования предполагается использовать среду визуального программирования Delphi.
Среди большого разнообразия продуктов для разработки приложений Delphi занимает одно из ведущих мест. В основе такой общепризнанной популярности лежит тот факт, что Delphi, как никакая другая система программирования, удовлетворяет изложенным выше требованиям. Delphi-приложения эффективны, если разработчик соблюдает определенные правила (и часто - если не соблюдает). Эти приложения надежны и при эксплуатации обладают предсказуемым поведением.
Пакет Delphi - продолжение линии компиляторов языка Pascal корпорации Borland. Pascal как язык очень прост, а строгий контроль типов данных способствует раннему обнаружению ошибок и позволяет быстро создавать надежные и эффективные программы.
Как язык Turbo Pascal естественно сравнивать с его ближайшими конкурентами - многочисленными вариациями на тему языка Basic и с C++. Я считаю, что Turbo Pascal существенно превосходит Basic за счет полноценного объектного подхода, включающего в себя развитые механизмы инкапсуляции, наследование и полиморфизм. Последняя версия языка, применяемая в Delphi, по своим возможностям приближается к C++. Из основных механизмов, присущих C++, отсутствует только множественное наследование. Плюсы применения языка Pascal очевидны: с одной стороны, в отличие от Visual Basic, основанного на интерпретации промежуточного кода, для него имеется компилятор, генерирующий машинный код, что позволяет получать значительно более быстрые программы. С другой - в отличие от C++ синтаксис языка Pascal способствует построению очень быстрых компиляторов.
1.3 Этапы разработки программных систем
Исходным этапом создания и является этап разработки требований, в процессе которого проводятся поисковые, исследовательские работы, формируется комплекс требований, выражающий потребности пользователя в конкретном ПИ. На данном этапе будущий комплекс программ тщательно анализируется с учетом выполняемых им функций и основных свойств, обосновывается целесообразность их разработки, предварительно оцениваются трудовые и стоимостные затраты и сроки создания, вырабатываются рекомендации по выбору инструментальных средств и методов. Обязательным в содержании данного этапа является также формирование требований к качеству программ в соответствии с условиями их функционирования и реализации конкретных функций. Выполнение этих работ в процессе формирования требований и формирование необходимых эксплуатационных свойств в ПИ на данном и последующих этапах их разработки позволяет предотвратить дополнительные расходы, вызванные модификацией программ при их внедрении и сопровождении.
Следующим этапом в создании программы является этап проектирования, в процессе которого требования пользователей формируются в более точном и конкретном виде.
Проектирование программ охватывает комплекс работ по разработке структуры программ и их компонентов; выбору языка программирования и конкретной конфигурации комплекса технических средств, на котором предполагается реализация разрабатываемой программы.
В процессе проектирования решается задача выбора оптимальной структуры программы, определяющая содержание и характер работ на последующих этапах разработки. На данном этапе качества ПИ обеспечивается конкретными решениями и зависит в основном от организации управления разработкой, квалификации специалистов, использованием перспективных методов, приемов, правил и средств проектирования программ.
После проектирования программ следует их кодирование. На практике эти этапы, как правило, частично перекрываются, т.е. за проектированием отдельных модулей выполняется их программирование, а затем, возможно, и предварительная проверка правильности функционирования разработанного модуля.
Программирование характеризуется большим числом разнообразных правил, приемов, методов и средств его выполнения, применение которых зависит от квалификации, опыта и индивидуальных особенностей программистов. В настоящее время существуют десятки языков программирования и средств автоматизации, облегчающих труд программистов и повышающих их производительность. К тому же создание и использование современных приемов программирования, средств автоматизации, проведение различных видов проверок и контроля программирования способствует предотвращению и выявлению значительного числа ошибок, что сокращает время и расходы на этапе отладки и тестирования программ, повышает их качество.
Этап отладки и тестирования программ, следующий за этапом программирования, имеет целью выявление и устранение ошибок в них, а также определения, в какой мере разработанные программы удовлетворяют требованиям, сформулированным в спецификациях.
Работы по отладке и тестированию программ характеризуются большой степенью повторяемости и являются наиболее утомительными и дорогостоящими. В связи с этим уделяется большое внимание разработке и использованию различных системных и инструментальных средств, автоматизирующих выполнение работ на данном этапе, что позволяет повысить качество разрабатываемых программ и снизить трудоемкость их создания. По оценкам специалистов на отладку и тестирование программ затрачивается до половины общих средств на разработку программ, что тем не менее не исключает наличие в них ошибок.
2. Разработка проекта системы
2.1 Описание алгоритма решения СЛАУ
Системы уравнений появляются почти в каждой области прикладной математики. В некоторых случаях эти системы уравнений непосредственно составляют ту задачу, которую необходимо решать, в других случаях задача сводится к такой системе. Например, для проведения кривой, наилучшим образом соответствующей экспериментальным данным, приходится решать систему линейных уравнений, для решения уравнений в частных производных, также требуется решать системы алгебраических уравнений. Существует множество других задач, сводящихся к решению систем алгебраических уравнений.
Далее мы будем рассматривать системы из n уравнений с n неизвестными. Каждый член такого уравнения содержит только одно неизвестное, и каждое неизвестное входит только в первой степени. Такая система уравнений называется линейной. В случае двух неизвестных каждое уравнение графически изображается прямой линией, в случае трех неизвестных ему соответствует плоскость в трехмерном пространстве, а для четырех и более неизвестных -- гиперплоскость. Искомое решение системы уравнений представляет собой набор значений неизвестных, удовлетворяющих одновременно всем уравнениям.
Рассмотрим один из наиболее известных и широко применяемых прямых методов решения систем линейных уравнений. Обычно этот метод называют методом исключения или методом Гаусса.
Если задана некоторая произвольная система уравнений, то без предварительного исследования нельзя сказать, имеет ли она какое-либо решение и, в случае если решение существует, является ли оно единственным. На этот вопрос существуют три и только три ответа,
1. Решение системы уравнений существует и является единственным.
2. Система уравнений вообще не имеет решения.
3. Система уравнений имеет бесконечное множество решений.
В методе Гаусса матрица СЛАУ с помощью равносильных преобразований преобразуется в верхнюю треугольную матрицу, получающуюся в результате прямого хода. В обратном ходе определяются неизвестные.
Пусть дана СЛАУ
(1)
Запишем расширенную матрицу системы:
(2)
На первом шаге алгоритма Гаусса выберем диагональный элемент (если он равен 0, то первую строку переставляем с какой-либо нижележащей строкой) и объявляем его ведущим, а соответствующую строку и столбец, на пересечении которых он стоит - ведущими. Обнулим элементы a21, …, an1 ведущего столбца. Для этого сформируем числа . Умножая ведущую строку на число , складывая со второй и ставя результат на место второй строки, получим вместо элемента a21 нуль, а вместо элементов , b2 - соответственно элементы , и т.д. Умножая ведущую строку на число , складывая с n-ой строкой и ставя результат на место n-ой строки, получим вместо элемента an1 нуль, а остальные элементы этой строки будут иметь вид: . Сохраняя ведущую строку неизменной, получим в результате 1-го шага алгоритма Гаусса следующую матрицу:
(3)
На втором шаге алгоритма Гаусса в качестве ведущего элемента выбирается элемент (если он равен нулю, то вторую строку взаимно меняем на нижележащую строку). Формируются числа , которые ставятся около ведущей строки. Умножая ведущую строку на число и складывая результат с третьей строкой, получим вместо элемента нуль, а вместо элементов , , - элементы , , и так далее. Умножая ведущую строку на число , складывая результат с n-ой строкой и ставя полученную сумму на место n-ой строки, получим вместо элемента нуль, а вместо элементов , , - элементы , . Сохраняя 1-ую и 2-ую строки матрицы неизменными, получим в результате второго шага алгоритма
Гаусса следующую матрицу:
(4)
После (n-1) - го шага алгоритма Гаусса получаем следующую расширенную матрицу, содержащую верхнюю треугольную матрицу СЛАУ:
(5)
Прямой ход алгоритма Гаусса завершен.
В обратном ходе алгоритма Гаусса из последнего уравнения сразу определяется xn, из предпоследнего - xn-1 и т.д. Из первого уравнения определяется x1.
(6)
Если элементы какой-либо строки матрицы системы в результате преобразований стали равными нулю, а правая часть не равна нулю, то СЛАУ несовместна, поскольку не выполняются условия теоремы Кронекера-Капелли.
Если элементы какой-либо строки матрицы системы и правая часть в результате преобразований стали равными нулю, то СЛАУ совместна, но имеет бесконечное множество решений, получающееся с помощью метода Гаусса для СЛАУ порядка r, где r - ранг матрицы исходной СЛАУ.
В результате прямого хода метода Гаусса можно вычислить определитель матрицы A исходной СЛАУ:
При этом с помощью множителя , где p - число перестановок строк в процессе прямого хода, учитываются соответствующие перемены знаков вследствие перестановок строк.
Метод Гаусса можно применить для обращения невырожденной () матрицы.
Действительно, пусть требуется обратить невырожденную матрицу , . Тогда, сделав обозначение , , , можно выписать матричное уравнение AX = E, где E - единичная матрица
, (7)
на основе которого можно записать цепочку СЛАУ
, , …, (8)
каждую из которых можно решить методом Гаусса. При этом, поскольку верхняя треугольная матрица для всех этих СЛАУ будет одной и то же, то метод Гаусса применяется один раз. Строится следующая расширенная матрица:
(9)
В результате применения (n - 1) - го шага метода Гаусса получаем:
(10)
При этом первый столбец обратной матрицы определяется в обратном ходе метода Гаусса с правой частью b1, столбец - с правой частью b2 и так далее. Столбец определяется с правой частью bn.
2.2 Компьютерная реализация алгоритма решения СЛАУ
программа листинг алгебраический уравнение
Компьютерная реализация метода Гаусса часто осуществляется с использованием LU-разложения матриц.
LU - разложение матрицы A представляет собой разложение матрицы A в произведение нижней и верхней треугольных матриц, т.е. , где L - нижняя треугольная матрица (матрица, у которой все элементы, находящиеся выше главной диагонали равны нулю, при ), U - верхняя треугольная матрица (матрица, у которой все элементы, находящиеся ниже главной диагонали равны нулю, uij = 0 при i > j).
LU - разложение может быть построено с использованием описанного выше метода Гаусса. Рассмотрим k - ый шаг метода Гаусса, на котором осуществляется обнуление поддиагональных элементов k - го столбца матрицы A(k-1). Как было описано выше, с этой целью используется следующая операция:
(1)
, , .
В терминах матричных операций такая операция эквивалентна умножению , где элементы матрицы Mk определяются следующим образом
. (2)
Т.е. матрица имеет вид
. (3)
При этом выражение для обратной операции запишется в виде , где
(4)
В результате прямого хода метода Гаусса получим ,
,
где - верхняя треугольная матрица, а - нижняя треугольная матрица, имеющая вид
. (5)
Таким образом, искомое разложение A = LU получено.
В частности, для рассмотренного выше примера 1. LU - разложение матрицы А имеет вид
В дальнейшем LU - разложение может быть эффективно использовано при решении систем линейных алгебраических уравнений вида Ax = b. Действительно, подставляя LU - разложение в СЛАУ, получим LUx = b, или Ux = L-1b. Т.е. процесс решения СЛАУ сводится к двум простым этапам.
На первом этапе решается СЛАУ Lz = b. Поскольку матрица системы - нижняя треугольная, решение можно записать в явном виде:
, , .
На втором этапе решается СЛАУ Ux = z с верхней треугольной матрицей. Здесь, как и на предыдущем этапе, решение представляется в явном виде:
, , .
Отметим, что второй этап эквивалентен обратному ходу методу Гаусса, тогда как первый соответствует преобразованию правой части СЛАУ в процессе прямого хода.
Рисунок 1 - Структурная схема
Рисунок 2 - Схема Шнейдермана
3. Реализация проекта
3.1 Требования к программе
Программа работает на ПК под управлением ОС Windows 95/98/Me или Windows NT/2000/XP/2003/Vista/Seven. Работа всех компонентов под управлением Windows 95 возможна только, начиная с версии Windows 95 OSR2 (v.4.00.950B). Минимальные требования к конфигурации ПК совпадают с таковыми для соответствующих ОС, однако корректная работа программы возможна только при наличии не менее 32 Мб оперативной памяти, установленной на компьютере. ПК должен полностью поддерживать систему команд процессора i80386.
Следует установить все рекомендуемые производителем ОС критические обновления. Если поддержка ОС производителем прекращена, рекомендуется перейти на более современную версию системы.
Размер свободного дискового пространства не менее 600 Кбайт (для выполняемого модуля программы).
3.2 Описание модульных структур
Программа состоит из четырех модулей: main - отвечает за вывод результатов выполнения программы, vvod - отвечает за ввод данных и загрузку текстового примера, gausss_lu - решение системы линейных уравнений, opro - содержит информацию о программе.
Совокупность данных модулей представляет собой монолитно-модульную структуру программы (рисунок 3).
Рисунок 3 - Монолитно - модульная структура программы
Сцепление модулей main и vvod - по образцу (3). Сцепление main и gausss_lu - по образцу (3). Сцепление main и opro - по данным (1).
Уровень связности модуля main - процедурный (сила связности 5), vvod - информационный (сила связности 9), gauss_lu - процедурный (сила связности 5), opro - функциональный (сила связности 10).
1) Модуль gauss_lu.
Типы: matr - двумерный массив действительных чисел максимальной размерности 1010. vect - одномерный массив действительных чисел максимальной размерности 10.
Процедура LU(A, n, L, U, norm) находит LU разложения.
Переменные: n (тип integer) - размерность матрицы, A (тип matr) - исходная матрица, norm (тип real) - норма матрицы, L, U (тип matr) - матрицы LU - разложения.
Процедура PRINT_MATR(A, n) выводит матрицу.
Переменные: n (тип integer) - размерность матрицы, A (тип matr) - исходная матрица.
Процедура SLU(L, U, n, B, x) решает системы линейных уравнений.
Переменные: n (тип integer) - размерность матрицы, L, U (тип matr) - матрицы LU - разложения. B (тип vect) - вектор правых частей. X (тип vect) - решение системы.
Процедура Det(L, U, n, d) вычисляет определитель.
Переменные: n (тип integer) - размерность матрицы, L, U (тип matr) - матрицы LU - разложения, d (тип real)- определитель матрицы.
Процедура Obr(L, U, n, O) обращает матрицу.
Переменные: n (тип integer) - размерность матрицы, L, U (тип matr) - матрицы LU - разложения. O (тип matr)- обратная матрица.
2) Модуль VVOD
Процедура SpinEdit1Change изменяет размеры таблицы ввода исходных данных.
Процедура FormCreate загружает тестовый пример.
3) Модуль MAIN.
Процедура aVyhodExecute позволяет выходить из программы.
Процедура aVvodExecute вызывает окно ввода данных.
Процедура aGaussExecute управляющая процедура метода Гаусса.
Процедура aOprgExecute выводит информацию о программе.
3.3 Описание диалога с пользователем
Для запуска необходимо выполнить следующую последовательность действий:
1) нажать кнопку «Пуск» «Выполнить» «Обзор»;
2) найти файл с именем GAUSS.EXE и установить на него указатель;
3) нажать «Ввести» «ОК».
После запуска на экране монитора компьютера появляется главное окно программы (рисунок 4).
Рисунок 4 - Вид экрана программы
Состав окна:
- главное меню, расположенное в верхней строке окна (рисунок 5).
Рисунок 5 - Состав главного меню
- инструментальная панель с кнопками управления, дублирующими наиболее часто используемые команды меню (рисунок 6).
Рисунок 6 - Инструментальная панель
- область вывода решения (рисунок 7).
Рисунок 7 - Область вывода решения
1. Ввод данных.
Пользователю необходимо выбрать из меню Файл команду Ввод данных (или нажать кнопку ввода данных). На экран выводится форма ввода (рисунок 8).
Рисунок 8 - Ввод данных
Пользователю необходимо ввести число уравнений системы - целое число от 1 до 10. После этого необходимо задать матрицу системы, вектор правых частей (последний столбец).
2. После ввода исходных данных пользователю необходимо из меню Решение выбрать команду Метод Гаусса (или нажать соответствующие кнопки инструментальной панели). Полученные результаты выводятся в окно вывода.
3. Выход из программы - меню Файл, команда Выход или кнопка закрытия окна.
3.4 Контрольный пример
Задание: Методом Гаусса решить систему линейных алгебраических уравнений Аx = b, найти определитель и обратную матрицу.
Найдем решение системы:
Прямой ход:
Обратный ход:
87/5 · x4 = 37/3; x4 = 185/261 ? 0,708812;
-5 · x3 - 33 · x4 = -5; x3 = -320/87 ? -3,67816;
1/3 · x2 + 2 · x3 + 20/3 ·x4 = 1; x2 = 2843/261 ? 10,8927;
-9 · x1 + 2 · x2 + 3 ·x3 - 5 ·x4 = 0; x1 = 209/261 ? 0,80076;
Найдем определитель матрицы:
det A = - 9 · 1/3 · (-5) · 87/5 = 261
Найдем обратную матрицу:
Прямой ход:
Обратный ход:
Рисунок 9 - Пример работы программы
Как видно из полученного решения оно совпадает с точным, что дает нам возможность убедиться в правильности работы разработанной программы.
Заключение
В результате выполнения курсовой работы на тему «Разработка программы решения систем линейных уравнений, вычисления определителя и обращения матриц» мной была разработана программа, реализующая решение СЛАУ методом Гаусса. В программе используются оригинальные процедуры которые обеспечивают возможность нахождения LU - разложения, корней уравнений, определителей и обращения матриц. Эти процедуры могут без изменений переноситься и использоваться программами в которых решаются задачи линейной алгебры.
Программа позволяет решать любые системы, имеющие порядок не выше 10. Причем, благодаря удобному пользовательскому интерфейсу, за один сеанс работы с программой, можно решать любое число систем.
Учитывая широкую распространенность систем линейных уравнений в различных областях науки и техники, разработанная программа значительно облегчает процесс их решения и сокращает необходимое на решение время.
Разработка программы производилась в среде визуального программирования Delphi, что позволило закрепить наиболее характерные приемы программирования, а также освоить работу с этой версией языка. К недостаткам программы можно отнести ограниченность порядка системы. Его можно устранить путем доработки процедуры ввода матрицы системы и вектора правых частей.
Список использованной литературы
1 Бидасюк Ю.М. Mathsoft MathCAD: самоучитель / Ю.М. Бидасюк. - М.: Диалектика, 2009. - 751 c.
2 Ваулин А.С. Языки программирования / А.С. Ваулин. - М.: Мир, 2003. - 248 с.
3 Вержбицкий В.М. Численные методы (линейная алгебра и нелинейные уравнения) / В.М. Вержбицкий. - М.: Высш. шк., 2000. - 433 c.
4 Глушаков С.В. Программирование на Delphi / С.В. Глушаков. -Харьков: Фолио, 2002. - 518 с.
5 Жоголев Е.А. Введение в технологию программирования (конспект лекций) / Е.А. Жоголев. - М.: «ДИАЛОГ-МГУ», 1994. - 286 с.
6 Калиткин В.Г. Численные методы / В.Г. Калиткин. - М.: Наука, 1978. - 398 с.
7 Д. Мак-Кракен. Численные методы и программирование на Фортране / Д. Мак-Кракен, У.Дорн. - М.: Мир, 1977. - 584 с.
8 Ракитин В.И. Практическое руководство по методам вычислений с приложением программ для персональных компьютеров / В.И. Ракитин, В.Е. Первушин. - М.: Высшая школа, 1998. - 383 с.
Приложение
Листинг программы
(Программная реализация решения систем СЛАУ. Модули программы: main, opro, gauss_lu, vvod).
1) Главный модуль main
{Модуль main является главным модулем программы. В этом модуле выводятся результаты выполнения программы, предоставляется доступ к модулям opro, gauss_lu, vvod.}
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ActnList, StdCtrls, ComCtrls, ToolWin, ImgList, XPMan;
type
TForm1 = class(TForm)
ActionList1: TActionList;
aOprg: TAction;
aVyhod: TAction;
aVvod: TAction;
aGauss: TAction;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton3: TToolButton;
Memo1: TMemo;
ImageList1: TImageList;
ToolButton2: TToolButton;
XPManifest1: TXPManifest;
procedure aVyhodExecute(Sender: TObject);
procedure aVvodExecute(Sender: TObject);
procedure aGaussExecute(Sender: TObject);
procedure aOprgExecute(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses gauss_lu, opro, vvod;
{$R *.dfm}
procedure TForm1.aVyhodExecute(Sender: TObject); //выход
begin
Close;
end;
procedure TForm1.aVvodExecute(Sender: TObject); //вызов окна ввода данных
begin
Form2.ShowModal;
end;
procedure TForm1.aGaussExecute(Sender: TObject); //управляющая процедура
var // метода Гаусса
i, j, k, //счетчики циклов
n: integer; //число уравнений системы
s, norm: real; //определитель, норма матрицы
O, //обратная матрица
A, //расширенная матрица коэффициентов системы размерности n x n+1
L, U: matr; //L,U матрицы LU-разложения
X, //вектор решения системы методом Гаусса
B: vect; //вектор правой части
fl: textfile; //файл вывода
Procedure PRINT_MATR(var A: matr; n: integer); //печать матрицы
var
i, j: integer;
begin
for i := 1 to n do
begin
for j := 1 to n do
Write(fl, a[i, j]:10:5);
WriteLn(fl);
end; end;
begin
n := Form2.SpinEdit1.Value; //размерность матрицы
for i := 1 to N do
begin //ввод значений
for j := 1 to N do
A[i, j]:=StrToFloat(Form2.sg1.Cells[j, i]);
B[i]:=StrToFloat(Form2.sg1.Cells[N + 1, i]);
end;
AssignFile(fl, 'resgauss'); Rewrite(fl);
WriteLn(fl, 'Исходная матрица:'); //вывод матрицы
PRINT_MATR(A, n);
WriteLn(fl, 'Правые части:'); //вывод правой части матрицы
for j := 1 to n do
WriteLn(fl, B[j]:10:5);
LU(A, n, L, U, norm); //вывод LU-разложения
if norm = 0 then
begin
WriteLn('Нет LU-разложения для A');
ReadLn;
Halt;
end;
WriteLn(fl, 'Результаты разложения A=LU');
WriteLn(fl, ' L-матрица:'); //вывод L-матрицы
PRINT_MATR(L, n);
WriteLn(fl, ' U-матрица:'); //вывод U-матрицы
PRINT_MATR(U, n);
WriteLn(fl, 'Контроль по LU=A:'); //вывод конрроля по LU
for i := 1 to n do
for j := 1 to n do
begin
s := 0;
for k := 1 to n do
s := s + l[i, k] * u[k, j];
a[i, j] := s;
end;
PRINT_MATR(A, n);
SLU(L, U, n, B, x);
WriteLn(fl, 'Решение системы'); //вывод решения системы
for i := 1 to n do
WriteLn(fl, 'X', i, '=', x[i]:7:5);
Det(L, U, n, s);
WriteLn(fl, 'Определитель матрицы det(A)=', s:7:5); //вывод определителя
Obr(U, L, n, O);
WriteLn(fl, 'Обратная матрица:'); //вывод обратной матрицы
PRINT_MATR(O, n);
CloseFile(fl);
Memo1.Lines.LoadFromFile('resgauss');
end;
procedure TForm1.aOprgExecute(Sender: TObject); //информация о программе
begin
Form3.ShowModal;
end; end.
2) Вычислительный модуль gauss_lu
{В модуле gauss_lu производятся все вычисления}
unit gauss_lu;
interface
type
matr = array [1..10,1..10] of real; //двумерный массив действительных чисел
vect = array [1..10] of real; //одномерный массив действительных чисел
Procedure Obr(L, U: matr; n: integer; var O: matr);
Procedure LU(A: matr; n: integer; var L, U: matr; var norm: real);
Procedure SLU(L, U: matr; n: integer; B: vect; var x: vect);
Procedure Det(L, U: matr; n: integer; var d: real);
implementation
Procedure LU(A: matr; n: integer; var L, U: matr; var norm: real); //нахождение //LU разложения
var
ii, p, i, j, k: integer;
s: real;
begin //норма строки
for p := 1 to n do
begin
norm := Abs(a[p, 1]);
for j := 1 to n do
if norm < Abs(a[p, j]) then
norm := Abs(a[p, j]);
if norm = 0 then
Exit;
end;
for i := 1 to n do //факторизация-разложение
for j := 1 to n do
begin
l[i, j] := 0;
u[i, j] := 0;
end;
for p := 1 to n do
begin
for i := p to n do
begin
s := 0;
for k := 1 to p - 1 do
s := s + l[i, k] * u[k, p];
a[i, p] := a[i, p] - s;
end;
u[p, p] := a[p, p];
l[p, p] := 1;
for ii := p + 1 to n do
begin
l[ii, p] := a[ii, p] / a[p, p];
s := 0;
for k := 1 to p - 1 do
s := s + l[p, k] * u[k, ii];
u[p, ii] := a[p, ii] - s;
end;
end;
end;
Procedure SLU(L, U: matr; n: integer; B: vect; var x: vect); //решение системы
var
i, j: integer;
g: vect;
s: real;
begin
g[1] := b[1];
for i := 2 to n do
begin
s := 0;
for j := 1 to i - 1 do
s := s + l[i, j] * g[j];
g[i] := b[i] - s;
end;
x[n] := g[n] / u[n, n]; //обратный ход
for i := n - 1 downto 1 do
begin
s := g[i];
for j := 1 to n do
s := s - x[j] * u[i, j];
x[i] := s / u[i, i];
end;
end;
Procedure Det(L, U: matr; n: integer; var d: real); //вычисление определителя
var
i: integer;
d1, d2: real;
begin
d1 := 1;
d2 := 1;
for i := 1 to n do
begin
d1 := d1 * L[i, i];
d2 := d2 * U[i, i];
end;
d := d1 * d2;
end;
Procedure Obr(L, U: matr; n: integer; var O: matr); //обращение матрицы
var
k, i, j, m: integer;
P, X1, X2: vect;
s: real;
O1, O2: matr;
begin
for i := 1 to N do
begin
for j := 1 to N do
P[j] := 0;
P[i] := 1;
X1[N] := P[N] / L[N, N];
m := N;
repeat
m := m - 1;
s := 0;
for j := m + 1 to N do
s := s + L[m, j] * X1[j];
X1[m] := (P[m] - s) / L[m, m];
until m <= 1;
X2[1] := P[1] / U[1, 1];
m := 1;
repeat
m := m + 1;
s := 0;
for j := 1 to m - 1 do
s := s + U[m, j] * X2[j];
X2[m] := (P[m] - s) / U[m, m];
until m >= N;
for j := 1 to N do
begin
O1[j, i] := X1[j];
O2[j, i] := X2[j];
end;
end;
for i := 1 to n do
for j := 1 to n do
begin
O[i, j] := 0;
for k := 1 to n do
O[i, j] := O[i, j] + O1[i, k] * O2[k, j];
end;
end;
end.
Размещено на Allbest.ru
Подобные документы
Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Алгоритм решения систем линейных уравнений методом Гаусса, его этапы. Система уравнений для определения коэффициентов сплайна, представляющая собой частный случай систем линейных алгебраических уравнений. Программная реализация, тестовый пример.
курсовая работа [431,8 K], добавлен 15.06.2013Метод Гаусса-Зейделя как модификация метода Якоби, его сущность и применение. Разработка программы решения системы линейных алгебраических уравнений на языке VB, проверка правильности работы программы в MS Excel и математических пакетах MathCad и MatLab.
курсовая работа [325,5 K], добавлен 27.10.2013Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Решение систем линейных алгебраических уравнений по методу Гаусса. Разработка прикладной программы формирования видеотеки с использованием технологии разработки программ "сверху-вниз". Алгоритм добавления, удаления и корректировки элемента видеотеки.
курсовая работа [305,0 K], добавлен 18.06.2012Решение систем алгебраических линейных уравнений методом Крамера. Сущность метода прогонки. Программная реализация метода: блок-схема алгоритма, листинг программы. Проверка применимости данного способа решения для конкретной системы линейных уравнений.
курсовая работа [581,0 K], добавлен 15.06.2013Преобразование матрицы системы линейных алгебраических уравнений (СЛАУ) с помощью алгоритма Гаусса. Решение задачи методом простой итерации. Создание блок-схемы и текста программы для решения СЛАУ, реализованной на языке программирования Turbo Pascal.
курсовая работа [1,2 M], добавлен 15.06.2013Системы линейных алгебраических уравнений. Решение систем уравнений графическим способом. Разработка программного кода модуля, реализующего приближенное решение систем линейных уравнений графическим способом. Отладка программного модуля "Метод Гаусса".
курсовая работа [858,5 K], добавлен 01.12.2013Решение систем алгебраических линейных уравнений методом Гаусса. Вычисление обратной матрицы и определителя. Декомпозиция задачи. Схема взаимодействия интерфейсных форм. Описание процедур и функций. Тестирование разработанного программного продукта.
курсовая работа [1,1 M], добавлен 05.06.2012Разработка программного продукта для решения систем линейных алгебраических уравнений методом Гаусса с помощью ЭВМ. Математическое описание объекта моделирования, начальные и граничные условия. Алгоритм реализации задачи. Использование модуля CRT.
курсовая работа [269,6 K], добавлен 07.01.2016