Метод Гаусса решения СЛАУ - C (СИ)
Формулировка задачи:
Прошу помочь с составлением программы, позволяющей решать системы линейных уравнений методом Гаусса на языке С (не С++!). Желателен наиболее элементарный, "прямоходовый" вариант программы. Заранее большое спасибо.
Решение задачи: «Метод Гаусса решения СЛАУ»
textual
Листинг программы
#define N 20 int main( void ) { double mas[N] [N + 1]; double x[N]; //Корни системы int otv[N]; //Отвечает за порядок корней int i, j, k, n; //Ввод данных clrscr(); do { printf( "Введите число уравнений системы: " ); scanf( "%d", & n ); if ( N < n ) printf( "Слишком большое число уравнений. Повторите ввод\n" ); } while ( N < n ); printf( "Введите систему:\n" ); for ( i = 0; i < n; i++ ) for ( j = 0; j < n + 1; j++ ) scanf( "%lf", & mas[i] [j] ); //Вывод введенной системы clrscr(); printf( "Система:\n" ); for ( i = 0; i < n; i++ ) { for ( j = 0; j < n + 1; j++ ) printf( "%7.2f ", mas[i] [j] ); printf( "\n" ); } //Сначала все корни по порядку for ( i = 0; i < n + 1; i++ ) otv[i] = i; //Прямой ход метода Гаусса for ( k = 0; k < n; k++ ) { //На какой позиции должен стоять главный элемент glavelem( k, mas, n, otv ); //Установка главного элемента if ( fabs( mas[k] [k] ) < 0.0001 ) { printf( "Система не имеет единственного решения" ); return ( 0 ); } for ( j = n; j >= k; j-- ) mas[k] [j] /= mas[k] [k]; for ( i = k + 1; i < n; i++ ) for ( j = n; j >= k; j-- ) mas[i] [j] -= mas[k] [j] * mas[i] [k]; } //Обратный ход for ( i = 0; i < n; i++ ) x[i] = mas[i] [n]; for ( i = n - 2; i >= 0; i-- ) for ( j = i + 1; j < n; j++ ) x[i] -= x[j] * mas[i] [j]; //Вывод результата printf( "Ответ:\n" ); for ( i = 0; i < n; i++ ) for ( j = 0; j < n; j++ ) if ( i == otv[j] ) { //Расставляем корни по порядку printf( "%f\n", x[j] ); break; } return ( 0 ); } //---------------------------------------------- //Описание функции //---------------------------------------------- void glavelem( int k, double mas[] [N + 1], int n, int otv[] ) { int i, j, i_max = k, j_max = k; double temp; //Ищем максимальный по модулю элемент for ( i = k; i < n; i++ ) for ( j = k; j < n; j++ ) if ( fabs( mas[i_max] [j_max] ) < fabs( mas[i] [j] ) ) { i_max = i; j_max = j; } //Переставляем строки for ( j = k; j < n + 1; j++ ) { temp = mas[k] [j]; mas[k] [j] = mas[i_max] [j]; mas[i_max] [j] = temp; } //Переставляем столбцы for ( i = 0; i < n; i++ ) { temp = mas[i] [k]; mas[i] [k] = mas[i] [j_max]; mas[i] [j_max] = temp; } //Учитываем изменение порядка корней i = otv[k]; otv[k] = otv[j_max]; otv[j_max] = i; }
Объяснение кода листинга программы
- В начале программы объявляются переменные и массивы:
double mas[N] [N + 1]
- двумерный массивmas
размеромN
наN + 1
, используемый для хранения коэффициентов системы линейных уравнений (СЛАУ);double x[N]
- массивx
размеромN
, в который будут вынесены корни СЛАУ;int otv[N]
- массивotv
размеромN
, отвечающий за порядок корней;int i, j, k, n;
- вспомогательные переменные для цикла.
- Далее осуществляется ввод данных от пользователя:
- Вводится число уравнений системы с помощью функции
scanf()
. Если число уравнений превышает максимально допустимое значениеN
, выводится сообщение об ошибке и происходит повторный ввод. - Затем вводится система уравнений с помощью функции
scanf()
. Каждое уравнение представляется в виде строки, разделенной пробелами на коэффициенты.
- Вводится число уравнений системы с помощью функции
- После ввода данных происходит вывод системы уравнений на экран.
- Далее начинается выполнение метода Гаусса. Сначала все корни располагаются в порядке их ввода:
- Инициализируется массив
otv
таким образом, что корни расположены в порядке их ввода.
- Инициализируется массив
- Затем выполняется прямой ход метода Гаусса:
- Переменная
k
итерируется от 0 доn - 1
. - На каждой итерации:
- Вызывается функция
glavelem( k, mas, n, otv )
, которая ищет главный элемент в текущей строке и выполняет перестановки строк и столбцов, чтобы перенести его на последнюю строку. - Если элемент на позиции
k
равен нулю или очень маленькому числу (меньше 0.0001), выводится сообщение об отсутствии единственного решения и программа завершается. - Выполняется перенос главного элемента на последнюю строку и соответствующую позицию столбца.
- Переменная
- После завершения прямого хода метода Гаусса начинается обратный ход:
- Корни располагаются в порядке, определенном перестановками строк и столбцов.
- Переменная
i
итерируется от 0 доn - 1
. - На каждой итерации:
- Выполняется вычисление значения
x[i]
как произведения корней, соответствующих переставкам строк и столбцов. - Выполняется вычисление значения
x[i]
с использованием формулы метода Гаусса.
- В конце программы происходит вывод результатов на экран. Корни выводятся в порядке, определенном перестановками строк и столбцов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д