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

📄 brent.txt

📁 Numeric Programs
💻 TXT
字号:
Function BRENT(AX, BX, CX, TOL:real;var XMIN:real):real;
label 1,2,3;
const
    ITMAX = 100;  CGOLD = 0.381966;  ZEPS = 0.1e-9;
var
    A,B,D,V,X,W,E,FV1,XM,TOL1,TOL2,FX,FW,P,Q,R,ETEMP,DUM,U,ZZ,FU:real;
    ITER,I:integer;
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;
    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 goto 3;
        If Abs(E) > TOL1 Then
        begin
            R:=(X - W) * (FX - FV1);
            Q:=(X - V) * (FX - FW);
            P:=(X - V) * Q - (X - W) * R;
            Q:=2  * (Q - R);
            If Q > 0  Then P:=-P;
            Q:=Abs(Q);
            ETEMP:=E;
            E:=D;
            DUM:=Abs(0.5 * Q * ETEMP);
            If (Abs(P)>=DUM) or (P<=Q*(B - X)) or (P>=Q*(B - X)) Then
                GOTO 1;
            D:=P / Q;
            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;
            goto 2;
        end;
1:      If X >= XM Then
          E:=A - X
        Else
          E:=B - X;
        D:=CGOLD * E;
2:      If Abs(D) >= TOL1 Then
            U:=X + D
        Else 
        begin
            if D >= 0 THEN
                ZZ:=1
            else
                ZZ:=-1;
            U:=X + Abs(TOL1) * ZZ;
        end;
        FU:=FUNC(U);
        If FU <= FX Then
        begin
            If U >= X Then
                A:=X
            Else
                B:=X;
            V:=W;
            FV1:=FW;
            W:=X;
            FW:=FX;
            X:=U;
            FX:=FU;
        end
        else
        begin
            If U < X Then
                A:=U
            else
                B:=U;
            If (FU <= FW) Or (W = X) Then
            begin
                V:=W;
                FV1:=FW;
                W:=U;
                FW:=FU;
            end
            Else If (FU <= FV1) Or (V = X) Or (V = W) Then
            begin
                V:=U;
                FV1:=FU;
            end;
        end;
    end; 
    If ITER > ITMAX Then ShowMessage('Brent exceed maximum iterations.');
3:  XMIN:=X;
    BRENT:=FX;
end;

⌨️ 快捷键说明

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