PlayaRosenbrock.cpp

00001 /* @HEADER@ */
00002 //   
00003 /* @HEADER@ */
00004 
00005 #include "PlayaRosenbrock.hpp"
00006 
00007 namespace Playa
00008 {
00009 
00010 void Rosenbrock::eval(const Vector<double>& x, double& f) const
00011 {
00012   f = 0.0;
00013   for (int i=0; i<N_; i++)
00014   {
00015     double p = x[2*i+1] - x[2*i]*x[2*i];
00016     double q = 1.0-x[2*i];
00017     f += alpha_ * p*p + q*q;
00018   }
00019 }
00020 
00021 void Rosenbrock::evalGrad(const Vector<double>& x, double& f,
00022   Vector<double>& df) const
00023 {
00024   f = 0.0;
00025   df.zero();
00026   for (int i=0; i<N_; i++)
00027   {
00028     double p = x[2*i+1] - x[2*i]*x[2*i];
00029     double q = 1.0-x[2*i];
00030     f += alpha_ * p*p + q*q;
00031     df[2*i] += -4.0*alpha_*p*x[2*i] - 2.0*q;
00032     df[2*i+1] += 2.0*alpha_*p; 
00033   }  
00034 }
00035 
00036 Vector<double> Rosenbrock::getInit() const
00037 {
00038   Vector<double> rtn = vs_.createMember();
00039   rtn.setToConstant(-1.0);
00040   return rtn;
00041 }
00042 
00043 
00044 }

doxygen