23 sum_tixi_.resize(dim);
24 sum_ti2xi_.resize(dim);
25 for (
unsigned int i = 0; i < dim; ++i) {
27 sum_tixi_.at(i) = 0.0;
28 sum_ti2xi_.at(i) = 0.0;
34 Eigen::MatrixXd Tmat(
N_, 3);
35 Eigen::MatrixXd pinvTmat(3,
N_);
37 for (
unsigned int i = 0; i <
N_; ++i) {
38 Tmat(i, 2) = 0.5 * time * time;
48 pinv0_ =
new double[
N_];
49 pinv1_ =
new double[
N_];
50 pinv2_ =
new double[
N_];
54 c0_.assign(dim_, 0.0);
55 c1_.assign(dim_, 0.0);
56 c2_.assign(dim_, 0.0);
59 for (
unsigned int i = 0; i <
N_; ++i) {
60 pinv2_[i] = pinvTmat(2, i);
61 pinv1_[i] = pinvTmat(1, i);
62 pinv0_[i] = pinvTmat(0, i);
67 double QuadEstimator::getEsteeme() {
return coeff_(2); }
70 const std::vector<double>& el,
85 sum_ti3_ += t * t * t;
86 sum_ti4_ += t * t * t * t;
88 for (
unsigned int i = 0; i < esteem.size(); ++i) {
94 sum_tixi_.at(i) += t * x;
95 sum_ti2xi_.at(i) += t * t * x;
116 sum_ti3_ += t * t * t;
117 sum_ti4_ += t * t * t * t;
120 0.25 *
N_ * sum_ti3_ * sum_ti3_ - 0.5 * sum_ti3_ * sum_ti2_ * sum_ti_ +
121 0.25 * sum_ti2_ * sum_ti2_ * sum_ti2_ +
122 0.25 * sum_ti4_ * sum_ti_ * sum_ti_ - 0.25 *
N_ * sum_ti4_ * sum_ti2_;
123 double den2 = 1.0 / (2.0 * den);
130 for (
unsigned int i = 0; i < dim; ++i) {
134 sum_tixi_[i] += t * x;
135 sum_ti2xi_[i] += t * t * x;
137 a = den2 * (sum_ti2xi_[i] * (sum_ti_ * sum_ti_ -
N_ * sum_ti2_) +
138 sum_tixi_[i] * (
N_ * sum_ti3_ - sum_ti2_ * sum_ti_) +
139 sum_xi_[i] * (sum_ti2_ * sum_ti2_ - sum_ti3_ * sum_ti_));
151 sum_tixi_[i] -= t_old * x;
152 sum_ti2xi_[i] -= t_old * t_old * x;
155 sum_ti2_ -= t_old * t_old;
156 sum_ti3_ -= t_old * t_old * t_old;
157 sum_ti4_ -= t_old * t_old * t_old * t_old;
162 void QuadEstimator::fit() {
164 double sum_ti2 = 0.0;
165 double sum_ti3 = 0.0;
166 double sum_ti4 = 0.0;
168 double sum_tixi = 0.0;
169 double sum_ti2xi = 0.0;
171 for (
unsigned int i = 0; i <
N_; ++i) {
173 sum_ti2 +=
t_[i] *
t_[i];
174 sum_ti3 +=
t_[i] *
t_[i] *
t_[i];
175 sum_ti4 +=
t_[i] *
t_[i] *
t_[i] *
t_[i];
177 sum_tixi +=
t_[i] *
x_[i];
178 sum_ti2xi +=
t_[i] *
t_[i] *
x_[i];
181 double den = 0.25 *
N_ * sum_ti3 * sum_ti3 -
182 0.5 * sum_ti3 * sum_ti2 * sum_ti +
183 0.25 * sum_ti2 * sum_ti2 * sum_ti2 +
184 0.25 * sum_ti4 * sum_ti * sum_ti - 0.25 *
N_ * sum_ti4 * sum_ti2;
185 double den4 = 1.0 / (4.0 * den);
187 coeff_(2) = den4 * (sum_ti2xi * (sum_ti * sum_ti -
N_ * sum_ti2) +
188 sum_tixi * (
N_ * sum_ti3 - sum_ti2 * sum_ti) +
189 sum_xi * (sum_ti2 * sum_ti2 - sum_ti3 * sum_ti));
190 coeff_(1) = den4 * (sum_ti2xi * (
N_ * sum_ti3 - sum_ti2 * sum_ti) +
191 sum_tixi * (sum_ti2 * sum_ti2 -
N_ * sum_ti4) +
192 sum_xi * (sum_ti4 * sum_ti - sum_ti3 * sum_ti2));
200 const std::vector<double>& el) {
202 std::cerr <<
"Error: dt cannot be zero" << std::endl;
204 for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = 0.0;
213 if ((
pt_ + 1) <
N_) {
216 for (
unsigned int i = 0; i < esteem.size(); ++i) esteem[i] = el[i];
229 for (
int i = 0; i < dim_; ++i) {
234 for (
unsigned int j = 0; j <
N_; ++j) {
236 if (idx >=
N_) idx -=
N_;
238 c0_[i] += x * pinv0_[j];
239 c1_[i] += x * pinv1_[j];
240 c2_[i] += x * pinv2_[j];
244 esteem[i] = 0.5 * c2_[i] * tmed_ * tmed_ + c1_[i] * tmed_ + c0_[i];
249 std::vector<double>& estimateDerivative,
const unsigned int order) {
252 for (
int i = 0; i < dim_; ++i)
253 estimateDerivative[i] =
254 0.5 * c2_[i] * tmed_ * tmed_ + c1_[i] * tmed_ + c0_[i];
258 for (
int i = 0; i < dim_; ++i)
259 estimateDerivative[i] = c2_[i] * tmed_ + c1_[i];
263 for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = c2_[i];
267 for (
int i = 0; i < dim_; ++i) estimateDerivative[i] = 0.0;
unsigned int N_
Window length.
std::vector< double > time_list_
Time vector corresponding to each element in elem_list_.
double dt_
Sampling (control) time.
bool dt_zero_
Indicate that dt is zero (dt is invalid)
Eigen::VectorXd coeff_
Coefficients for the least squares solution.
unsigned int pt_
Circular index to each data and time element.
std::vector< double > t_
Time vector setting the lowest time to zero (for numerical stability).
std::vector< std::vector< double > > elem_list_
All the data (N elements of size dim)
virtual void estimateRecursive(std::vector< double > &estimee, const std::vector< double > &el, const double &time)
virtual void getEstimateDerivative(std::vector< double > &estimeeDerivative, const unsigned int order)
QuadEstimator(const unsigned int &N, const unsigned int &dim, const double &dt=0.0)
virtual void estimate(std::vector< double > &estimee, const std::vector< double > &el)
void pinv(const Eigen::MatrixXd &matrix_in, Eigen::MatrixXd &pseudo_inv, const double &pinvtoler=1.0e-6)