Решение системы линейных уравнений методом Гаусса

advertisement
Лабораторная работа 2
Решение системы линейных уравнений методом Гаусса
1. Постановка задачи
При выполнении лабораторной работы предлагается разработать программный
комплекс для поиска методом Гаусса [12] решений систем линейных уравнений вида
A*x = b,
(3.1)
где А - числовая неособая (т.е. имеющая не равный нулю детерминант) квадратная
матрица размером N на N, b - числовой вектор-столбец размером N, а x - искомый векторстолбец размером N. Программный комплекс должен обеспечивать:
 задание пользователем исходной системы уравнений в диалоге или с помощью
генератора псевдослучайных чисел;
 решение полученной системы уравнений методом Гаусса;
 экранное отображение формирующейся системы уравнений, результата и
промежуточной контрольной информации.
При разработке программ следует обратить внимание на следующие основные
моменты создания программного обеспечения:
- на организацию контроля правильности работы программ. Для этого
создаваемый программный комплекс должен выводить некоторые промежуточные
результаты расчетов (например, вид матрицы после исключения очередного неизвестного
или после окончания прямого хода метода Гаусса) и выдавать на экран дисплея
погрешность
получаемого
решения
в
виде
вектора
невязки
U =b - A*x’ ,
где x’ есть приближенное (т.е. полученное при помощи метода Гаусса) решение системы
(3.1);
- на обеспечение удобного человеко-машинного взаимодействия при задании
исходных данных; для этого программный комплекс должен высвечивать в процессе
ввода информации на экране дисплея матрицу А и вектор b (например, в виде
прямоугольной таблицы), обеспечивать возможность указания и редактирования значений
при помощи клавиатуры или при помощи манипулятора мышь.
2. Рекомендации по выполнению работы
Программный комплекс должен обеспечивать поиск решения системы линейных
уравнений по методу Гаусса для квадратной матрицы А произвольного размера N на N и
вектора b, содержащего N элементов, где N может принимать значения от 1 до 10.
Разработка программного комплекса предполагает создание двух типов модулей. К
первому типу модулей относятся вычислительные программы. Второй тип модулей
образуют вспомогательные программы.
3.1. Ввод исходных данных
При вводе исходных данных может быть рекомендована следующая схема
организации диалога. Исходная система уравнений (матрица А и вектор b) задается на
экране дисплея в виде прямоугольной таблицы (см. рис. 3.1). Ввод информации должен
обеспечиваться в любой последовательности элементов. Перед началом ввода системы
линейных уравнений на экране дисплея может отображаться единичная матрица и вектор,
все элементы которого равны единице. С помощью клавиш управления курсором должно
обеспечиваться перемещение от одного элемента к другому. Начало редактирования
может происходить, например, после нажатия любой алфавитно-цифровой клавиши. При
этом текущий элемент системы уравнений (редактируемый элемент) отображается на
экране другим цветом, отличным от стандартного (на рис. 3.1 редактируемым элементом
является элемент A[I,K]). Конец формирования матрицы можно связать с нажатием одной
из клавиш, например, ESC.
A[1,1]
A[1,2]
...
...
A[1,N]
X1
B[1]
A[2,1]
A[2,2]
...
...
A[2,N]
X2
.
.
.
.
.
.
B[2]
][
.
.
.
.
.
.
A[I,1]
.
.
.
A[I,2]
.
.
.
.
.
.
A[N,1]
A[N,2]
...
... A[I,N]
A[I,K]
...
...
XI
=
.
.
.
.
.
.
.
.
.
A[N,N]
XN
B[N]
Рис 3.1. Окно просмотра при редактировании системы уравнений
Должна быть предусмотрена возможность формирования системы линейных
уравнений и случайным образом с помощью генератора псевдослучайных чисел. При
этом первоначально на экране дисплея отображаются матрица А и вектор b,
сформированные при помощи генератора псевдослучайных чисел. Программный
комплекс должен предусматривать процесс возможного дальнейшего редактирования
данной системы уравнений по схеме редактирования, изложенной выше.
3.2. Метод Гаусса
Метод Гаусса для решения системы линейных уравнений состоит в приведении
матрицы А посредством эквивалентных преобразований (не меняющих решение системы
[12]) к треугольному виду и последующему поиску решений для вновь полученной
матрицы. Краткая схема первой части метода Гаусса - прямого хода - состоит в
следующем.
Алгоритм прямого хода.
Шаг 1. Движение по главной диагонали матрицы А.
В цикле по переменной I от 1 до N выполняются Шаг 2 - Шаг 8.
Шаг 2. Выбор главного элемента. Полагается R:=A[I, I]. Если R=0, то реализуется
процедура поиска главного элемента (см. п. 3.3.).
Шаг 3. Преобразование текущей строки матрицы путем деления всех значений ее
элементов на главный элемент. В цикле по переменной J от I до N выполняются
вычисления
A[I, J]:= A[I, J] / R.
Шаг 4. Преобразование правой части системы - вектора b.
b[I]:= b[I] / R.
Шаг 5. Вычитание текущей строки из всех ниже расположенных строк с занулением I ого элемента в каждой из них. В цикле по K от I + 1 до N выполняются Шаг 6 Шаг 8.
Шаг 6. Полагается R:= A[K, I].
Шаг 7. Вычитание из очередной строки текущей строки. В цикле по J от I до N делаем
A[K, J]:= A[K, J] - A[I, J]* R.
Шаг 8. Корректировка правой части системы - вектора b.
b[K]:= b[K] - b[I]*R.
Конец алгоритма.
Пример. Для демонстрации работы прямого хода метода Гаусса приведем пример
решения системы линейных уравнений.
Пусть исходная система уравнений имеет вид:
3*x - 9*y + 3*z = -18
2*x - 4*y + 4*z = -10
x + 8*y - 18*z = 35.
Первый этап алгоритма прямого хода метода Гаусса приводит систему к виду:
x - 3*y +
z = -6
0 + 2*y + 2*z = 2
0 + 11*y - 19*z = 41.
После второго этапа система уравнений принимает вид:
x - 3*y +
z = -6
0 +
y +
z = 1
0 +
0 - 30*z = 30.
Третий этап алгоритма прямого хода метода Гаусса приводит систему к виду:
x - 3*y +
z = -6
0 +
y +
z = 1
0 +
0 +
z = -1.
Конец примера.
Схема получения решения системы по приведенной треугольной матрице - обратный
ход метода Гаусса - состоит в следующем.
Алгоритм обратного хода.
Шаг 1. Поиск, начиная с последнего, всех неизвестных системы - элементов вектора x. В
цикле по переменной I от N до 1 выполняются Шаг 2 - Шаг 3.
Шаг 2. Задается начальное значение элемента x[I].
x[I]:= b[I] .
Шаг 3. Корректируется искомое значение x[I]. В цикле по J от I+1 до N (в случае, когда
I=N, этот шаг не выполняется) производятся вычисления x[I]:= x[I] - x[J]* A[I, J].
Конец алгоритма.
Пример. Применение обратного хода метода Гаусса к рассмотренному выше примеру
приводит к выполнению вычислений.
Первый шаг алгоритма обратного хода получит уравнение
z=-1.
Второй шаг алгоритма приведет к уравнению
y=1-z
или
y= 2.
Третий шаг алгоритма даст решение
x=-6 +3*y -z или
x= 1.
Таким образом, решение исходной системы уравнений имеет вид:
x=1; y=2; z=-1.
Конец примера.
3.3. Алгоритмы выбора главного элемента в методе Гаусса
При выполнении лабораторной работы предполагается реализовать три способа для
поиска главного элемента. Первый из них - упрощенный - приводит к завершению
выполнения метода Гаусса при получении нулевого значения диагонального элемента
(данный способ рекомендуется использовать на начальном этапе разработки программ).
Второй алгоритм состоит в поиске первого ненулевого элемента в текущей строке с
перестановкой столбцов матрицы А. Последний вариант поиска главного элемента
заключается в поиске максимального по модулю элемента текущей строки с
использованием индексации столбцов (без их перестановки).
3.3.1. Упрощенный алгоритм поиска главного элемента
Упрощенный алгоритм заключается только в том, что в случае, когда выбранный
главный элемент (R=A[I,I] ) равен нулю (R=0), выдается диагностическая распечатка с
сообщением, что данная система уравнений не может быть решена с помощью данного
варианта программы и выполнение метода Гаусса завершается. Понятно, что этот вариант
алгоритма можно использовать только на начальных этапах отладки программного
комплекса.
3.3.2. Алгоритм поиска главного элемента с перестановкой столбцов
Для выполнения данного алгоритма требуется вспомогательный массив индексов
Index, значения элементов которого будут определять для каждой строки матрицы А
номер столбца, содержащего главный элемент матрицы А (что соответствует также
порядку расположения неизвестных в преобразованной системе). Начальные значения
элементов массива Index должны соответствовать порядку расположения неизвестных в
исходной системе уравнений, т.е. Index[I]=I, где I меняется от 1 до N. Тогда схему поиска
главного элемента можно представить в виде:
Начало алгоритма.
Шаг 1. Если главный элемент R=A[I, I] равен нулю, то в остальных элементах этой строки
ищется первый ненулевой элемент. Если такой найден и его номер равен K, то
меняются местами соответствующие I -ый и K -ый элементы массива Index и
столбцы матрицы А.
Шаг 2. Если ненулевой элемент не найден (строка содержит только нулевые значения), то
печатается сообщение, что система не имеет решений (если b[I] не равно нулю)
или имеет множество решений (при b[I]=0).
Конец алгоритма.
Приведенный алгоритм должен быть использован в качестве второго шага (Шаг 2)
алгоритма прямого хода метода Гаусса. При этом алгоритм прямого хода должен быть
расширен дополнительным шагом, в котором задаются начальные значения массива Index.
Назовем дополнительный шаг как Шаг 0.
Шаг 0. Для этого в цикле по переменной I от 1 до N делаем Index[I]:=I.
После окончания работы метода Гаусса при такой схеме поиска главного элемента
значение неизвестной x с номером i в исходной системе уравнений находится в элементе
вектора x c индексом Index[I] (т.е. в x[Index[I]]).
Пример. Для иллюстрации работы этого алгоритма рассмотрим следующий пример.
Пусть первый этап алгоритма прямого хода метода Гаусса приводит систему к виду:
x - 3*y +
z = -6
0 +
0 - 2*z = 2
0 + 11*y - 20*z = 42.
При этом вспомогательный массив индексов содержит начальные значения
Index[1] = 1
Index[2] = 2
Index[3] = 3.
Значение главного элемента A[2,2] равно нулю. Алгоритм поиска главного элемента во
второй строке найдет ненулевой элемент в третьем столбце (K=3). Меняем переменные y
и z местами, т.е. осуществляем перeстановку второго и третьего столбцов матрицы А.
После чего получаем
x +
z - 3*y = -6
0 - 2*z +
0 = 2
0 - 20*z + 11*y = 42.
При этом вспомогательный массив индексов получит новые значения:
Index[1] = 1
Index[2] = 3
Index[3] = 2.
Дальнейшие вычисления производятся по приведенной выше схеме метода Гаусса и после
обратного хода будет получено решение исходной системы
x = 1; y = 2; z = -1.
Конец примера.
3.3.3. Алгоритм поиска главного элемента с индексацией номера столбца
элемента матрицы
Предыдущий вариант алгоритма не имеет ограничений и может использоваться для
произвольной системы уравнений. Вместе с этим можно заметить, что перестановка
столбцов матрицы приводит к дополнительным вычислительным затратам при
выполнении метода Гаусса (в случае большого количества неизвестных в системе
линейных уравнений).
Для снижения трудоемкости вычислений в силу того, что нас интересует порядок
использования столбцов, а не их место в матрице, целесообразно в качестве индекса,
определяющего для элемента матрицы А номер столбца матрицы, использовать значение
одномерного массива Index (см. п. 3.3.2.). Тогда перестановку столбцов матрицы можно
заменить перестановкой двух элементов этого массива (сократив, тем самым, значительно
время вычислений). При этом для доступа к элементам матрицы А в качестве номера
столбца следует использовать значения, хранящиеся в элементах массива Index. Тогда,
чтобы получить значение элемента матрицы А для I-ого уравнения и J-ой переменной,
необходимо обратиться к элементу массива A[I, Index[J]], а главный элемент исключения
находится в элементе A[I, Index[I]] (см. Рис 3.2).
K=Index [I] - номер столбца
A[1,1]
A[1,2]
...
A[1,N]
A[2,1]
A[2,2]
...
A[2,N]
...
...
...
A[I,1]
...
...
A[I,2]
A[I,K]
...
...
A[I,N]
...
I- номер строки
строкистроки
A[N,1]
A[N,2]
...
...
A[N,N]
Рис 3.2. Вид матрицы А при выборе главного элемента
При реализации такого способа поиска главного элемента рекомендуется обратить
внимание на вопросы точности вычислений. В связи с конечностью представления на
ЭВМ множества действительных чисел [12] выполнение расчетов осуществляется с
ограниченной точностью (так, например, для типа Real в алгоритмическом языке Паскаль
число значащих цифр составляет порядка 11-12 цифр). При проведении вычислений
погрешность может нарастать и для доказательства корректности реализации алгоритмов
на ЭВМ необходим анализ полученной точности результатов. Для операции деления
погрешность расчетов может быть уменьшена при увеличении модуля делителя. Как
результат, в алгоритме прямого хода метода Гаусса при выборе главного элемента
исключения целесообразно в качестве главного элемента в строке выбирать элемент,
имеющий максимально большее значение по модулю.
Предлагаемый алгоритм поиска главного элемента состоит в следующем.
Определяется массив Index, значения элементов которого будут определять для каждой
строки матрицы А номер столбца, содержащего главный элемент матрицы А. Начальные
значения элементов массива Index должны соответствовать порядку расположения
неизвестных в исходной системе уравнений, т.е. Index[I]=I, где I меняется от 1 до N. Тогда
схему поиска главного элемента можно представить в виде
Начало алгоритма.
Выбор главного элемента. Полагаем R:=A[I, Index[I]]. Если R=0, то в i-ой строке
массива А ищется максимальный по модулю элемент (расположение элементов
определяется индексами, хранящимися в массиве Index). Т.е., начиная с J:= (I + 1) ого элемента массива Index до элемента с номером N, ищется такой элемент, для
которого значение модуля элемента A[I, Index[J]] матрицы А принимает
максимальное значение среди всех аналогичных рассматриваемых значений. Если
такой элемент найден и его номер равен K, а значение по модулю найденного
элемента не равно нулю, то меняются местами элементы массива
Val:=Index[I]; Index[I]:=Index[K]; Index[K]:=Val;
Затем полагается главный элемент равным R:=A[I, Index[I]].
Шаг2. В противном случае, если найденное значение элемента по модулю равно нулю, в
зависимости от того, равен ли нулю элемент b[I], выдаются два разных
диагностических сообщения о несовместности исходной системы уравнений или о
наличии множества решений по аналогии с рассмотренными случаями в пункте
3.3.2.
Конец алгоритма.
Шаг1.
Данный алгоритм должен быть использован в качестве второго шага (Шаг 2)
алгоритма прямого хода метода Гаусса. При этом алгоритм прямого хода должен быть
расширен дополнительным шагом, в котором задаются начальные значения массива Index.
Назовем дополнительный шаг как Шаг 0.
Шаг 0. В цикле по переменной I от 1 до N делаем Index[I]:=I.
Для применимости рассмотренной схемы поиска главного элемента во всех остальных
шагах алгоритма необходимо заменить индексы матрицы А по следующему правилу:
A[I, J] на A[I, Index[J]].
После окончания работы метода Гаусса при такой схеме поиска главного элемента
значение неизвестной x с номером i в исходной системе уравнений находится в элементе
вектора x c индексом Index[I] (т.е. в x[Index[I]]).
3.3.4. Алгоритм поиска главного элемента с индексацией строк и столбцов
матрицы +)
Предыдущий вариант алгоритма поиска главного элемента предполагал индексацию
только номера столбца исходной матрицы и осуществлялся поиск максимального по
модулю элемента в заданной строке. Аналогично, можно осуществлять поиск
+)
Задача повышенной сложности, может рассматриваться как тема дополнительного задания
максимального по модулю элемента во всей подматрице матрицы А, а не только в строке.
Понятно, что при этом значение модуля главного элемента во всей подматрице больше
или равно значению модуля любого элемента в текущей строке. Таким образом, в случае
такого выбора точность вычислений, проводимых по методу Гаусса, должна повыситься.
Для организации такого поиска целесообразно в качестве индексов, определяющих строку
и столбец матрицы, использовать два одномерных массива, например, Index1 и Index2.
Массив Index1 будет содержать последовательность номеров уравнений в исходной
системе, а массив Index2 - последовательность номеров неизвестных исходной системы.
Выполнение прямого хода метода Гаусса может вызвать изменение порядка уравнений и
неизвестных исходной системы. Структуру поиска главного элемента в этом случае
рекомендуется осуществлять по аналогии с предложенным методом, используемым в
алгоритме пункта 3.3.3. Разработку этого алгоритма и реализацию по нему программы
предлагается рассматривать в качестве самостоятельного задания повышенной сложности
в данной лабораторной работе.
3.4. Рекомендации по организации интерфейса
Набор основных действий программного комплекса может состоять в следующем:
 задание размера системы линейных уравнений ;
 формирование новой системы уравнений в диалоговом режиме;
 формирование новой системы уравнений генератором псевдослучайных чисел;
 редактирование системы уравнений;
 реализация прямого хода метода Гаусса;
 реализация обратного хода метода Гаусса;
 решение системы уравнений методом Гаусса;
 вычисление вектора невязки;
 реализация контрольного режима решения системы уравнений;
 получение справочной информации;
 выход из программного комплекса.
После выбора команды меню должны быть выполнены необходимые для исполнения
выбранной команды действия. Для демонстрации результатов выполняемых действий
используется окно просмотра. Завершение действия и смену окна просмотра
рекомендуется осуществлять по нажатию клавиши ESC. При завершении исполнения
команды на экране должно снова появиться меню управления программой. После чего
доступными опять становятся команды основного меню.
При реализации контрольного режима процедуры решения первым шагом
производится формирование матрицы А и вектора решения x с помощью генератора
псевдослучайных чисел. Вторым шагом умножением матрицы A на вектор x находится
правая часть системы уравнений - вектор b. После чего по методу Гаусса ищется решение
(вектор x1) полученной системы уравнений, которое выводится на экран совместно с
отображением вектора x. С помощью визуального сравнения векторов x и x1 можно
сделать вывод о точности работы алгоритма метода Гаусса.
4. Рекомендации по организации программного комплекса
Разработку программного комплекса рекомендуется осуществить в виде комплекса
взаимодействующих модулей (см. рис. 3.3), включающего:
 модуль RootLib представляет собой интерфейсную секцию, в которой описываются
основные структуры данных программного комплекса;
 модуль MatrLib содержит программы для реализации необходимых матричных
операций программного комплекса;
 модуль DemoLib обеспечивает функции отображения промежуточной и
результирующей информации на экране дисплея;
 модуль GaussLib содержит программы, реализующие метод Гаусса;
 управляющую программу - монитор.
Управляющая программа монитор
MatrLib
библиотека
матричных
операций
DemoLib
библиотека
демонстрационных
средств
GaussLib
библиотека
вычислительного
метода Гаусса
RootLib
библиотека
основных типов и
структур данных
Рис 3.3. Структурная схема программного комплекса
Данные рекомендуется объявлять следующим образом:
#define MAX_SIZE 20 /* максимальный размер */
int n;
/* размер матрицы */
float a[MAX_SIZE][MAX_SIZE]; /* матрица a */
float b[MAX_SIZE]; /* вектор b */
float x[MAX_SIZE]; /* вектор x */
5. Задания
Основное задание:
Реализовать метод Гаусса для решения систем линейных уравнений, не учитывая
возможность обнуления главного элемента в ходе решения.
Дополнительное задание:
Реализовать метод Гаусса для решения систем линейных уравнений, учитывая
возможность обнуления главного элемента в ходе решения. Реализовать алгоритм
поиска главного элемента с индексацией строк и столбцов матрицы.
Download