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

📄 dbrent.txt

📁 用于开发税务票据管理的软件
💻 TXT
字号:
Function DBRENT(AX, BX, CX, TOL:real;var XMIN:real):real;
const
    ITMAX = 100;  ZEPS = 0.1e-9;
var
    ITER:integer;
    A,B,D,V,W,X,E,FX,FV1,DV,DW,DX,FW,XM:real;
    TOL1,TOL2,D1,D2,U1,U2,U,FU,DU,OLDE,ZZ:real;
    DONE,OK1,OK2:boolean;
begin
    A:=AX;
    If CX < AX Then A:=CX;
    B:=AX;
    If CX > AX Then B:=CX;
    V:=BX;
    W:=V;
    X:=V;
    E:=0; 
    FX:=FUNC(X);
    FV1:=FX;
    FW:=FX;
    DX:=DERIV(X);
    DV:=DX;
    DW:=DX;
    For ITER:=1 To ITMAX do
    begin
        XM:=0.5 * (A + B);
        TOL1:=TOL * Abs(X) + ZEPS;
        TOL2:=2  * TOL1;
        If Abs(X - XM) <= (TOL2 - 0.5 * (B - A)) Then
        begin
          DONE:=true;
          break;
        end
        else
          DONE:=false;
        If Abs(E) > TOL1 Then
        begin
            D1:=2 * (B - A);
            D2:=D1;
            If DW <> DX Then D1:=(W - X) * DX / (DX - DW);
            If DV <> DX Then D2:=(V - X) * DX / (DX - DV);
            U1:=X + D1;
            U2:=X + D2;
            OK1:=((A - U1) * (U1 - B) > 0 ) And (DX * D1 <= 0 );
            OK2:=((A - U2) * (U2 - B) > 0 ) And (DX * D2 <= 0 );
            OLDE:=E;
            E:=D;
            If OK1 Or OK2 Then
               If OK1 And OK2 Then
                   D:=D1
               Else
                   D:=D2
            Else
               If OK1 Then
                   D:=D1
               Else
                   D:=D2;
            If Abs(D) > Abs(0.5 * OLDE) Then
            begin
              U:=X + D;
              If (U - A < TOL2) Or (B - U < TOL2) Then
              Begin
                  If XM-X>=0 then
                      ZZ:=1
                  else
                      ZZ:=-1; 
                 D:=Abs(TOL1) * ZZ;
              end;
            end;
        end;
        If DX >= 0  Then
            E:=A - X
        Else
            E:=B - X;
        D:=0.5 * E;
        If Abs(D) >= TOL1 Then
        begin
            U:=X + D;
            FU:=FUNC(U);
        end
        Else
        begin
            if d >=0 then
                ZZ:=1
            else
                ZZ:=-1;
            U:=X + Abs(TOL1) * ZZ;
            FU:=FUNC(U);
            If FU > FX Then
            begin
              DONE:=true;
              break;
            end
            Else
              DONE:=false;
        end;
        DU:=DERIV(U);
        If FU <= FX Then
        begin
            If U >= X Then
                A:=X
            Else
                B:=X;
            V:=W;
            FV1:=FW;
            DV:=DW;
            W:=X;
            FW:=FX;
            DW:=DX;
            X:=U;
            FX:=FU;
            DX:=DU;
        end
        Else
        begin
            If U < X Then
                A:=U
            Else
                B:=U;
            If (FU <= FW) Or (W = X) Then
            begin
                V:=W;
                FV1:=FW;
                DV:=DW;
                W:=U;
                FW:=FU;
                DW:=DU;
            end
            Else If (FU <= FV1) Or (V = X) Or (V = W) Then
            begin
                V:=U;
                FV1:=FU;
                DV:=DU;
            end;
        end;
    end; 
    If Not DONE Then
        ShowMessage('DBRENT exceeded maximum iterations.')
    Else
    begin
        XMIN:=X;
        DBRENT:=FX;
    end;
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -