Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Менее трудоёмкий по сравнению с другими методами. Позволяет однозначно установить, совместна система или нет, и если совместна, найти её решение. Позволяет найти максимальное число линейно независимых уравнений — ранг матрицы системы.
Код на Си метода Гаусса:
#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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!