Метод халецкого в excel
- class_system.h- описание класса(системы алгебраических уравнений).
- io.cpp- ввод/вывод данных.
- main.cpp- основная функция программы.
- check.cpp- проверки погрешности и определителя.
- gauss.cpp- метод Гаусса.
- iter.cpp- метод простой итерации.
- zeidel.cpp- метод Зейделя.
Таблица идентификаторов
В таблице 1 приведены основные идентификаторы, используемые в программе, реализующей метод Гаусса, метод простой итерации и метод Зейделя на языке С++.
Таблица 1 - Основные идентификаторы для метода Гаусса, простой итерации, Зейделя
Идентификатор
Массив для системы уравнений.
Количество уравнений по умолчанию (размер массива по умолчанию).
Число уравнений системы.
Индексы циклов при работе с матрицами.
Номер выбранного метода решения.
Временные величины, используемые при нахождении корней в методе Гаусса.
Компиляция: g++ main.cpp –o firstlab
Class_system.h
int inp_size; // Input size of array.
float A[def_size][def_size+1]; // Array of input data.
array(int s); // Default constructor.
array(const array &a); // Copy constructor.
void sum(); // Sum of the principal and the secondary diagonal.
void example(); // Example of a system of equations.
void gauss_2(); // Gauss method.
void iter_2(); // Simple iteration method.
// Output to the screen.
using namespace std;
array::array(int s) : inp_size(s)
cout<<"\nEnter the coefficients: \n";
array::array(const array &a) : inp_size(a.inp_size)
cout<<"\nEnter the coefficients(2): \n";
array::array(const array &a) : inp_size(a.inp_size)
cout<<"\nThe initial system of equations:\n";
> else cout<<" \nExplanded matrix:\n";
// Alternative version of show.
printf("\nThe initial system of equations:\n");
for (int j=0;j<size;j++)
using namespace std;
int n=0; // Number of unknowns.
int n_of_method=0; // Number of method;
cout<<"\nSelect the method for solving: ";
case 1: gauss(a,n); a.gauss_2(); break;
case 2: iter(a,n); a.iter_2(); break;
case 3: zeidel(a,n); break;
default: cout<<"\nEnter 1, 2 or 3\n"; break;
using namespace std;
bool epsChecking(double* oldResult, double* newResult, int size)
for(int i=0; i<size; i++)
bool checkdeterm(double** matr, int max)
for(int i = 0; i < max; i++)
for(int i = 0; i < max; i++)
while (j % max != 0);
int gauss(array b, int n)
double** detMatr=new double*[n];
using namespace std;
int iter(array b, int n)
cout << "Enter observational error: ";
FILE* f=freopen("resultFile", "w", stdout);
cout << "Not equation" << endl;
double* oldResult=new double[n];
double* newResult=new double[n];
if(epsChecking(oldResult, newResult, n))
FILE* f=freopen("resultFile", "w", stdout);
for(int i=0; i< n; i++)
double eps = 0.0001; // Engineer accuracy.
double a[inp_size][inp_size]; // Original matrix.
double b[inp_size]; // Column of free terms.
for (int i=0;i<inp_size;i++)
double alpha[inp_size][inp_size]; // Buffer matrix.
double beta[inp_size]; // buffer column.
cout << "\nStep " << stepIter << endl;
next[index] += prev[j] * alpha[index][j];
cout << "The number of iterations: " << stepIter << endl;
using namespace std;
int zeidel(array b, int size)
cout << "Enter observational error: ";
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
FILE* f=freopen("resultFile", "w", stdout);
cout << "Not equation" << endl;
double* oldResult=new double[size];
double* newResult=new double[size];
for(int i=0; i<size; i++)
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
if(epsChecking(oldResult, newResult, size))
for(int i=0; i<size; i++)
FILE* f=freopen("resultFile", "w", stdout);
for(int i=0; i< size; i++)
На рисунках 2.1 и 2.3 показано окно с вводом данных в программу, реализующей метод Гаусса, простых итераций и метод Зейделя на языке С/С++. Программа предлагает ввести количество неизвестных, затем последовательно ввести коэффициенты при неизвестных и заполнить столбец свободных членов. После чего предлагается выбрать метод решения.
Затем программа выдает результат в зависимости от выбранного метода. Это показано на рисунках 2.2 и 2.4.
Пример работы программы:
Рисунок 2.1 - окно с вводом данных в программу, реализующей метод Гаусса, простых итераций и метод Зейделя на языке С/С++ (Король)
Рисунок 2.2 - окно с результатом работы программы, реализующей метод Гаусса, простых итераций и метод Зейделя на языке С/С++ (Король)
Рисунок 2.3 - окно с вводом данных в программу, реализующей метод Гаусса, простых итераций и метод Зейделя на языке С/С++ (Скворцова)
Рисунок 2.4 - окно с результатом работы программы, реализующей метод Гаусса, простых итераций и метод Зейделя на языке С/С++ (Скворцова)
Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.
Если матрица системы является симметричной и положительно определенной, то для решения системы применяют метод Холецкого (метод квадратных корней).
В основе метода лежит алгоритм специального LU-разложения матрицы A, в результате чего она приводится к виду A=.
Если разложение получено, то как и в методе LU-разложения, решение системы сводится к последовательному решению двух систем с треугольными матрицами:
и .
Для нахождения коэффициентов матрицы L неизвестные коэффициенты матрицы L приравнивают соответствующим элементам матрицы A. Затем последовательно находят требуемые коэффициенты по формулам:
, i = 2, 3, . m,
, i = 3, 4, . m,
i = k+1, . , m.
Пример 5. Решение системы методом Холецкого.
A= b=
Находим элементы матрицы L:
Таким образом разложение матрицы A имеет вид:
Последовательно решаем системы и. Решением 1-ой системы является вектор,
а решение 2-ой системы вектор .
Ответ:
Решение с использованием встроенной функции системы Mathcad.
Пример 6.
1.6.Метод прогонки.
Если матрица системы является разреженной(ленточной в рассматриваемом ниже примере), то есть содержит большое число нулевых элементов, то применяют еще одну модификацию метода Гаусса - метод прогонки.
Рассмотрим систему уравнений с трех диагональной матрицей:
Преобразуем первое уравнение системы к виду
,
где ,
Подставим полученное выражение во второе уравнение системы и преобразуем его к виду
На i-ом шаге уравнение преобразуется к виду
,
где ,.
На m-ом шаге подстановка в последнее уравнение выражения
дает возможность определить значение :
.
Значения остальных неизвестных находятся по формулам:
, i = m-1, m-2, . 1.
Пример 7 . Решение системы уравнений методом прогонки.
Прямой ход прогонки.
Вычислим прогоночные коэффициенты:
, ,
,
, ,
,
Обратный ход прогонки.
Находим значения неизвестных:
,
,
,
Ответ: .
2. Контрольные задачи.
Задача 1 . Дана система уравнений Ax=b.
Найти решение системы с помощью метода Гаусса и используя встроенную функцию lsolve пакета MATHCAD .
ПОРЯДОК РЕШЕНИЯ ЗАДАЧИ.
Задать матрицу системы A и вектор правой части b.
Найти решение системы Ax=b.
а) используя встроенную функцию lsolve пакета MATHCAD,
б) с помощью метода Гаусса с выбором ведущего элемента по столбцу.
Пример выполнения фрагмента задачи
x:=lsolve(A,b) x=
Самостоятельная работа по курсу высокоуровневые методы информатики и программирования:
«Решение систем линейных алгебраических уравнений методом схемы Халецкого»
Гайворонский С.О., гр.6205
Для удобства рассуждений систему линейных уравнений запишем в матричном виде
(1)
где - квадратная матрица порядка и
, - векторы-столбцы.
Представим матрицы в виде произведения нижней треугольной матрицы и верхней треугольной матрицы с единичной диагональю, т.е.
, (2)
, .
Тогда элементы и определяются по формулам:
(3)
(4)
Отсюда искомый вектор может быть вычислен из цепи уравнений
. (5)
Так как матрицы и - треугольные, то системы (5) легко решаются, а именно:
(6)
(7)
Из формул (6) видно, что числа выгодно вычислять вместе с коэффициентами . Этот метод получил название схемы Халецкого.
Заметим, что если матрица А симметрическая, т.е. , то
.
Схема Халецкого удобна для работы на вычислительных машинах, т.к. в этом случае операции "накопления" (3) и (4) можно проводить без записи промежуточных результатов.
Решить систему линейных алгебраических уравнений, используя точный метод численного решения (схему Халецкого).
Введение
Существует несколько способов решения таких систем, которые в основном делятся на два типа: 1) точные методы, представляющие собой конечные алгоритмы для вычисления корней системы, 2) итерационные методы, позволяющие получать корни системы с заданной точностью путем сходящихся бесконечных процессов.
Для того чтобы система линейных алгебраических уравнений имела решение, необходимо и достаточно, чтобы ранг основной матрицы был равен рангу расширенной матрицы. Если ранг основной матрицы равен рангу расширенной матрицы и равен числу неизвестных, то система имеет единственное решение. Если ранг основной матрицы равен рангу расширенной матрицы, но меньший числа неизвестных, то система имеет бесконечно решений.
Пример системы линейных уравнений:
Или в матричном виде: ,
где матрица коэффициентов системы;
- вектор неизвестных; - вектор свободных членов.
Точные методы решения СЛАУ
Метод главных элементов.
Пусть дана система линейных алгебраических уравнений. Рассмотрим расширенную матрицу, состоящую из коэффициентов системы a[i,j] и свободных членов b[i]. Метод главных элементов - это обобщение метода исключения переменных (метода Гаусса). Обозначим матрицу, состоящую из коэффициентов при неизвестных и столбца свободных членов исходной системы за M.
Выбираем наибольший по модулю элемент, не принадлежащий столбцу свободных членов. Пусть это будет . Этот элемент называется главным элементом, а строка, в которой он находится, называется главной строкой.
Далее производим следующие преобразования: к каждой неглавной строке прибавим главную строку, умноженную на соответствующий множитель для этой строки. В результате мы получим матрицу, у которой q-й столбец состоит из нулей. Отбросим этот столбец и главную p-ю строку, получим новую матрицу с меньшим на единицу числом строк и столбцов. Над матрицей повторяем те же операции, после чего получаем матрицу и т.д. Таким образом, мы построим последовательность матриц
последняя, из которых представляет двучленную матрицу - строку, её также будем считать главной строкой. Для определения неизвестных объединяем в систему все главные строки, начиная с последней. После надлежащего изменения нумерации неизвестных получается система с треугольной матрицей, из которой легко шаг за шагом найти неизвестные данной системы.
Заметим, что метод Гаусса является частным случаем, метода главных элементов, а схема метода Гаусса получается, если за главный элемент всегда выбирать левый верхний элемент соответствующей матрицы. Запрограммировать метод главных элементов непросто, поэтому чтобы уменьшить вычислительную погрешность, применяют метод Гаусса с выбором главного элемента. Необходимое условие применения метода главных элементов: определитель системы не равен нулю.
Читайте также: