
12.05.2010, 19:51
|
Прохожий
|
|
Регистрация: 12.05.2010
Сообщения: 1
Репутация: 10
|
|
помогите сделать блок-схему к методу зейделя (код есть)
есть программа, но затрудняюсь к ней нарисовать блок-схему..
помогите плиз)
вот тут прога -->
Код:
{Решение СЛАУ методом Зейделя
Идея: задана основная матрица A и вектор B
Сначала нормализуем матрицу и вектор.
Вычисляется транспонированная матрица A ,т.е A^t;
Выполняются действия: A'=(A^t)*A; B'=(A^t)*b
Далее операции выполняются над этими матрицами
Случайным образом задается вектор X(x1,x2,..,xn);
Далее вычисляется вектор Xk через Xk-1.
}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids,MAth;
type
Matrix=array [1..10,1..10] of Real;
Vector=array [1..10] of Real;
TForm1 = class(TForm)
Ad: TStringGrid;
Calculate: TButton;
edEpsilon: TEdit;
Bd: TStringGrid;
edN: TEdit;
Label1: TLabel;
Label2: TLabel;
Cd: TStringGrid;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure CalculateClick(Sender: TObject);
procedure edNChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
eps : Real;
n : Byte;
A : Matrix;
B : Vector;
implementation
{$R *.dfm}
procedure TForm1.CalculateClick(Sender: TObject);
var
i,j,k : Byte;
atr : Matrix;
tt : Real;
A1 : Matrix;
A2 : Matrix;
B1 : Vector;
X : vector;
X1 : vector;
function CheckConds:Boolean;
{Условие прекращения вычислений}
var
l : Byte;
mm : Real;
begin
mm:=abs(X1[1]-X[1]);
for l:=2 to n do begin
if mm<abs(X1[l]-X[l])
then mm:=abs(X1[l]-X[l]);
if mm<eps then CheckConds:=true else CheckConds:=false;
end;
end;
procedure CalculateNextX;
var
l,m : Byte;
zz : real;
begin
for l:=1 to n do begin
zz:=(B[l]/A[l,l]);
for m:=1 to n do begin
if m=l then continue;
zz:=zz-(A[l,m]*X[m]/A[l,l])
end;
X[l]:=zz;
end;
end;
begin
n:=StrToInt(edN.Text);
eps:=StrToFloat(edEpsilon.Text);
for i:=0 to n-1 do begin
for j:=0 to n-1 do begin
A[i+1,j+1]:=StrToFloat(Ad.Cells[j,i]);
end;
B[i+1]:=StrToFloat(Bd.Cells[0,i]);
end;
A1:=A;
for i:=1 to n do begin
for j:=i to n do begin
tt:=A1[i,j];
A1[i,j]:=A1[j,i];
A1[j,i]:=tt;
end;
end;
for i:=1 to n do begin
for j:=1 to n do begin
tt:=0;
for k:=1 to n do begin
tt:=tt+A1[i,k]*A[k,j]
end;
A2[i,j]:=tt;
end;
end;
for i:=1 to n do begin
tt:=0;
for k:=1 to n do begin
tt:=tt+A1[i,k]*B[k];
end;
B1[i]:=tt;
end;
A:=A2;
B:=B1;
for i:=1 to n do
X[i]:=0;
repeat
X1:=X;
CalculateNextX;
until CheckConds;
for i:=0 to n-1 do begin
Cd.Cells[0,i]:=FloatToStr(RoundTo(X[i+1],-10));
end;
end;
procedure TForm1.edNChange(Sender: TObject);
var
z : Byte;
begin
z:=StrToInt(edN.Text);
AD.RowCount:=z;
AD.ColCount:=z;
Cd.RowCount:=z;
Bd.RowCount:=z;
end;
end.
|