unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Menus, Buttons;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label3: TLabel;
Button2: TButton;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Nmax=10;
Type
Massiv1 = array[1..Nmax,1..Nmax] of extended;
var
Form1: TForm1;
A : Massiv1;
N, r, c: integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
N := 4;
Edit1.Text := FloatToStr(N);
StringGrid1.RowCount := N+1;
StringGrid1.ColCount := N+1;
Label3.Caption := ' для вычисления определителя матрицы нажмите расчет';
StringGrid1.Cells [0,0] := 'Матрица А';
for r := 1 to N do begin
StringGrid1.Cells [0,r] := ' строка ' + IntToStr(r);
end;
for c := 1 to N do begin
StringGrid1.Cells [c,0] := ' столбец ' + IntToStr(c);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
N:=StrToInt(Edit1.Text);
StringGrid1.RowCount:=N+1;
StringGrid1.ColCount:=N+1;
for r := 1 to N do begin
StringGrid1.Cells [0,r] := ' строка ' + IntToStr(r);
end;
for c := 1 to N do begin
StringGrid1.Cells [c,0] := ' столбец ' + IntToStr(c);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
detA, k, buf: extended;
max, j, z, p, s, zam:integer;
begin
max:= 1;
detA := 1;
zam:=0;
for c := 1 to N do
for r := 1 to N do
A[c,r]:=StrToFloat(StringGrid1.Cells[c,r]);
for c := 1 to N-1 do begin
for z := c to N-1 do begin
max:=z;
for j := z+1 to N do begin
if abs(A[c,j]) > abs(A[c,max]) then
max:=j;
end;
for p := 1 to N do begin
buf:=A[p,z]; A[p,z]:=a[p,max]; A[p,max]:=buf;
end;
end;
for r := c+1 to N do begin
k := A[c,r]/A[c,c];
for s := 1 to N do begin
A[s,r]:= A[s,r]-A[s,c]*k;
end;
end;
if c<>max then begin
zam := zam+1;
end;
end;
for c := 1 to N do
detA := detA*A[c,c];
if zam mod 2 <> 0 then
detA := (-1)*detA;
label3.Caption := 'Детерминант матрицы равен: ' + FloatToStrF(detA,fffixed,6,3);
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
MessageDlg(Программа вычисляет детерминант (определитель) матрицы методом Гаусса с выбором главного элемента. Внимание!!! Матрица должна быть квадратной!',mtInformation,[mbOK],0);
end;
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9', '-' : ;
'.',',':
begin
if Key <> DecimalSeparator then
Key := DecimalSeparator;
end;
else
key := Chr(0)
end;
end;
end.
ТЕСТОВАЯ ЗАДАЧА
Математическое решение задачи
В матрице вида
Определить детерминант.
Решение:
Вычисление определителя данной матрицы вручную целесообразно производить с помощью разложения элементов по 1-й строке по формуле (1). В итоге получится:
(7)
Воспользовавшись правилом Саррюса (правилом треугольников), вычисляются определители третьего порядка входящие в состав выражения (7):
detA = 4(10∙7∙2+(-20) ∙3∙5+5∙7∙10-5∙7∙10-10∙7∙3-5∙(-20) ∙2)-7∙(7,5∙7∙2+(-20) ∙3∙2+7∙3∙10-10∙7∙2-(-20)∙3∙2-7,5∙7∙3)+5∙(7,5∙5∙2+10∙3∙2+3∙5∙10-10∙5∙2-10∙3∙2-3∙5∙7,5)-6∙(7,5∙5∙7+3∙5∙(-20)+10∙7∙2-(-20) ∙5∙2-10∙3∙7-7,5∙7∙5)
detA = 4∙(140-300+350-350-210+200)-7∙(105-120+210-140+120-157,5)+5∙(75+60+150-100-60-112,5)-6∙(262,5-300+140+200-210-262,5)
detA = 4∙(-170)-7∙17,5+5∙12,5-6∙(-170)
detA = 280
Ответ: определитель матрицы равен 280
Дата: 2019-12-10, просмотров: 257.