ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ВОСТОЧНО-СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ» ЭЛЕКТРОТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ Кафедра систем информатики Курсовая работа (Д.664.2.1.12.02.002.09.ПЗ) по дисциплине «Программирование на языке высокого уровня С/С++» Тема: «Решение системы линейных уравнений методом LUP-разложения» Выполнил: Руководитель: Улан-Удэ 2015 студент гр. д664 Болсобоев Б.Е. доцент кафедры СИ Хаптахаева Н.Б. Нормоконтролер: Андреева Н.В. Оценка: Дата защиты: _____________ _____________ Аннотация Тема курсовой работы посвящена разработке алгоритма решение системы 𝑛 линейных уравнений с 𝑛 неизвестными вида 𝐴𝑥 = 𝑏 методом LUP-разложения. В ходе работы было определено понятие LUP - разложения, описан метод решения задачи, входные и выходные данные, и был составлен эффективный алгоритм, записанный в виде блок-схемы. 2 Содержание Введение .........................................................................................................................................4 1 2 3 Теоретический материал .......................................................................................................5 1.1 Словесная постановка задачи ........................................................................................5 1.2 Анализ предметной области ..........................................................................................5 Проектный раздел ..................................................................................................................6 2.1 Формальная постановка задачи .....................................................................................6 2.2 Алгоритм решения задачи .............................................................................................8 Экспериментальный раздел ................................................................................................12 Заключение...................................................................................................................................14 Список использованных источников.........................................................................................15 3 Введение Системы линейных уравнений возникают в самых различных задачах. Такую систему можно записать в виде матричного уравнения 𝐴𝑥 = 𝑏. Если матрица не вырождена, то для нее найдется обратная матрица 𝐴−1 , и вектор 𝑥 = 𝐴−1 𝑏 является решением. Однако на практике этот подход очень часто сталкивается с вычислительной неустойчивостью (numerical instability): вещественные числа хранятся в памяти лишь приближённо и ошибки округления могут накапливаться. Другой подход – так называемое LUP разложение – в меньшей степени подвержен этой опасности, к тому же, работает он в три раза быстрее. Целями курсовой работы являются поиск эффективного метода решения, а также развитие и закрепление навыков логического мышления, приобретение навыков самостоятельной работы над проектом, включающее поиск, организацию и оформление необходимой информации. Для достижения целей работы был поставлены и решены следующие задач: 1. изучить предметную область задачи; 2. описать метод решения задачи; 3. реализовать алгоритм в виде блок-схемы; 4. провести тестирование алгоритма; 5. сделать вывод по проделанной работе. РПЗ состоит из ведения, трех глав и заключения. Во введении даны основные цели и задачи курсовой работы. Первая глава описывает постановку и предметную область задачи. Вторая глава – метод и алгоритм решения. Экспериментальный раздел представляет работоспособность алгоритма посредством тестирования. В заключении подведены итоги, обещающие все достоинства и недостатки. 4 1 Теоретический материал 1.1 Словесная постановка задачи Разработать эффективный алгоритм решения системы 𝑛 линейных уравнений с 𝑛 неизвестными вида 𝐴𝑥 = 𝑏 методом LUP-разложения. 1.2 Анализ предметной области LUP-разложение (LUP-декомпозиция) – представление данной матрицы 𝐴 в виде произведения 𝑃𝐴 = 𝐿𝑈, где матрица 𝐿 является нижнетреугольной с единицами на главной диагонали, 𝑈 – верхне-треугольная общего вида, а 𝑃 – матрица перестановок, получаемая из единичной матрицы путём перестановки строк или столбцов. Такое разложение можно осуществить для любой невырожденной матрицы. LUP-разложение используется для вычисления обратной матрицы по компактной схеме, вычисления решения системы линейных уравнений. По сравнению с алгоритмом LU-разложения алгоритм LUP-разложения может обрабатывать любые невырожденные матрицы и при этом обладает более высокой устойчивостью[1]. Зачем нужно LUP-разложение? Зная его, мы сводим систему 𝐴𝑥 = 𝑏 к двум системам с треугольными матрицами, а такие системы решаются просто. Вот как происходит сведение. Умножим обе части уравнения системы на 𝑃, получаем уравнение 𝑃𝐴𝑥 = 𝑃𝑏, а согласно произведению 𝑃𝐴 = 𝐿𝑈, мы имеем 𝐿𝑈𝑥 = 𝑃𝑏. Выразим 𝑈𝑥 = 𝑦, и нам останется решить две системы: 𝐿𝑦 = 𝑃𝑏, где мы найдем 𝑦, и следом 𝑈𝑥 = 𝑦, откуда мы и найдем конечный ответ. 5 2 Проектный раздел 2.1 Формальная постановка задачи Входные данные: 𝑛 – количество линейных уравнений и количество неизвестных 𝑥1 , 𝑥2 , . . . , 𝑥𝑛 в них; 𝐴 – матрица коэффициентов при неизвестных для всех линейных уравнений; 𝑏 – столбец свободных членов; Выходные данные: 𝑥1 , 𝑥2 , … , 𝑥𝑛 - неизвестные, которые надо определить, являющиеся решением СЛАУ. Метод решения: Для начала необходимо построить LUP – разложение невырожденной (𝑛 𝑥 𝑛) матрицы 𝐴. Опишем рекурсивный метод построения LUP – разложения. При 𝑛 > 1 (случай при 𝑛 = 1 – тривиален) разобьем матрицу 𝐴 на четыре части: 𝑎11 𝑎21 𝐴=( ⋮ 𝑎𝑛1 𝑎12 𝑎22 ⋮ 𝑎𝑛2 … 𝑎1𝑛 … 𝑎2𝑛 𝑎 ) = ( 11 ⋱ ⋮ 𝑣 … 𝑎𝑛𝑛 𝑤𝑇 ), 𝐴′ где 𝑣 – вектор столбец из 𝑛 − 1 элементов (𝑎21, 𝑎31 , … , 𝑎𝑛1 ), 𝑤 𝑇 – векторстрока из 𝑛 − 1 элементов (𝑎12, 𝑎13 , … , 𝑎1𝑛 ), 𝐴′ – матрица размера (𝑛 − 1) x (𝑛 − 1). Матрица состоящая из разности 𝐴′ − 𝑣𝑤 𝑇 /𝑎11 и называется дополнением Шура (Schur complement) элемента 𝑎11 в матрице 𝐴. Дополнение Шура – матрица размером (𝑛 − 1) x (𝑛 − 1), и мы можем найти для него LUP – разложение, таким образом, пройдясь по всей матрице рекурсивно. Конечно, при 𝑎11 = 0 метод не годится (деление на 0). По той же причине он не годится, если элемент в верхнем левом углу матрицы дополнения Шура равен нулю (с деления на него начинается рекурсивный вызов). Для решения этой проблемы используют понятие ведущих (pivots) 6 элементов и выбор ведущего элемента (pivoting). Ведущими называются те элементы, на которые мы делим в процессе построения LUP – разложения и которые будут расположены на главной диагонали матрицы 𝑈. Выбор ведущего элемента это перестановка уравнений системы, соответствующая матрице 𝑃, выбирающая наибольший по модулю элемент в первом столбце, во избежание деления на ноль и вычислительной неустойчивости. Рекурсивным методом, пройдясь по матрице 𝐴, получим матрицы 𝑈 и 𝐿, соответствующие верхне-треугольной матрице, и нижне-треугольной с единицами на главной диагонали. После построения LUP – разложения нам остается решить две системы с треугольными матрицами. Сначала из нижнетреугольной системы 𝐿𝑦 = 𝑃𝑏 мы найдем 𝑦 методом прямой подстановки, а затем из верхнетреугольной системы 𝑈𝑥 = 𝑦 найдем 𝑥 методом обратной подстановки. Вектор 𝑥 будет искомым решением [2]. Прямая подстановка (forward substitution) позволяет решить нижнетреугольную систему за время θ(𝑛2 ), пройдясь от первого уравнения к последнему. Матрица 𝐿 является нижне-треугольной с единицами на главной диагонали, поэтому система 𝐿𝑦 = 𝑃𝑏 имеет вид: 𝑦1 = 𝑏𝜋[1] , 𝑙21 𝑦1 + 𝑦2 = 𝑏𝜋[2] , 𝑙31 𝑦1 + 𝑙32 𝑦2 + 𝑦3 = 𝑏𝜋[3] , ………………………………………………… 𝑙𝑛1 𝑦1 + 𝑙𝑛2 𝑦2 + 𝑙𝑛3 𝑦3 + … + 𝑦𝑛 = 𝑏𝜋[𝑛] . Первое уравнение сразу дает нам значение 𝑦1 . Подставив его во второе уравнение, получим 𝑦2 . Теперь, подставив 𝑦1 и 𝑦2 в третье уравнение, получим 𝑦3 . И так далее: для получения 𝑦𝑖 подставим 𝑦1 , 𝑦2 , … , 𝑦𝑖−1 в -е уравнения и получим: 𝑖−1 𝑦𝑖 = 𝑏𝜋[𝑖] − ∑ 𝑙𝑖𝑗 𝑦𝑗 𝑗=1 7 Обратная подстановка (back substation) для уравнения 𝑈𝑥 = 𝑦 осуществляется аналогично, начиная с последнего уравнения, и так же требует времени θ(𝑛2 ). Матрица 𝑈 – верхне-треугольная, и система имеет вид: 𝑢11 𝑥1 + 𝑢12 𝑥2 + … + 𝑢1,𝑛−2 𝑥𝑛−2 + 𝑢1,𝑛−1 𝑥𝑛−1 + 𝑢1,𝑛 𝑥𝑛 = 𝑦1 , 𝑢22 𝑥2 + … + 𝑢2,𝑛−2 𝑥𝑛−2 + 𝑢2,𝑛−1 𝑥𝑛−1 + 𝑢2,𝑛 𝑥𝑛 = 𝑦2 , ........................................................................ 𝑢𝑛−2,𝑛−2 𝑥𝑛−2 + 𝑢𝑛−2,𝑛−1 𝑥𝑛−1 + 𝑢𝑛−2,𝑛 𝑥𝑛 = 𝑦𝑛−2 , 𝑢𝑛−1,𝑛−1 𝑥𝑛−1 + 𝑢𝑛−1,𝑛 𝑥𝑛 = 𝑦𝑛−1 , 𝑢𝑛,𝑛 𝑥𝑛 = 𝑦𝑛 . Мы последовательно вычисляем 𝑥𝑛 , 𝑥𝑛−1 , … , 𝑥1 по формулам 𝑥𝑛 = 𝑦𝑛 / 𝑢𝑛𝑛 , 𝑥𝑛−1 = (𝑦𝑛−1 − 𝑢𝑛−1,𝑛 𝑥𝑛 ) / 𝑢𝑛−1,𝑛−1 , 𝑥𝑛−2 = (𝑦𝑛−2 − (𝑢𝑛−2,𝑛−1 𝑥𝑛−1 + 𝑢𝑛−2,𝑛 𝑥𝑛 )) / 𝑢𝑛−2,𝑛−2 , ............................................................. или, в общем виде: 𝑛 𝑥𝑖 = (𝑦𝑖 − ∑ 𝑢𝑖𝑗 𝑥𝑗 ) / 𝑢𝑖𝑖 𝑗=𝑖+1 2.2 Алгоритм решения задачи Первым делом необходимо считать входные данные. Для этого опишем ввод переменных. Сначала считываем 𝑛 – колличество уравнений и неизвестных в них. Затем в двойномом цикле от 0 до 𝑛-1 считываем массив 𝐴 – массив коэффициентов при неизвестных. И наконец вектор 𝑏 – столбец свободных членов (рис. 1). 8 Рисунок 1 – Схема считывания входных данных Напишем процедуру LUP-Decomposition (рис. 2), осуществляющую LUP – разложение матрицы 𝐴. Вместо рекурсивного вызова функции будем использовать циклы. Матрицу перестановок 𝑃 представим массивом 𝐸, считая, что в -й строке 𝑃 единица стоит на 𝐸[𝑖]-м месте. Матрицы 𝐿 и 𝑈 будут вычисляться на месте матрицы 𝐴, и после работы процедуры 𝐴𝑖𝑗 = { 𝐿𝑖𝑗 , 𝑈𝑖𝑗 , если 𝑖 > 𝑗. если 𝑖 ≤ 𝑗. Вначале в массив 𝐸 помещается тождественная перестановка. Следующий за ней цикл заменяет рекурсию. В цикле изначально выбирается ведущий элемент для текущей матрицы (размера (𝑛 − 𝑘 + 1) x (𝑛 − 𝑘 + 1)), им будет 𝐴𝑣𝑘 . Если все элементы столбца нули, то матрица вырождена, и программа сообщает об ошибке. Затем происходит перестановка строк под номерами 𝑘 и 𝑣, из чего найденный ведущий элемент помещается в верхний левый угол матрицы. В матрице перестановок 𝐸 так же меняются элементы с номерами 𝑘 и 𝑣. Наконец, вычисляется дополнение Шура в соответствии с методом решения. 9 Рисунок 2 – Схема LUP – разложения Теперь решим систему с помощью прямой и затем обратной подстановкой. Для этого опишем процедуру LUP-Solve (рис. 3). В ней, по заданным 𝑃, 𝐿, 𝑈 и 𝑏, ищется 𝑥, делая прямую и затем обратную подстановку. Сначала делаем прямую подстановку для определения 𝑦, и затем обратную для 𝑥. Внутри каждого из двух циклов присутствуют циклы суммирования, от этого сложность алгоритма равна θ(𝑛2 ). 10 Рисунок 3 – Схема прямой и обратной подстановки Рисунок 4 – Схема вывода ответа Осталось вывести ответ СЛАУ, а именно 𝑥1 , 𝑥2 , … , 𝑥𝑛 . Для этого организуем цикл от первого до последнего элемента (рис. 4). 11 3 Экспериментальный раздел В качестве примера решим систему 𝐴𝑥 = 𝑏, где 1 2 0 𝐴 = (3 5 4) , 5 6 3 0,1 𝑏 = (12,5) , 10,3 а 𝑥 – вектор неизвестных [3]. Рассмотрим LUP – разложение матрицы 𝐴: 1 1 2 0 [ 2] 3 5 4 3 𝟓 6 3 (а) 5 6 3 [2] 0,6 𝟏, 𝟒 1 0,2 𝟎, 𝟖 (г) 0 (0 1 3 𝟓 𝟔 [2] 𝟑 5 1 𝟏 2 (б) 3 𝟐, 𝟐 −0,6 𝟑 4 0 𝟓 𝟔 𝟑 3 [2] 𝟎, 𝟔 1,4 2,2 1 𝟎, 𝟐 0,8 −0,6 (в) 5 6 3 3 𝟏, 𝟒 𝟐, 𝟐 [2] 0,6 1 0,2 𝟎, 𝟓𝟕𝟏 −1,856 (д) 1 0 0 5 1 2 0 0 1 1 0) (0 1 0) (3 5 4) = (0,6 0,2 0,571 1 0 0 0 5 6 3 𝑃 𝐴 𝐿 (и) 6 3 1,4 2,2 ) 0 −1,856 𝑈 (a) Изначально имеется исходная матрица 𝐴 и тождественная перестановка в столбце слева (одномерное представление матрицы 𝑃). На первом шаге ищем ведущий элемент, у нас он равен 5 и находится на третьей строчке. (б) Переставляем строки 1 и 3, одновременно меняя их в столбце перестановок. Выделенные столбец и строка представляют собой векторы 𝑣 и 𝑤 𝑇 . (в) Вектор 𝑣 заменен на вектор 𝑣/5, так же было вычислено дополнение Шура. Теперь матрица состоит из 3 частей: элементы 𝑈 сверху, элементы 𝐿 слева, и дополнение Шура (остальная часть матрицы). (г) Повторяем шаги а и б. (д) Ищем 𝑣/1,4 и дополнение Шура. На последнем шаге никаких изменений не происходит. (и) Разложение матрицы 𝐴 на 𝑃𝐴 = 𝐿𝑈. 12 Прямой подстановкой найдем 𝑦 из системы 𝐿𝑦 = 𝑃𝑏. Система имеет вид [1]: 𝑦1 1 0 0 10,3 1 0) (𝑦2 ) = (12,5) . (0,6 𝑦3 0,2 0,571 1 0,1 Вычисляя сначала 𝑦1 , затем 𝑦2 , и, наконец, 𝑦3 , получаем 10,3 𝑦 = ( 6,32 ) . −5,569 Теперь обратной подстановкой найдем 𝑥 из уравнения 𝑈𝑥 = 𝑦, которое имеет вид 𝑥1 10,3 5 6 3 𝑥 2,2 ) ( 2 ) = ( 6,32 ) . (0 1,4 𝑥3 −5,569 0 0 −1,856 Вычисляя последовательно 𝑥1 , 𝑥2 , и 𝑥3 , получим 0,5 𝑥 = (−0,2) . 3,0 Тестирование показало корректность работы алгоритма. 13 Заключение Для решения СЛАУ методом LUP-разложения в курсовом проекте было поставлено и решено множество целей. Основными из них являются: разложение матрицы 𝐴 и прямая/обратная подстановка. Алгоритм имеет как достоинства, так и недостатки. Основным недостатком является сложность алгоритма равная θ(𝑛2 ) и отражающаяся на времени решений больших матриц, но преимущество алгоритма заключается в высокой устойчивости при решении СЛАУ, что позволяет получить наиболее точный результат, чем при использовании других алгоритмов. 14 Список использованных источников 1. Кармен, Т. Алгоритмы: построение и анализ : Пер. с англ. / под ред. Ф. Шеня, Т. Кармен, Ч. Лейзерсон, Р. Ривест – М.: МЦНМО, 2002. – 960 с.: 263ил. 2. Кирьянов, Д.В., Кирьянова, Е.Н. Вычислительная физика / Д.В. Кирьянов, Е.Н. Кирьянова – М.: Полибук Мультимедиа, 2006. – 352 с.: ил. 3. Левитин, А. В. Алгоритмы: введение в разработку и анализ (Introduction to The Design & Analysis of Algorithms). / А. В. Левитин – М.: Вильямс, 2006. – 576 с. 15