PlayaRosenbrock.cpp
00001
00002
00003
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 }