М.В. Гаврилов
студент 2 курса направления подготовки
«Информатика и вычислительная техника»
С.Ю. Щука
студент 2 курса направления подготовки
«Информатика и вычислительная техника»
Научный руководитель Е.И. Балабан
доцент кафедры Естественно-научных дисциплин
Коломенский институт (филиал) федерального
государственного автономного образовательного учреждения
высшего образования
«Московский политехнический университет»
Решение системы линейных алгебраических уравнений методом Гаусса на языке программирования С++
Метод Гаусса является популярным методом решения системы линейных алгебраических уравнений. Он предполагает последовательное исключение переменных, при котором с помощью преобразований система уравнений приводится к системе треугольного вида. Затем последовательно, начиная с последних переменных, находят все остальные переменные.
Система линейных уравнений с действительными постоянными коэффициентами:
В
матричной форме она выглядит следующим
образом:
Решение системы линейных уравнений методом Гаусса предполагает две стадии:
- последовательное исключение;
- обратная подстановка.
Рассмотрим частный случай метода Гаусса, когда система имеет единственное решение, число уравнений равно числу переменных. Для того, чтобы решить систему линейных алгебраических уравнений методом Гаусса на языке программирования С++ потребуется выполнить следующие этапы работы:
изучить метод решения линейных уравнений – метод Гаусса;
составить математическую модель решения линейных уравнений методом Гаусса;
составить алгоритм решения линейных уравнений методом Гаусса в виде блок-схемы;
написать программу по составленным блок-схемам на языке программирования С++;
проверить работоспособность программы.
Результат исследования: программа, реализующая частный случай метода Гаусса.
При написании программы в основном будут использоваться условные операторы и циклы.
Описание последовательности действий:
Ввод данных: количество уравнений; с помощью двух вложенных циклов вводим значения коэффициентов в каждом уравнении (левая часть), затем, используя цикл, вводим значение правой части всех уравнений.
Приводим матрицу к треугольному виду. Для нужно выполнить следующие действия:
Перебор элементов главной диагонали левой части матрицы кроме последнего.
Проверка на предмет, является ли элемент главной диагонали равным нулю. Если да: нахождение с помощью цикла while строку, в которой элемент с номером перебираемого столбца не равен нулю. Окончание цикла while. Затем, с помощью цикла for происходит перестановка строк местами.
Перебор строки ниже элемента главной диагонали.
Нахождение коэффициента, на который нужно помножить первую строку, перед её вычитанием из нижней строки.
Вычитание строки, с помощью цикла for.
Окончание двух циклов for.
Нахождение переменных.
3.1. Перебор строки, начиная с последней до первой.
3.2. Суммирование левой части уравнения, за исключением искомой переменной с помощью цикла while. Окончание цикла while.
3.3. Вычитание из правой части левой.
3.4. Подстановка значения переменной в системы линейных уравнений, с помощью цикла while. Окончание цикла while.
3.5. Вывод переменной.
3.6. Окончание цикла for.
Реализация на C++
#include <stdio.h>
#include <iostream>
int KeepQuantityChangesSystemEquations()
{int quantity;
printf("Введите число переменных и уравнений ");
std::cin >> quantity;
return quantity;}
void ScanMatrix(double **matrix, int quantity)
{for (int j = 0; j < quantity; j++)
{printf("Введите значения коэфициентов при %d переменной для всех уравнений\n", j+1);
for (int i = 0; i < quantity; i++)
{std::cin >> matrix[i][j];}}
int j = quantity;
printf("Введите значение для правой части всех уравнений\n");
for (int i = 0; i < quantity; i++)
{std::cin >> matrix[i][j];}}
void TriangularMatrix(double **matrix, int quantity)
{for (int j = 0; j < quantity - 1; j++)
{if (matrix[j][j] == 0)
{ int f = j+1;
while (matrix[f][j] == 0)
{f = f + 1;}
int c = 0;
for (int q = j; q < quantity + 1; q++)
{c = matrix[f][q];
matrix[f][q] = matrix[j][q];
matrix[j][q] = c;}}
for (int i = j + 1; i < quantity; i++)
{double k = -matrix[i][j]/matrix[j][j];
for (int n=j + 1; n < quantity+1; n++)
{matrix[i][n] = matrix[i][n]+matrix[j][n]*k;}
matrix[i][j]=0;}}}
void FindVariables(double **matrix, int quantity)
{for (int i = quantity-1; i >= 0; i--)
{double summa=0;
int j = quantity-1;
while (j > i)
{summa = summa + matrix[i][j];
j=j-1;}
matrix[i][quantity]=matrix[i][quantity]-summa;
double k = matrix[i][quantity] / matrix[i][i];
int f = i - 1;
while (f >= 0)
{matrix[f][i] = matrix[f][i] * k;
f=f-1;}
printf("%d переменная = %lf\n", i+1, k);}}
void Gauss(double **matrix, int quantity)
{TriangularMatrix(matrix, quantity);
FindVariables(matrix, quantity);}
int main()
{int quantity = KeepQuantityChangesSystemEquations();
double **matrix;
matrix = new double *[quantity];
for(int i = 0; i < quantity; i++)
{matrix[i] = new double [quantity+1]; }
ScanMatrix(matrix, quantity);
Gauss(matrix, quantity);
for(int i = 0; i < quantity; i++)
{delete matrix[i];}
delete []matrix;
return 0;}
Пример решения системы линейных уравнений с помощью метода Гаусса:
Таким образом, решение системы линейных алгебраических уравнений методом Гаусса на языке программирования С++ возможно, благодаря применению условных операторов и циклов.
Список использованной литературы:
Киреев В.И. Численные методы в примерах и задачах: Учеб. пособие/В.И. Киреев, А.В. Пантелеев. – 3-е изд. стер. – М.: Высш. шк., 2008. – 480 с.: ил. ISBN 978-5-06-004763-9