ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

advertisement
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВОСТОЧНО-СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ»
ЭЛЕКТРОТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ
Кафедра систем информатики
Курсовая работа
(Д.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
Download