Файл: Маркова Вычислит методы алгебры Практикум.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 20.09.2025

Просмотров: 1194

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Л.В. Маркова, е.А. Корчевская,

С о д е р ж а н и е

П р е д и с л о в и е

Глава 1 Элементы теории погрешностей п 1.1 Источники погрешностей

П 1.2 Вычисление абсолютной и относительной погрешностей

П 1.3 Округление чисел

П 1.4 Вычисление погрешностей арифметических операций

П 1.5 Оценка погрешности по способу границ

Лабораторная работа № 1

Задание

Глава 2 объектно-ориентированный подход к программированию методов линейной алгебры

П 2.1 Создание матричной иерархии классов

Лабораторная работа № 2

Задание

П 2.2 Создание иерархии классов вычислительных методов алгебры

Лабораторная работа № 3

Задание

Глава 3 решение систем линейных алгебраических уравнений

П 3.1 Метод Гаусса решения систем линейных алгебраических уравнений

Лабораторная работа № 4

Задание

П 3.2 Метод Гаусса с выбором главного элемента для решения систем линейных алгебраических уравнений

Лабораторная работа № 5

Задание

П 3.3 Решение системы линейных алгебраических уравнений методом Жордана-Гаусса

Лабораторная работа № 6

Задание

П 3.4 Метод квадратного корня для решения систем линейных алгебраических уравнений

Лабораторная работа № 7

Задание

П 3.5 Вычисления определителя и нахождения обратной матрицы

Лабораторная работа № 8

Задание

П 3.6 Решение системы линейных алгебраических уравнений методом прогонки

Лабораторная работа № 9

Задание

П 3.7 Метод простых итераций решения систем линейных алгебраических уравнений

Лабораторная работа № 10

Задание

П 3.8 Метод Зейделя решения систем линейных алгебраических уравнений

Лабораторная работа № 11

Задание

П 3.9 Итерационные методы вариационного типа решения систем линейных алгебраических уравнений

Лабораторная работа № 12

Задание

Глава 4 вычисление собственных значений и собственных векторов матриц

П 4.1 Метод Данилевского для нахождения собственных значений и собственных векторов

Лабораторная работа № 13

Задание

П 4.2 Итерационный степенной метод нахождения наибольшего по модулю собственного значения и соответствующего собственного вектора

Лабораторная работа № 14

Задание

П 4.3 qr-алгоритм для нахождения собственных значений матрицы

Лабораторная работа № 15

Задание

П 4.4 Метод Якоби для нахождения собственных значений и собственных векторов

Лабораторная работа № 16

Задание

П р и л о ж е н и я Приложение 1 Основные сведения о матрицах

Функции MathCad

Л и т е р а т у р а

Красоткина вычислительные методы алгебры. Практикум

2 10038, Г. Витебск, Московский проспект, 33.

/* Установка значения элемента */

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, получим: