Вы здесь

Метод Крамера. Решение систем линейных уравнений

Исходный код на C++: 

Теория

Решения систем линейных при помощи Метода Крамера предполагает вычисление определителя матрицы n+1. На первом шаге работы алгоритма вычисляем определитель матрицы A(det0). Для вычисления определителя матрицы воспользуемся методом Гаусса (более подробно смотри “Метод Гаусса. Вычисление определителя матрицы”) (рис.1).

Определитель матрицы
рис. 1. Метод Крамера решение систем линейных уравнений. Определитель матрицы A.

Последовательно заменяя каждый столбец матрицы на столбец свободных членов и вычисляя определители матриц, мы получим последовательность определителей det1,det2,det3,....,detn (рис2). Далее вычислим значения неизвестных x1=det1/det0,x2=det2/det0,x3=det3/det0,...xn=detn/det0.

Вычисление определителей матриц
рис. 2.Метод Крамера решение систем линейных уравнений. Последовательная замена столбцов матрицы A и вычисление определителей матриц.

Программная реализация

Данный алгоритм можно условно разделить на две части: 1) найти определитель матрицы( за основу был взят метод Гаусса) 2) последовательная замена столбцов матрицы на столбец свободных членов.
1) определитель матрицы

int gaus_det(int cnt_str,double **mass,double &det)
{
int i,j,k;
det=1;
double **copy_mass=new double *[cnt_str];//создаём копию матрицы, так как элементы матрицы мы будем использовать повторно
for(i=0;i<cnt_str;i++)
{
copy_mass[i]=new double [cnt_str];
for(j=0;j<cnt_str;j++)copy_mass[i][j]=mass[i][j];
}
//прямой ход метод Гаусса
for(i=0;i<cnt_str;i++)
{
for(j=i+1;j<cnt_str;j++)
{
if(copy_mass[i][i]==0)
{
for(i=0;i<cnt_str;i++)
delete []copy_mass[i];
delete []copy_mass;
return 0;
}
double b=copy_mass[j][i]/copy_mass[i][i];
for(k=i;k<cnt_str;k++)
copy_mass[j][k]=copy_mass[j][k]-copy_mass[i][k]*b;
}
det*=copy_mass[i][i];//вычисление определителя
}
for(i=0;i<cnt_str;i++)//освобождаем память
delete []copy_mass[i];
delete []copy_mass;
return 1;
}

2) последовательная замена столбцов матрицы на столбец свободных членов

double *det=new double [stb+1];//массив определителей
double *t=new double [str];//временная переменная для хранения столбца матрицы
for(i=0;i<stb;i++)
{
if(gaus_det(str,mass,det[i])!=1)//вычисление определителя, используя метод Гаусса
{
printf("Error gaus\n");
delete []t;
delete []det;
break ;
}
for(j=0;j<str;j++)//последовательная замена столбцов матрицы
{
if(i>0)
mass[j][i-1]=t[j];//восстанавливаем значение столбца
t[j]=mass[j][i];//сохраняем значения i - столбца матрицы в переменной t
mass[j][i]=mass[j][stb-1];//в i - столбец матрицы записываем столбец свободных членов
}
}
delete []t;
for(i=1;i<stb;i++)
printf("x[%d]=%f\n",i,det[i]/det[0]);//вывод результата
delete []det;
}
else
{printf("Error read matrix\n");return 0;}