📄 brent.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 + -