Ejemplo n.º 1
0
      // dump statistics and weighted average
      void dump(std::ostream& os, std::string msg="PRS") throw(Exception)
      {
         try {
            was.setMessage(msg);
            os << was << std::endl;

            if(ndof > 0) {
               // scale covariance
               double sig(::sqrt(APV/ndof));
               Matrix<double> Cov(was.getCov());
               for(size_t i=0; i<Cov.rows(); i++) for(size_t j=i; j<Cov.cols(); j++)
                  Cov(i,j) = Cov(j,i) = Cov(i,j)*sig;
               // print cov as labelled matrix
               Namelist NL;
               NL += "ECEF_X"; NL += "ECEF_Y"; NL += "ECEF_Z";
               LabeledMatrix LM(NL,Cov);
               LM.scientific().setprecision(3).setw(14);

               os << "Covariance: " << msg << std::endl << LM << std::endl;
               os << "APV: " << msg << std::fixed << std::setprecision(3)
                  << " sigma = " << sig << " meters with "
                  << ndof << " degrees of freedom.";
            }
            else os << " Not enough data for covariance.";
         }
         catch(Exception& e) { GPSTK_RETHROW(e); }
      }
Ejemplo n.º 2
0
int main (int argc, char **argv){
  int const		accSigma    = 1;
  int const             t = (argc == 2)?(lexical_cast<int>(argv[1])):(4);
  double const		deltaT	    = 1.0;
  dmat			A(2,2), B(2,2), G(2,1), Q(2,2);
  dmat			State(2,1), Cov(2,2), Ctrl(2,1);
  std::vector<dmat>	Result;

  A(0,0) = 1;A(0,1) = deltaT;
  A(1,0) = 0;A(1,1) = 1;

  B(0,0) = 0;B(0,1) = 0;
  B(1,0) = 0;B(1,1) = 0;

  G(0,0) = deltaT * deltaT * 0.5;
  G(1,0) = deltaT;
  Q = accSigma * prod(G, trans(G));
  
  State(0,0) = 0;
  State(1,0) = 0;

  Cov(0,0) = 1;Cov(0,1) = 0;
  Cov(1,0) = 0;Cov(1,1) = 1;

  Ctrl(0,0) = 0;
  Ctrl(1,0) = 0;

  KalmanFilter kf = KalmanFilter(&A, &B, &Q, accSigma);

  for(int i = 0; i < t; ++i){
    string fileName = "KFCorrect(k=" + lexical_cast<string>(i + 1) + ").txt";
    ofstream ofs(fileName.c_str());
    Result = kf.Correct(&State, &Cov, &Ctrl, &G);
    State = Result.at(0);
    Cov = Result.at(1);

    for(double location = -20.0; location <= 20.0; location += 0.5){
      for(double vel = -10.0; vel <= 10.0; vel += 0.5){
	dmat Info(2,1);
	Info(0,0) = location;
	Info(1,0) = vel;
	double prob = kf.calcBelief(&Info, &State, &Cov);
	
	ofs << location << "\t" << vel << "\t" << prob << endl;
      }
    }
  }

  return 0;
}
Ejemplo n.º 3
0
      // dump statistics and weighted average
      void dump(std::ostream& os, std::string msg="") const throw(Exception)
      {
         try {
            os << "Simple statistics on " << msg << std::endl
               << std::fixed << std::setprecision(3);
            if(N > 0) {
               os << "  " << lab[0] << " N: " << S[0].N()
                  << std::fixed << std::setprecision(4)
                  << " Ave: " << S[0].Average() << " Std: " << S[0].StdDev()
                  << " Min: " << S[0].Minimum() << " Max: " << S[0].Maximum()
                  << std::endl;
               os << "  " << lab[1] << " N: " << S[1].N()
                  << std::fixed << std::setprecision(4)
                  << " Ave: " << S[1].Average() << " Std: " << S[1].StdDev()
                  << " Min: " << S[1].Minimum() << " Max: " << S[1].Maximum()
                  << std::endl;
               os << "  " << lab[2] << " N: " << S[2].N()
                  << std::fixed << std::setprecision(4)
                  << " Ave: " << S[2].Average() << " Std: " << S[2].StdDev()
                  << " Min: " << S[2].Minimum() << " Max: " << S[2].Maximum()
                  << std::endl;

               os << "Weighted average " << msg << std::endl;
               Matrix<double> Cov(inverseSVD(sumInfo));
               Vector<double> Sol(Cov * sumInfoState);
               os << std::setw(14) << std::setprecision(4) << Sol << "    " << N;
            }
            else os << " No data!";
         }
         catch(Exception& e) { GPSTK_RETHROW(e); }
      }
Ejemplo n.º 4
0
Archivo: cma.cpp Proyecto: slehm/moop
void CMA::Reset()
{
  Optimizer::Reset();

  Cov.Clear();
  for (int i=0;i<dim;i++) Cov(i,i)=1.0;
  std::fill(Pc.begin(),Pc.end(),0);
  sigma=0.5;
  psucc=ptarget;
}
Ejemplo n.º 5
0
   // -------------------------------------------------------------
   /// output at each stage ... the user may override
   /// if singular is true, State and Cov may or may not be good
   virtual void output(int N) throw()
   {
      int i;
      std::ostringstream oss;

      if(stage == Unknown) {
         LOG(ERROR) << "Kalman stage not defined in output().";
         return;
      }

      // if MU or SU, output the namelist first
      // TD make verbose
      if(stage == MU || stage == SU) {
         oss << (stage==MU ? "KNL" : "KSL") << msg << " "
            << std::fixed << N << " " << std::setprecision(3) << time;
         gpstk::Namelist NL = srif.getNames();
         for(i=0; i<NL.size(); i++)
            oss << std::setw(10) << NL.getName(i);

         LOG(INFO) << oss.str();
         oss.str("");
      }

      // output a label
      switch(stage) {
         case    Init: oss << "KIN"; break;
         case      AD1:
         case      AD2:
         case      AD3: oss << "KAD"; break;
         case      TU: oss << "KTU"; break;
         case      MU: oss << "KMU"; break;
         case      SU: oss << "KSU"; break;
         default:
         case Unknown:
            LOG(INFO) << "Kalman stage not defined." << std::endl;
            return;
      }
      oss << msg << " ";

      // output the time
      oss << std::fixed << N << " " << std::setprecision(3) << time;

      // output the state
      for(i=0; i<State.size(); i++)
         oss << " " << std::setw(9) << State(i);

      // output sqrt of diagonal covariance elements
      oss << std::scientific << std::setprecision(2);
      for(i=0; i<State.size(); i++)
         oss << " " << std::setw(10) << (singular ? 0.0 : sqrt(Cov(i,i)));

      LOG(INFO) << oss.str();
   }
Ejemplo n.º 6
0
bool rspfSensorModelTuple::getGroundObsEqComponents(
      const rspf_int32 img,
      const rspf_int32 iter,
      const rspfDpt& obs,
      const rspfGpt& ptEst,
      rspfDpt& resid,
      NEWMAT::Matrix& B,
      NEWMAT::SymmetricMatrix& W) const
{
   if (iter==0)
   {
      rspfGpt ptObs(obs.samp,obs.line);
      theImages[img]->getForwardDeriv(OBS_INIT, ptObs);
   }
   resid = theImages[img]->getForwardDeriv(EVALUATE, ptEst);
   rspfDpt pWRTx = theImages[img]->getForwardDeriv(P_WRT_X, ptEst);
   rspfDpt pWRTy = theImages[img]->getForwardDeriv(P_WRT_Y, ptEst);
   rspfDpt pWRTz = theImages[img]->getForwardDeriv(P_WRT_Z, ptEst);
   NEWMAT::SymmetricMatrix Cov(2);
   rspfSensorModel::CovMatStatus covStatus;
   covStatus = theImages[img]->getObsCovMat(obs,Cov);
   NEWMAT::Matrix Wfull = invert(Cov);
   W << Wfull;
   B[0][0] = pWRTx.u;
   B[1][0] = pWRTx.v;
   B[0][1] = pWRTy.u;
   B[1][1] = pWRTy.v;
   B[0][2] = pWRTz.u;
   B[1][2] = pWRTz.v;
   
   if (traceDebug())
   {
      rspfNotify(rspfNotifyLevel_DEBUG)
         << "DEBUG: getGroundObsEqComponents:"
         << "\n  pWRTx: "<<pWRTx
         << "\n  pWRTy: "<<pWRTy
         << "\n  pWRTz: "<<pWRTz <<std::endl;
   }
   
   bool covOK = false;
   if (covStatus == rspfSensorModel::COV_FULL)
      covOK = true;
   
   return covOK;
}