СЛАУ - метод Гауса (С++)
Ме́тод Га́усса — классический метод решения системы линейных алгебраических уравнений (СЛАУ). Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе ступенчатого (или треугольного) вида, из которой последовательно, начиная с последних (по номеру) переменных, находятся все остальные переменные.
#include <stdio.h>
#include <math.h>
#define N 50 //Число элементов массива
void glavelem( int k, double mas[] [N + 1], int n, int otv[] ); //прототип функции
int main()
{
double mas[N] [N + 1];
double x[N]; //Корни системы
int otv[N];//Отвечает за порядок корней
int i, j, k, n;
//Ввод данных
do
{
printf( "Vvedite chislo uravnenii: " );
scanf( "%d", & n );
if ( N < n )
printf( "Slishkom bolshoe uravnenie\n" );
}
while ( N < n );
printf( "Vvedite uravnenie:\n" );
for ( i = 0; i < n; i++ )
for ( j = 0; j < n + 1; j++ )
scanf( "%lf", & mas[i] [j] );
//Вывод введенной системы
printf( "Sistema:\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( "Sistema ne imeet ed reshenia" );
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( "Otvet:\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;
}
#include <stdio.h>
#include <math.h>
#define N 50 //Число элементов массива
void glavelem( int k, double mas[] [N + 1], int n, int otv[] ); //прототип функции
int main()
{
double mas[N] [N + 1];
double x[N]; //Корни системы
int otv[N];//Отвечает за порядок корней
int i, j, k, n;
//Ввод данных
do
{
printf( "Vvedite chislo uravnenii: " );
scanf( "%d", & n );
if ( N < n )
printf( "Slishkom bolshoe uravnenie\n" );
}
while ( N < n );
printf( "Vvedite uravnenie:\n" );
for ( i = 0; i < n; i++ )
for ( j = 0; j < n + 1; j++ )
scanf( "%lf", & mas[i] [j] );
//Вывод введенной системы
printf( "Sistema:\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( "Sistema ne imeet ed reshenia" );
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( "Otvet:\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;
}
Комментарии
Отправить комментарий