ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.09.2025
Просмотров: 1194
Скачиваний: 0
СОДЕРЖАНИЕ
Л.В. Маркова, е.А. Корчевская,
Глава 1 Элементы теории погрешностей п 1.1 Источники погрешностей
П 1.2 Вычисление абсолютной и относительной погрешностей
П 1.4 Вычисление погрешностей арифметических операций
П 1.5 Оценка погрешности по способу границ
Глава 2 объектно-ориентированный подход к программированию методов линейной алгебры
П 2.1 Создание матричной иерархии классов
П 2.2 Создание иерархии классов вычислительных методов алгебры
Глава 3 решение систем линейных алгебраических уравнений
П 3.1 Метод Гаусса решения систем линейных алгебраических уравнений
П 3.2 Метод Гаусса с выбором главного элемента для решения систем линейных алгебраических уравнений
П 3.3 Решение системы линейных алгебраических уравнений методом Жордана-Гаусса
П 3.4 Метод квадратного корня для решения систем линейных алгебраических уравнений
П 3.5 Вычисления определителя и нахождения обратной матрицы
П 3.6 Решение системы линейных алгебраических уравнений методом прогонки
П 3.7 Метод простых итераций решения систем линейных алгебраических уравнений
П 3.8 Метод Зейделя решения систем линейных алгебраических уравнений
П 3.9 Итерационные методы вариационного типа решения систем линейных алгебраических уравнений
Глава 4 вычисление собственных значений и собственных векторов матриц
П 4.1 Метод Данилевского для нахождения собственных значений и собственных векторов
П 4.3 qr-алгоритм для нахождения собственных значений матрицы
П 4.4 Метод Якоби для нахождения собственных значений и собственных векторов
П р и л о ж е н и я Приложение 1 Основные сведения о матрицах
/* Установка значения элемента */
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());
/* Вычисление вектора решений обратным ходом метода Гаусса.*/
}
Лабораторная работа № 5
Цель: изучить метод Гаусса с выбором главного элемента для решения систем линейных алгебраических уравнений.
Задание
1. Реализуйте в классе «DirectMethodsFactorization» метод Гаусса с выбором главного элемента («gaussChooseElement»). Для реализации метода используйте объекты и методы матричных классов «SquareMatrix», «Vector», «AugmentMatrix» и «SwapMatrix». Продумайте и реализуйте методы работы с матрицей класса «SwapMatrix». Возможная структура класса «SwapMatrix» приведена в примере 2. Для эффективной реализации метода все необходимые матричные операции производите над объектом класса «AugmentMatrix», описанным в примере 2.
2. Решите систему
линейных алгебраических уравнений
методом Гаусса с выбором главного
элемента (
)
в соответствии с вариантом.
3. Решите ту же задачу, используя пакет для математических вычислений.
4. Сравните результат выполнения п. 2 с решением, полученным в п. 3
Варианты заданий
|
№ 1
|
№ 2 |
|
№ 3
|
№ 4 |
|
№ 5
|
№ 6 |
|
№ 7 |
№ 8 |
|
№ 9 |
№ 10 |
|
№ 11 |
№ 12 |
|
№ 13 |
№ 14 |
|
№ 15 |
№ 16 |
П 3.3 Решение системы линейных алгебраических уравнений методом Жордана-Гаусса
Рассмотрим метод Жордана-Гаусса.
Имеем систему линейных алгебраических уравнений:
(1)
или в матричном виде AX = f. (2)
Суть метода Жордана-Гаусса состоит в том, чтобы привести матрицу А к единичному виду, тогда вектор решения будет совпадать со столбцом свободных членов. Алгоритмически метод Жордана-Гаусса объединяет прямой и обратный ход метода Гаусса [3].
Первый шаг метода
Жордана-Гаусса аналогичен первому шагу
метода Гаусса, т.е. первое уравнение
необходимо разделить на
–коэффициент
при неизвестном
и исключить это неизвестное –
из остальных уравнений системы. На
втором шаге необходимо исключить
неизвестное
из всех
уравнений системы (в том числе из первого)
кроме второго. На третьем шаге оставляем
неизвестное
только в
третьем уравнении и т.д. Окончательно
получаем систему вида
.
Столбец свободных членов в последней расширенной матрице и есть решение системы (1).
Пример 1. Решить с помощью метода Жордана-Гаусса систему уравнений:
Решение:
Разделим первое уравнение на 3, получим следующую систему:
Сложим первое уравнение со вторым и третьим, умножив соответственно на –4 и –1, получим систему:
Разделим второе уравнение на –10, получим следующую систему:
Сложим второе уравнение с первым и третьим, умножив соответственно на –4/5 и –6/5, получим: