107 const int iDegree = 5;
108 const Real afRoot[iDegree] =
116 const Real afCoeff[iDegree] =
127 Real fRadius = ((Real)0.5)*(fB - fA);
128 Real fCenter = ((Real)0.5)*(fB + fA);
130 Real fResult = (Real)0.0;
131 for (
int i = 0; i < iDegree; i++)
133 fResult += afCoeff[i]*oF(fRadius*afRoot[i]+fCenter,pvUserData);
140 template <
class Real>
142 Function oF,
void* pvUserData)
145 Real fH = (fB - fA)/(Real)(iNumSamples - 1);
146 Real fResult = ((Real)0.5)*(oF(fA,pvUserData) + oF(fB,pvUserData));
147 for (
int i = 1; i <= iNumSamples - 2; i++)
149 fResult += oF(fA+i*fH,pvUserData);
157 template <
class Real>
159 int iMaxBracket,
void* pvData)
162 m_oFunction = oFunction;
163 m_iMaxLevel = iMaxLevel;
164 m_iMaxBracket = iMaxBracket;
168 template <
class Real>
174 template <
class Real>
177 return m_iMaxBracket;
180 template <
class Real>
186 template <
class Real>
188 Real& rfTMin, Real& rfFMin)
195 Real fF0 = m_oFunction(fT0,m_pvData);
196 Real fFInitial = m_oFunction(fTInitial,m_pvData);
197 Real fF1 = m_oFunction(fT1,m_pvData);
199 GetMinimum(fT0,fF0,fTInitial,fFInitial,fT1,fF1,m_iMaxLevel);
205 template <
class Real>
207 Real fT1, Real fF1,
int iLevel)
232 if ((fT1 - fTm)*(fF0 - fFm) > (fTm - fT0)*(fFm - fF1))
241 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
246 GetBracketedMinimum(fT0,fF0,fTm,fFm,fT1,fF1,iLevel);
254 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
259 GetBracketedMinimum(fT0,fF0,fTm,fFm,fT1,fF1,iLevel);
265 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
266 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
276 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
278 else if ( fF1 < fF0 )
281 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
286 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
287 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
292 template <
class Real>
313 Real fTm = ((Real)0.5)*(fT0+fT1);
314 Real fFm = m_oFunction(fTm,m_pvData);
316 if (fF0 - ((Real)2.0)*fFm + fF1 > (Real)0.0)
325 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
330 GetBracketedMinimum(fT0,fF0,fTm,fFm,fT1,fF1,iLevel);
338 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
343 GetBracketedMinimum(fT0,fF0,fTm,fFm,fT1,fF1,iLevel);
349 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
350 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
360 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
365 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
370 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
371 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
376 template <
class Real>
378 Real fFm, Real fT1, Real fF1,
int iLevel)
380 for (
int i = 0; i < m_iMaxBracket; i++)
390 const Real fEps = (Real)1e-08, fTol = (Real)1e-04;
398 Real fDT0 = fT0 - fTm, fDT1 = fT1 - fTm;
399 Real fDF0 = fF0 - fFm, fDF1 = fF1 - fFm;
400 Real fTmp0 = fDT0*fDF1, fTmp1 = fDT1*fDF0;
401 Real fDenom = fTmp1 - fTmp0;
407 Real fTv = fTm + ((Real)0.5)*(fDT1*fTmp1-fDT0*fTmp0)/fDenom;
409 Real fFv = m_oFunction(fTv,m_pvData);
444 GetMinimum(fT0,fF0,fTm,fFm,iLevel);
445 GetMinimum(fTm,fFm,fT1,fF1,iLevel);
void GetMinimum(Real fT0, Real fT1, Real fTInitial, Real &rfTMin, Real &rfFMin)
static Real TrapezoidRule(int iNumSamples, Real fA, Real fB, Function oF, void *pvUserData=0)
moMinimize1(Function oFunction, int iMaxLevel, int iMaxBracket, void *pvData=0)
static Real GaussianQuadrature(Real fA, Real fB, Function oF, void *pvUserData=0)
static Real FAbs(Real fValue)