Описание метода
Для системы линейных уравнений с неизвестными (над произвольным полем)
с определителем матрицы системы , отличным от нуля, решение записывается в виде
(i-ый столбец матрицы системы заменяется столбцом свободных членов).
В другой форме правило Крамера формулируется так: для любых коэффициентов c1, c2, …, cn справедливо равенство:
В этой форме метод Крамера справедлив без предположения, что отличен от нуля, не нужно даже, чтобы коэффициенты системы были бы элементами целостного кольца (определитель системы может быть даже делителем нуля в кольце коэффициентов). Можно также считать, что либо наборы и , либо набор состоят не из элементов кольца коэффициентов системы, а какого-нибудь модуля над этим кольцом. В этом виде формула Крамера используется, например, при доказательстве формулы для определителя Грама и Леммы Накаямы.
Пример
Система линейных уравнений с вещественными коэффициентами:
Определители:
В определителях столбец коэффициентов при соответствующей неизвестной заменяется столбцом свободных членов системы.
Решение:
Пример:
Определители:
Вычислительная сложность
Метод Крамера требует вычисления определителей размерности . При использовании метода Гаусса для вычисления определителей метод имеет сложность по элементарным операциям сложения-умножения порядка , что сложнее, чем метод Гаусса при прямом решении системы. Поэтому метод, с точки зрения затрат времени на вычисления, считался непрактичным. Однако в 2010 году было показано, что метод Крамера может быть реализован со сложностью , сравнимой со сложностью метода Гаусса.
Программа на Pascal
uses crt;
type
Tmass=array[1..20] of real;
Tmatrix=array[1..20] of Tmass;
{процедура перестановки строк}
procedure Per(k,n:integer;var a:Tmatrix;var p:integer);
var z:Real;j,i:integer;
begin
z:=abs(a[k,k]);
i:=k;
p:=0;
for j:=k+1 to n do
begin
if abs(a[j,k])>z then
begin
z:=abs(a[j,k]);
i:=j;
p:=p+1;{счетчик перестановок}
end;
end;
if i>k then
for j:=k to n do
begin
z:=a[i,j];
a[i,j]:=a[k,j];
a[k,j]:=z;
end;
end;
{определение знака определителя по числу перестановок}
function Znak(p:integer):integer;
begin
if p mod 2=0 then
Znak:=1 else Znak:=-1;
end;
{нахождение определителя}
procedure Opr(n:integer;a:tmatrix;var det:real);
var k,i,j,p:integer;r:real;
begin
det:=1.0;
for k:=1 to n do
begin
if a[k,k]=0 then Per(k,n,a,p);{перестановка строк}
det:=znak(p)*det*a[k,k];{вычисление определителя}
for j:=k+1 to n do {пересчет коэффициентов}
begin
r:=a[j,k]/a[k,k];
for i:=k to n do
begin
a[j,i]:=a[j,i]-r*a[k,i];
end;
end;
end;
end;
var a:Tmatrix;
c:array[1..20] of Tmatrix;
b,x:Tmass;
det,det1:real;
n,k,j,i:integer;
begin
clrscr;
write('Порядок системы n=');
readln(n);
writeln('Введите коэффициенты уравнений:');
for i:=1 to n do
begin
writeln('Уравнение ',i);
for j:=1 to n do
read(a[i,j]);
end;
readln;
writeln('Введите свободные члены:');
for i:=1 to n do
read(b[i]);
readln;
clrscr;
writeln('Расширенная матрица системы:');
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:7:2);
write(b[i]:9:2);
writeln;
end;
Opr(n,a,det);{определитель системы}
for i:=1 to n do
begin
for k:=1 to n do
begin
for j:=1 to n do
c[i][k,j]:=a[k,j];
c[i][k,i]:=b[k];
end;
Opr(n,c[i],det1);
if(det=0)and(det1=0) then
begin
writeln('Система не определена!');
readln;
exit;
end;
if(det=0)and(det1<>0) then
begin
writeln('Система не имеет решений!');
readln;
exit;
end;
x[i]:=det1/det;
end;
writeln('Корни сиcтемы:');
for i:=1 to n do
writeln('x',i,'=',x[i]:7:3);
readln
end.
Тестирование на сайте https://www.onlinegdb.com/
Расширенная матрица системы:
2.00 5.00 4.00 30.00
1.00 3.00 2.00 150.00
2.00 10.00 9.00 110.00
Корни сиcтемы:
x1=-152.000
x2=270.000
x3=-254.000