--- trunk/OOPSE/libmdtools/Minimizer1D.cpp 2004/02/03 20:43:08 1010 +++ trunk/OOPSE/libmdtools/Minimizer1D.cpp 2004/02/03 22:54:52 1015 @@ -1,14 +1,6 @@ #include "Minimizer1D.hpp" #include "math.h" -//----------------------------------------------------------------------------// -void Minimizer1D::Minimize(vector& direction, double left, double right){ - setDirection(direction); - setRange(left,right); - minimize(); -} - -//----------------------------------------------------------------------------// GoldenSectionMinimizer::GoldenSectionMinimizer(NLModel* nlp) :Minimizer1D(nlp){ setName("GoldenSection"); @@ -27,15 +19,19 @@ void GoldenSectionMinimizer::minimize(){ const double goldenRatio = 0.618034; - currentX = model->getX(); + tempX = currentX = model->getX(); alpha = leftVar + (1 - goldenRatio) * (rightVar - leftVar); beta = leftVar + goldenRatio * (rightVar - leftVar); - tempX = currentX + direction * alpha; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * alpha; + fAlpha = model->calcF(tempX); - tempX = currentX + direction * beta; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * beta; + fBeta = model->calcF(tempX); for(currentIter = 0; currentIter < maxIteration; currentIter++){ @@ -50,7 +46,8 @@ void GoldenSectionMinimizer::minimize(){ alpha = beta; beta = leftVar + goldenRatio * (rightVar - leftVar); - tempX = currentX + beta * direction; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * beta; prevMinVar = minVar; fPrevMinVar = fMinVar; @@ -64,7 +61,8 @@ void GoldenSectionMinimizer::minimize(){ beta = alpha; alpha = leftVar + (1 - goldenRatio) * (rightVar - leftVar); - tempX = currentX + alpha * direction; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * alpha; prevMinVar = minVar; fPrevMinVar = fMinVar; @@ -107,10 +105,14 @@ void BrentMinimizer::minimize(){ currentX = tempX = model->getX(); - tempX = currentX + leftVar * direction; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * leftVar; + fLeftVar = model->calcF(tempX); + + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * rightVar; - tempX = currentX + rightVar * direction; fRightVar = model->calcF(tempX); if(fRightVar < fLeftVar) { @@ -165,7 +167,9 @@ void BrentMinimizer::minimize(){ u = fabs(d) >= stepTol ? minVar + d : minVar + copysign(d, stepTol); - tempX = currentX + u * direction; + for (int i = 0; i < tempX.size(); i ++) + tempX[i] = currentX[i] + direction[i] * u; + fu = model->calcF(); if(fu <= fMinVar){