Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Достоинства метода



Менее трудоёмкий по сравнению с другими методами. Позволяет однозначно установить, совместна система или нет, и если совместна, найти её решение. Позволяет найти максимальное число линейно независимых уравнений — ранг матрицы системы.


Код на Си метода Гаусса:

#include <iostream>

#include <math.h>

#include <vector>

#include <Windows.h>

using namespace std;

vector<double> X; //Решения

//Поменять местами строки в матрице

void swapRow(double **matrix, int n, int index1, int index2)

{

for(int i = 0; i <= n; i++)

{

double tmp = matrix[index1][i];

matrix[index1][i] = matrix[index2][i];

matrix[index2][i] = tmp;

}

}

//Прямой ход

void forwardStroke(double **matrix, int n)

{

for(int i = 0; i < n - 1; i++) //Проход по строкам матрицы

{

//Поиск строки с максимальным iтым коэффициентом ниже текущей строки

int i_max = i;

for(int j = i + 1; j < n; j++)

if(abs(matrix[j][i]) > abs(matrix[i_max][i]))

i_max = j;

//Поменять найденную строку с текущей

swapRow(matrix, n, i_max, i);

for(int j = i + 1; j < n; j++) //Проход по остальным строкам ниже текущей

{

double w = matrix[j][i]/matrix[i][i]; //Считаем коэффициент на который нужно умножать элементы

for(int k = 0; k <= n; k++)

matrix[j][k] -= matrix[i][k] * w; //Вычитаем из текущей строки iтую строку умноженную на коэффициент

}

}

}

//Обратный ход

void reverseMotion(double **matrix, int n)

{

for(int i = n - 1; i >= 0; i--) //Проходим по всем уравнениям с последнего

{

for(int j = 0; j < X.size(); j++) //Проходим по коэффициентам текущего уравнения

{ // в сторону N1-го начиная с Nго элемента до тех пор пока не встретим 0

matrix[i][n - 1 - j] *= X[j]; //умножаем текущий коэффициент на ранее найденный X[j]

matrix[i][n] -= matrix[i][n - 1 - j]; //Вычитаем из N + 1 го элемента текущий элемент

}

X.push_back(matrix[i][n] / matrix[i][n - 1 - X.size()]); //Записать еще 1 найденное X

}

}

//Распечатать решения

void printSolution()

{

cout << endl << "Решение системы: " << endl;

int j = 1;

//Печать решений в обратном порядке (т.к. при обратном ходе мы записывали решения начиная с Xn и заканчивая X1)

for(int i = X.size() - 1; i >= 0; i--)

printf("X[%d] = %.5lf\n", j++, X[i]);

}

//Метод гаусса

void Gauss(double **matrix, int n)

{

//Прямой ход

forwardStroke(matrix, n);

//Обратный ход

reverseMotion(matrix, n);

//Распечатать решение

printSolution();

}

int main()

{

setlocale(LC_ALL,"Russian");

int n;

cout << "Введите размерность квадратной матрицы N: ";

cin >> n;

double **matrix = new double *[n];

for(int i = 0; i < n; i++)

{

cout << "Введите N + 1 коэффициентов при уравнении " << i + 1 << ": " << endl;

matrix[i] = new double [n + 1];

for(int j = 0; j <= n; j++)

cin >> matrix[i][j];

}

Gauss(matrix, n);

system("pause");

return 0;

}


Сстема уравнений:

Введите размерность квадратной матрицы N: 5

Введите N + 1 коэффициентов при уравнении 1:

4 3 1 -2 1 3

Введите N + 1 коэффициентов при уравнении 2:

0 2 -3 -5 -6 2

Введите N + 1 коэффициентов при уравнении 3:

3 -4 2 -1 -3 -4

Введите N + 1 коэффициентов при уравнении 4:

1 5 -4 -3 1 5

Введите N + 1 коэффициентов при уравнении 5:

1 -6 1 -1 2 -5

Решение системы:

X[1] = -0,11694

X[2] = 0,91532

X[3] = 0,08619

X[4] = -0,24950

X[5] = 0,13659

Для продолжения нажмите любую клавишу...





Дата публикования: 2015-04-06; Прочитано: 286 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...