Jeg har fundet en beskrivelse på nettet:
http://www.docjava.dk/matematik/linear_ligningssystemer/linear_ligningssystemer.htmnumrene i mit eksempel henviser til numrene i beskrivelsen.
Jeg har været nødt til at sætte en størrelse på matricen, da min version af delphi ikke kan håndtere ikkebestemte array størrelser.
Formen består af 2 stringgrids og 2 knapper (close og beregn)
I formcreate sættes størrelsen på de to stringgrids og der fyldes tal ind i den første. Jeg har valgt en 3x4 matrice.
closeknappen lukker formen. (flot ikke)
Når der trykkes på 'beregn'-knappen udføres reduktionen, og resultatet skrives i stringgrid2.
Håber du har et udregnet eksempel, så du kan kontrollere resultatet.
Og til eksemplet :
unit Echelonm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const
n = 4; {kolonner}
m = 3; {rækker}
type
Tmatrix = record
col : array[1..n] of extended;
end;
var
Form1: TForm1;
matrix : array[1..m] of Tmatrix;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
i,j: integer;
begin
with stringgrid1 do
begin
ColCount := n;
RowCount := m;
width := ColCount*DefaultColwidth+5;
height := RowCount*DefaultRowHeight+5;
end;
with stringgrid2 do
begin
ColCount := n;
RowCount := m;
width := ColCount*DefaultColwidth+5;
height := RowCount*DefaultRowHeight+5;
end;
stringgrid2.top := stringgrid1.top;
stringgrid2.left := stringgrid1.left+stringgrid1.width+10;
matrix[1].col[1] := 0;
matrix[1].col[2] := 2;
matrix[1].col[3] := 3;
matrix[1].col[4] := 4;
matrix[2].col[1] := 5;
matrix[2].col[2] := 6;
matrix[2].col[3] := 7;
matrix[2].col[4] := 8;
matrix[3].col[1] := 9;
matrix[3].col[2] := 10;
matrix[3].col[3] := 11;
matrix[3].col[4] := 12;
for i := 1 to n do
for j := 1 to m do
stringgrid1.cells[i-1,j-1] := Floattostrf(matrix[j].col[i],ffFixed,15,2);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,k : integer;
temp : Tmatrix;
ok,chk: boolean;
x: extended;
begin
ok := false;
i := 1; {1}
Repeat
If matrix[i].col[i] = 0 then {2}
begin
chk := false;
for j := 1 to m do
begin
if ((j <> i) and ( matrix[j].col[i] <> 0)) then
begin
chk := true;
temp := matrix[j];
matrix[j] := matrix[i];
matrix[i] := temp;
end;
end;
if not chk then break;
end;
If matrix[i].col[i] <> 1 then {3}
begin
for j := 1 to n do
matrix[i].col[j] := matrix[i].col[j] / matrix[i].col[i];
end;
for j := 1 to m do {4}
begin
if (j <> i) then
begin
x := matrix[j].col[i];
for k := 1 to n do
matrix[j].col[k] := matrix[j].col[k]-x*matrix[i].col[k];
end;
end;
if ((i = m) or (i=n)) then {5}
begin
Ok := true;
break;
end;
inc(i); {6}
until i > m;
if ok then
begin
for i := 1 to n do
for j := 1 to m do
stringgrid2.cells[i-1,j-1] := Floattostrf(matrix[j].col[i],ffFixed,15,2);
end
else
showmessage('Matricen kan ikke reduceres');
end;
end.