|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
П 3.2 Метод Гаусса с выбором главного элемента для решения систем линейных алгебраических уравнений
Имеем систему линейных алгебраических уравнений:
(1)
или в матричном виде AX = f, (2) где А – вещественная квадратная матрица порядка n, f – заданный В методе Гаусса возможность проведения процесса исключения гарантируется условием неравенства нулю главных миноров матрицы А , , …, .
Однако при вычислениях заранее неизвестно, все ли главные миноры матрицы А отличны от нуля. При этом может оказаться, что система (1) имеет единственное решение, несмотря на то, что какой-либо из главных миноров матрицы А равен нулю. Кроме того, фиксация ведущего элемента в случае его относительной малости может привести в процессе вычислений к сильному накоплению погрешностей. Избежать таких ситуаций позволяет метод Гаусса с выбором главного элемента. Основная идея метода Гаусса с выбором главного элемента состоит в том, чтобы на очередном шаге исключать не следующее по номеру неизвестное, а то неизвестное, коэффициент при котором является наибольшим по модулю. Таким образом, в качестве ведущего элемента здесь выбирается главный, т.е. наибольший по модулю элемент. На практике обычно используются следующие варианты метода Гаусса с выбором главного элемента [19]: 1) метод Гаусса с выбором главного элемента по строке.Ведущий элемент на k -ом шаге исключения выбирается как максимальный по модулю среди элементов k -ой строки. Это равносильно перенумерации переменных на каждом этапе исключения; 2) метод Гаусса с выбором главного элемента по столбцу.Ведущий элемент на k -ом шаге исключения выбирается как главный элемент k -ого столбца. Такой вариант метода Гаусса предусматривает перенумерацию уравнений на каждом этапе исключения; 3) метод Гаусса с выбором главного элемента по всей матрице.Ведущий элемент на k -ом шаге исключения выбирается как максимальный по модулю среди всех элементов неприведенной части матрицы, т.е. главный элемент по матрице. Такой вариант предусматривает на каждом этапе исключения соответствующую перенумерацию переменных и перестановку уравнений.
Пример 1. Решить систему уравнений методом Гаусса с выбором главного элемента по столбцу. Решение: Прямой ход. Максимальным по модулю среди элементов первого столбца является элемент второй строки . Переставим 1-е и 2-е уравнения, переместив, таким образом, выбранный элемент на место ведущего.
Проводим первый шаг исключения, как в методе Гаусса. Имеем Максимальным по модулю среди элементов второго столбца является элемент третьей строки . Переставим 2-е и 3-е уравнения. Получим Проводим второй шаг исключения. Имеем Разделим третье уравнение на 6.002, получим В результате применения обратного хода, имеем , , . Рассмотрим метод Гаусса с выбором главного элемента на основе факторизации. Матрицей перестановок Р называется квадратная матрица, у которой в каждой строке и в каждом столбце только один элемент отличен от нуля и равен единице. Элементарной матрицей перестановок называется матрица, полученная из единичной матрицы перестановкой k -й и l -й строк. Например, элементарными матрицами перестановок третьего порядка являются матрицы
, , .
Отметим следующие свойства элементарных матриц перестановок, вытекающие непосредственно из их определения [19]: · Произведение двух (а следовательно, и любого числа) элементарных матриц перестановок является матрицей перестановок (не обязательно элементарной). · Для любой квадратной матрицы А матрица отличается от А перестановкой k -й и l -й строк. · Для любой квадратной матрицы А матрица отличается от А перестановкой k -го и l -го столбцов. Поясним применение элементарных матриц перестановок для описания метода Гаусса с выбором главного элемента по столбцу. Рассмотрим следующий пример системы третьего порядка: (3)
Матрица системы имеет вид
. (4)
Максимальный элемент первого столбца матрицы А находится во второй строке. Поэтому в системе (3) необходимо поменять местами первую и вторую строки и перейти к эквивалентной системе (5) Систему (5) можно записать в виде
, (6)
т.е. система (6) получается из системы (3) путем умножения на матрицу перестановок . Далее, к системе (5) надо применить первый шаг обычного метода исключения Гаусса, для того чтобы привести матрицу системы к виду . Этот шаг эквивалентен умножению матрицы системы (6) слева на элементарную нижнюю треугольную матрицу , т.е. в нашем случае . В результате от (6) перейдем к системе
. (7) Имеем: (8) Из последних двух уравнений системы (8) необходимо исключить неизвестное х2. Максимальным элементом второго столбца системы (8) является элемент третьей строки. Следовательно, в системе (8) необходимо поменять местами вторую и третью строки и тем самым перейти к эквивалентной системе (9) (9) которую можно записать в матричном виде как
. (10) Таким образом, система (10) получена применением к системе (7) элементарной матрицы перестановок . Далее, к системе (10) необходимо применить второй шаг исключения обычного метода Гаусса, для того чтобы привести матрицу системы к виду . Этот шаг эквивалентен умножению матрицы системы (10) слева на элементарную нижнюю треугольную матрицу , т.е. для данного примера .
В результате получим систему
(11) или (12) Заключительный шаг прямого хода метода Гаусса состоит в замене последнего уравнения системы (12) уравнением . Что эквивалентно умножению (11) на матрицу , т.е в нашем случае . Таким образом, для рассмотренного примера процесс исключения Гаусса с выбором главного элемента по столбцу записывается в виде
. (13) В результате получим систему (14) По построению матрица
(15)
является верхней треугольной матрицей с единичной главной диагональю. Для нахождения неизвестных к системе (14) применяется обратный ход обычного метода Гаусса. Отличие метода Гаусса с выбором главного элемента по столбцу (строке, всей матрице) от обычного метода Гаусса состоит в том, что в качестве сомножителей в (15) наряду с элементарными треугольными матрицами Lk могут присутствовать элементарные матрицы перестановок Рkl. Метод Гаусса с выбором главного элемента по столбцу эквивалентен обычному методу Гаусса, примененному к системе, полученной из исходной системы перестановкой уравнений РАХ = Рf. (16)
Справедливо разложение [19]
РА = LU, (17)
где L – нижняя треугольная матрица с отличными от нуля диагональными элементами и U – верхняя треугольная матрица с единичной главной диагональю. Следует подчеркнуть, что в методе Гаусса с выбором главного элемента по столбцу (строке, всей матрице) матрица Р не задается заранее, а строится в процессе исключения.
Пример 2. Описать алгоритм метода Гаусса с выбором главного элемента по столбцу на основе факторизации. При описании алгоритма использовать объекты и методы классов «SquareMatrix», «Vector», «AugmentMatrix» и «SwapMatrix». При реализации метода эффективнее использовать расширенную матрицу системы и проводить необходимые преобразования над ней. Приведем возможное описание класса «AugmentMatrix» (Расширенная матрица) на языке программирования С++.
/* Класс «AugmentMatrix»*/ class AugmentMatrix: public AbstractMatrix{ /* Массив элементов матрицы*/ double **elements; /* Количество столбцов в матрице. Количество строк матрицы задавали ранее в родительском классе «AbstractMatrix» */ int СolCount; public: /* Конструктор класса – расширенная матрица, состоящая из квадратной матрицы и вектора */ AugmentMatrix(SquareMatrix A, Vector f); /* Конструктор класса – расширенная матрица, состоящая из двух квадратных матриц */ AugmentMatrix(SquareMatrix A, SquareMatrix B); /* Получение элемента по индексу*/ double getElement(int i, int j); /* Установка значения элемента */ void setElement(int i, int j, double element); /* Получение количества строк в матрице */ int getColCount(); /* Получение количества столбцов в матрице */ int getRowCount(); /*Умножение квадратной матрицы и расширенной*/ AugmentMatrix operator *(SquareMatrix A, AugmentMatrix B); /*Умножение матрицы перестановок и расширенной */ AugmentMatrix operator *(SwapMatrix A, AugmentMatrix B); };
В методе Гаусса с выбором главного элемента будем применять расширенную матрицу, состоящую из квадратной матрицы и вектора. Приведем пример данного конструктора класса «AugmentMatrix» на языке программирования С++.
/* Конструктор – расширенная матрица, состоящая из квадратной матрицы и вектора*/ AugmentMatrix:: AugmentMatrix(SquareMatrix A, Vector f){ /* Задание размеров матрицы (количество строк и столбцов матрицы)*/ this->СolCount = A.getColCount() + 1; this->size = A.getRowCount(); /* Создание матрицы*/ this->elements = new double*[this->size]; for (int i=0; i < this->size; i++){ this->elements[i]=new double[this->СolCount]; } /* Заполнение матрицы*/ for (int i=0; i < this->size; i++){ for (int j=0; j < this->СolCount; j++) if (j < this->СolCount - 1){ this->elements[i][j] = A.getElement(i, j); } else{ this->elements[i][j] = f.getElement(i); } } }
Основная операция рассматриваемого метода – это перемножение матриц. Реализация данной операции на языке С++ имеет вид /*Умножение квадратной и расширенной матрицы*/ AugmentMatrix operator *(SquareMatrix A, AugmentMatrix B) { AugmentMatrix C(B.getRowCount(), B.getColCount()); for (int i = 0; i < A.getRowCount(); i++) { for (int j = 0; j < B.getColCount(); j++) { C.elements[i][j]=0; for (int t = 0; t < B.getRowCount(); t++) C.elements[i][j] += A.elements[i][t] * B.elements[t][j]; } } return C;}
Для перестановки строк матрицы используется класс «SwapMatrix» (Матрица перестановок). Матрица перестановок получается из единичной матрицы изменением порядка расположения строк. Следовательно, для экономии памяти необходимо хранить только позицию единиц в каждой строке. Опишем возможную структуру данного класса. Реализация на языке программирования С++ имеет вид
/*Матрица перестановок*/ class SwapMatrix: public EMatrix { /* Используется для хранения позиции единицы в каждой строке*/ int *Indexes; public: /*Конструктор*/ SwapMatrix (int size); /* Перестановка строк*/ void swapRows(int i1, int i2); /* Перестановка столбцов*/ void swapCols(int j1, int j2); /* Получение количества строк в матрице */ int getColCount(); /* Получение количества столбцов в матрице */ int getRowCount(); /* Установка значения элемента */ void setElement(int i, int j, double element); /* Получение элемента по индексу */ double getElement(int i, int j); }; /* Конструктор*/ SwapMatrix:: SwapMatrix(int size):EMatrix(size) { /* Indexes[i] описывает положение единицы в строке i*/ this->Indexes = new int[size]; for (int i = 0; i < size; ++i) this->Indexes[i] = i;
/* Для единичной матрицы, номер строки совпадает с положением единицы в ней, то есть 1 0 0 Indexes[0] = 0; 0 1 0 Indexes[1] = 1; 0 0 1 Indexes[2] = 2; для перестановочной матрицы, индексы будут уже совпадать не везде, например если поменять строки 2 и 3 1 0 0 Indexes[0] = 0; 0 0 1 Indexes[1] = 2; 0 1 0 Indexes[2] = 1; Таким методом не нужно хранить всю матрицу в памяти. */ }
/* Перестановка строк*/ void SwapMatrix::swapRows(int i1, int i2) { int k = this->Indexes[i1]; this->Indexes[i1] = Indexes[i2]; this->Indexes[i2] = k; return; }
Все необходимые классы и методы реализованы, опишем алгоритм метода Гаусса с выбором главного элемента по столбцу на языке С++.
void DirectMethodsNF::gaussChooseElement(SquareMatrix A, Vector f){ /* Создание расширенной матрицы системы */ AugmentMatrix Au = AugmentMatrix(A, f); /*цикл*/ for (int i = 0; i < Au.getRowCount()-1; ++i) {
/*Поиск значения и индекса максимального элемента в столбце. Данный метод реализован в классе «SquareMatrix». Value – значение максимального элемента Index – индекс максимального элемента*/
/*Создание матрицы перестановок*/ SwapMatrix P(Au.getRowCount()); /*Перестановка строк*/ P.swapRows(i,Index);
/*Умножение матрицы перестановок и расширенной матрицы. Данный метод описан в классе «AugmentMatrix»*/ Au = P*Au;
/* Создание квадратной матрицы L и инициализация ее единичной. Метод инициализации квадратной матрицы единичной описан в классе «SquareMatrix»*/ /*Формирование матрицы L*/ L.setElement(i, i, 1/Au.getElement(i,i)); for (int j = i+1; j < Au.getRowCount(); ++j) { if (Au.getElement(i,i)!= 0) L.setElement(j,i,-(Au.getElement(j,i)/Au.getElement(i,i))); else L.setElement(j, i, 0); } /*Умножение квадратной и расширенной матрицы. Данный метод описан в классе «AugmentMatrix»*/ Au = L*Au; }
/*Создание вектора решений*/ Vector X(Au.getRowCount()); /* Вычисление вектора решений обратным ходом метода Гаусса.*/ }
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.04 сек.) |