Attribute VB_Name = "Mod1DMinimization" Option Explicit 'Public Variables for minimization routines Public FA As Double Public FB As Double Public FC As Double Public AX As Double Public BX As Double Public CX As Double Public A As Double Public B As Double Public C As Double Public Xmin As Double Public Gold As Double Public Sub MNBRAKCV(AX, BX, NumOfLocs) Dim Gold As Single Dim glimit As Single Dim tiny As Double Dim DUM As Double Dim DONE As Integer Dim Q As Double Dim R As Double Dim U As Double Dim ULIM As Double Dim FU As Double Gold = 1.618034 glimit = 500 tiny = 1 * 10 ^ -20 FA = BBLikelihoodVar(AX, NumOfLocs) FB = BBLikelihoodVar(BX, NumOfLocs) If FB > FA Then DUM = AX AX = BX BX = DUM DUM = FB FB = FA FA = DUM End If CX = BX + Gold * (BX - AX) If CX < 0 Then CX = BX - BX * 0.99 End If FC = BBLikelihoodVar(CX, NumOfLocs) A = AX B = BX C = CX Do While FB >= FC R = (BX - AX) * (FB - FC) Q = (BX - CX) * (FB - FA) DUM = Q - R If Abs(DUM) < tiny Then DUM = tiny U = BX - ((BX - CX) * Q - (BX - AX) * R) / (2 * DUM) ULIM = BX + glimit * (CX - BX) If (BX - U) * (U - CX) > 0 Then FU = BBLikelihoodVar(U, NumOfLocs) If FU < FC Then AX = BX FA = FB BX = U FB = FU Exit Sub ElseIf FU > FB Then CX = U FC = FU Exit Sub End If U = CX + Gold * (CX - BX) FU = BBLikelihoodVar(U, NumOfLocs) ElseIf (CX - U) * (U - ULIM) > 0 Then FU = BBLikelihoodVar(U, NumOfLocs) If FU < FC Then BX = CX CX = U U = CX + Gold * (CX - BX) FB = FC FC = FU FU = BBLikelihoodVar(U, NumOfLocs) End If ElseIf (U - ULIM) * (ULIM - CX) >= 0 Then U = ULIM FU = BBLikelihoodVar(U, NumOfLocs) Else U = CX + Gold * (CX - BX) FU = BBLikelihoodVar(U, NumOfLocs) End If AX = BX BX = CX CX = U FA = FB FB = FC FC = FU Loop End Sub Public Sub goldenCV(AX, BX, CX, TOL, NumOfLocs) Dim R As Single Dim C As Single Dim X0 As Double Dim X1 As Double Dim X2 As Double Dim X3 As Double Dim F1 As Double Dim F2 As Double R = 0.61803399 C = 0.38196602 X0 = AX X3 = CX If Abs(CX - BX) > Abs(BX - AX) Then X1 = BX X2 = BX + C * (CX - BX) Else X2 = BX X1 = BX - C * (BX - AX) End If F1 = BBLikelihoodVar(X1, NumOfLocs) F2 = BBLikelihoodVar(X2, NumOfLocs) Do While Abs(X2 - X0) > TOL * (Abs(X1) + Abs(X2)) If F2 < F1 Then X0 = X1 X1 = X2 X2 = R * X1 + C * X3 F1 = F2 F2 = BBLikelihoodVar(X2, NumOfLocs) Else X3 = X2 X2 = X1 X1 = R * X2 + C * X0 F2 = F1 F1 = BBLikelihoodVar(X1, NumOfLocs) End If Loop If F1 < F2 Then Gold = F1 Xmin = X1 Else Gold = F2 Xmin = X2 End If End Sub Public Function BBLikelihoodVar(Var, NumOfLocs) Dim I As Double Dim Location As Double Dim DensityAtI As Double Dim LnDensityAtI As Double Dim SumLogDensity As Double Dim BBVar As Double Dim sqdist As Double Dim TimeI As Double Dim TotalTimeI As Double Dim MeanX As Double Dim MeanY As Double Dim Alpha As Double Dim Dist2 As Double Dim Stand As Double Dim TelemVar As Double BBVar = Var TelemVar = TelemErrorStdDev ^ 2 I = 1 'Calculate density at each location ReDim densityarrayati(NumOfLocs) DensityAtI = 0 Dim count As Integer count = (NumOfLocs - 1) / 2 Do Until I > NumOfLocs - 2 TimeI = SortedXYArray(I, 2) - SortedXYArray(I - 1, 2) TotalTimeI = SortedXYArray(I + 1, 2) - SortedXYArray(I - 1, 2) MeanX = (TimeI / TotalTimeI) * (SortedXYArray(I + 1, 0) - SortedXYArray(I - 1, 0)) + SortedXYArray(I - 1, 0) MeanY = (TimeI / TotalTimeI) * (SortedXYArray(I + 1, 1) - SortedXYArray(I - 1, 1)) + SortedXYArray(I - 1, 1) Dist2 = ((SortedXYArray(I, 0) - MeanX) ^ 2 + (SortedXYArray(I, 1) - MeanY) ^ 2) Alpha = TimeI / TotalTimeI Stand = TotalTimeI * Alpha * (1 - Alpha) * BBVar + ((Alpha ^ 2 + (1 - Alpha) ^ 2) * TelemVar) DensityAtI = 1 / (2 * Pi * Stand) * Exp(-0.5 * (Dist2 / (Stand))) If DensityAtI = 0 Then MsgBox "density at i = 0" End If LnDensityAtI = Log(DensityAtI) SumLogDensity = LnDensityAtI + SumLogDensity I = I + 2 Loop BBLikelihoodVar = -SumLogDensity End Function