⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amoeba.txt

📁 《Delphi常用数值算法集》的配书源码
💻 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 + -