📄 jacobi.txt
字号:
Procedure JACOBI(A:matrx2; N:integer;var D:array of real;
var V:matrx2;var NROT:integer);
var
B,Z:array[0..100] of real; IP,IQ,I,J:integer;
SM,G,DDD,TRESH,H,T,S,SSS,THETA,C,TAU:real;
begin
For IP:=1 To N do
begin
For IQ:=1 To N do
V[IP, IQ]:=0;
V[IP, IP]:=1;
end;
For IP:=1 To N do
begin
B[IP]:=A[IP, IP];
D[IP]:=B[IP];
Z[IP]:=0;
end;
NROT:=0;
For I:=1 To 50 do
begin
SM:=0;
For IP:=1 To N - 1 do
For IQ:=IP + 1 To N do
SM:=SM + Abs(A[IP, IQ]);
If SM = 0 Then Exit;
If I < 4 Then
TRESH:=0.2 * SM / Sqr(N)
Else
TRESH:=0;
For IP:=1 To N - 1 do
begin
For IQ:=IP + 1 To N do
begin
G:=100 * Abs(A[IP, IQ]);
SSS:=Abs(D[IP]) + G;
DDD:=Abs(D[IQ]) + G;
If (I > 4) And (SSS=Abs(D[IP])) And (DDD=Abs(D[IQ])) Then
A[IP, IQ]:=0
Else If Abs(A[IP, IQ]) > TRESH Then
begin
H:=D[IQ] - D[IP];
If Abs(H) + G = Abs(H) Then
T:=A[IP, IQ] / H
Else
begin
THETA:=0.5 * H / A[IP, IQ];
T:=1 / (Abs(THETA) + Sqrt(1 + Sqr(THETA)));
If THETA < 0 Then T:=-T;
end;
C:=1 / Sqrt(1 + Sqr(T));
S:=T * C;
TAU:=S /(1 + C);
H:=T * A[IP, IQ];
Z[IP]:=Z[IP] - H;
Z[IQ]:=Z[IQ] + H;
D[IP]:=D[IP] - H;
D[IQ]:=D[IQ] + H;
A[IP, IQ]:=0;
For J:=1 To IP - 1 do
begin
G:=A[J, IP];
H:=A[J, IQ];
A[J, IP]:=G - S * (H + G * TAU);
A[J, IQ]:=H + S * (G - H * TAU);
end;
For J:=IP + 1 To IQ - 1 do
begin
G:=A[IP, J];
H:=A[J, IQ];
A[IP, J]:=G - S * (H + G * TAU);
A[J, IQ]:=H + S * (G - H * TAU);
end;
For J:=IQ + 1 To N do
begin
G:=A[IP, J];
H:=A[IQ, J];
A[IP, J]:=G - S * (H + G * TAU);
A[IQ, J]:=H + S * (G - H * TAU);
end;
For J:=1 To N do
begin
G:=V[J, IP];
H:=V[J, IQ];
V[J, IP]:=G - S * (H + G * TAU);
V[J, IQ]:=H + S * (G - H * TAU);
end;
NROT:=NROT + 1;
end;
end;
end;
For IP:=1 To N do
begin
B[IP]:=B[IP] + Z[IP];
D[IP]:=B[IP];
Z[IP]:=0;
end;
end;
ShowMessage(' 50 iterations should never happen');
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -