Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 29.11.2011
Репутация: нет Всего: нет
|
Всем доброго времени суток.Не без помощи написала алгоритм метода вращений Якоби и нашла собственные значения, проблема в нахождении кол-ва итераций.использую функцию inc(), но для моего конкретного примера вместо трех итераций получаю 85, подскажите, в чем кроется зло? | Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type TForm1 = class(TForm) strngrd1: TStringGrid; btn1: TButton; strngrd2: TStringGrid; lbl1: TLabel; lbl2: TLabel; lbl3: TLabel; lbl4: TLabel; lbl5: TLabel; lbl6: TLabel; lbl7: TLabel; lbl8: TLabel; lbl9: TLabel; lbl10: TLabel; strngrd3: TStringGrid; lbl11: TLabel; lbl12: TLabel; procedure btn1Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1; c1:integer; implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject); var a,u,ut,p,q,x:array[1..3,1..3] of Real; i,j,m,n,k, i_zapomnit,j_zapomnit:integer; max, fi,t,epc : Real; begin
epc:=0.01; n:=3; for j:=0 to n-1 do for i:=0 to n-1 do begin a[i+1,j+1]:=StrToFloatDef(strngrd1.Cells[j,i],0); end;
repeat Inc(c1);
begin // íàõîäèì max íåäèàãîíàëüíûé ýëåìåíò max:=a[1,2]; //äåëàåì òàê ÷òî ïåðâûé ýëåìåíò ñ÷èòàåòüñÿ ìàêñèìàëüíûì for i:=1 to n do for j:=1 to n do
if max<a[i,j] then if (i<>j) then begin max:=abs(a[i,j]); i_zapomnit:=i; j_zapomnit:=j; end;
// íàõîäèì óãîë fi fi:=0.5*( ArcTan(2*a[i_zapomnit,j_zapomnit]/(a[i_zapomnit,i_zapomnit]-a[j_zapomnit,j_zapomnit])));
u[i_zapomnit,i_zapomnit]:= cos(fi); u[i_zapomnit,j_zapomnit]:= sin(fi); u[j_zapomnit,i_zapomnit]:= -1*Sin(fi); u[j_zapomnit,j_zapomnit]:= Cos(fi); end;
// ñîçäàåì ìàòðèöó u for i:=1 to n do for j:=1 to n do begin if (((i=i_zapomnit) and (j=i_zapomnit)) or
((i=j_zapomnit) and (j=i_zapomnit)) or
((i=i_zapomnit) and (j=j_zapomnit)) or
((i=j_zapomnit) and (j=j_zapomnit))) then begin
end else begin if (i=j) then u[i,j]:=1 else u[i,j]:=0; end; end;
//ñîçäàíèå òðàíñïîíèðîâàííîé ìàòðèöû Ut Begin For i := 1 to n do For j := 1 to n do ut[i,j]:= u[j,i]; end;
// A=UT*A*U for i := 1 to n do for j := 1 to n do begin p[i,j] := 0; for k := 1 to n do p[i,j] := p[i,j] + ut[i,k] * a[k,j]; end;
for i := 1 to n do for j := 1 to n do begin q[i,j] := 0; for k := 1 to n do q[i,j] := q[i,j] + p[i,k] * u[k,j]; end;
t:=Sqrt(q[1,2]*q[1,2]+q[1,3]*q[1,3]+q[2,3]*q[2,3]);
for i:=0 to n do for j:=0 to n do a[i,j]:=q[i,j]; until t<epc;
for i:=0 to n do for j:=0 to n do strngrd2.cells[i,j]:=floattostr(q[j+1,i+1]); lbl1.Caption:=FloatToStr(q[1,1]); lbl2.Caption:=FloatToStr(q[2,2]); lbl3.Caption:=FloatToStr(q[3,3]); lbl7.Caption:=FloatTostr(t); lbl12.Caption:=FloatTostr(c1); end;
end.
|
|