📄 amoeba.txt
字号:
Procedure AMOEBA(var P:matrx2;var Y:array of real; MP, NP:integer;
NDIM:integer; FTOL:real;var ITER:integer);
const
NMAX = 20; ALPHA = 1; BETA = 0.5; GAMMA = 2; ITMAX = 500;
var
PR, PRR, PBAR:array[0..20] of real;
I,J,ILO,MPTS,IHI,INHI:integer;
RTOL,YPR,YPRR:real;
begin
MPTS:=NDIM + 1;
ITER:=0;
while true do
begin
ILO:=1;
If Y[1] > Y[2] Then
begin
IHI:=1;
INHI:=2;
end
Else
begin
IHI:=2;
INHI:=1;
end;
For I:=1 To MPTS do
begin
If Y[I] < Y[ILO] Then ILO:=I;
If Y[I] > Y[IHI] Then
begin
INHI:=IHI;
IHI:=I;
end
Else If Y[I] > Y[INHI] Then
If I <> IHI Then INHI:=I;
end;
RTOL:=2 * Abs(Y[IHI] - Y[ILO]) / (Abs(Y[IHI]) + Abs(Y[ILO]));
If RTOL < FTOL Then Exit;
If ITER = ITMAX Then
begin
ShowMessage('Amoeba exceeding maximum iterations.');
Exit;
end;
ITER:=ITER + 1;
For J:=1 To NDIM do
PBAR[J]:=0;
For I:=1 To MPTS do
begin
If I <> IHI Then
begin
For J:=1 To NDIM do
PBAR[J]:=PBAR[J] + P[I, J];
end;
end;
For J:=1 To NDIM do
begin
PBAR[J]:=PBAR[J] / NDIM;
PR[J]:=(1 + ALPHA) * PBAR[J] - ALPHA * P[IHI, J];
end;
YPR:=FAMOEB(PR);
If YPR <= Y[ILO] Then
begin
For J:=1 To NDIM do
PRR[J]:=GAMMA * PR[J] + (1 - GAMMA) * PBAR[J];
YPRR:=FAMOEB(PRR);
If YPRR < Y[ILO] Then
begin
For J:=1 To NDIM do
P[IHI, J]:=PRR[J];
Y[IHI]:=YPRR;
end
Else
begin
For J:=1 To NDIM do
P[IHI, J]:=PR[J];
Y[IHI]:=YPR;
end;
end
Else If YPR >= Y[INHI] Then
begin
If YPR < Y[IHI] Then
begin
For J:=1 To NDIM do
P[IHI, J]:=PR[J];
Y[IHI]:=YPR;
end;
For J:=1 To NDIM do
PRR[J]:=BETA * P[IHI, J] + (1 - BETA) * PBAR[J];
YPRR:=FAMOEB(PRR);
If YPRR < Y[IHI] Then
begin
For J:=1 To NDIM do
P[IHI, J]:=PRR[J];
Y[IHI]:=YPRR;
end
Else
begin
For I:=1 To MPTS do
begin
If I <> ILO Then
begin
For J:=1 To NDIM do
begin
PR[J]:=0.5 * (P[I, J] + P[ILO, J]);
P[I, J]:=PR[J];
end;
Y[I]:=FAMOEB(PR);
end;
end;
end;
end
Else if (YPR > Y[ILO]) and (YPR < Y[INHI]) then
begin
For J:=1 To NDIM do
P[IHI, J]:=PR[J];
Y[IHI]:=YPR;
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -