Prev
| Next
|
|
|
|
|
objective |
|
@(@\newcommand{\B}[1]{{\bf #1}}
\newcommand{\R}[1]{{\rm #1}}@)@Computes the Control Objective Function
Syntax
F = control::objective(delta_t, q, x, y)
Prototype
template <class Scalar> Scalar
objective(
const Scalar& delta_t ,
const VECTOR(Scalar)& q ,
const MATRIX(Scalar)& x ,
const MATRIX(Scalar)& y )
Definition
The objective
@(@
F : \B{R}^{2 \times J} \times \B{R}^{4 \times J} \rightarrow \B{R}
@)@
is defined by
@[@
F (x, y)
=
\frac{1}{2} \sum_{i=0}^3 q_i y_{i,J-1}^2
+
\frac{\Delta t}{4} \left(
x_{0,0}^2 + x_{1,0}^2 + x_{0,J-1}^2 + x_{1,J-1}^2
+
2 \sum_{j=1}^{J-2} \left( x_{0,j}^2 + x_{1,j}^2 \right)
\right)
@]@
Example
bool test_control_objective(void)
{ bool ok = true;
double eps99 = 99.0 * std::numeric_limits<double>::epsilon();
//
VECTOR(double) q(4);
MATRIX(double) x(2, 3);
MATRIX(double) y(4, 3);
for(size_t i = 0; i < 4; i++)
{ q[i] = double(i + 1);
for(size_t j = 0; j < 3; j++)
{ y(i, j) = double(i + j + 1);
if( i < 2 )
x(i, j) = double(j - i + 2);
}
}
double delta_t = 0.5;
double F = control::objective(delta_t, q, x, y);
//
double check = x(0,0) * x(0,0) + x(1,0) * x(1,0);
check += 2.0 * ( x(0,1) * x(0,1) + x(1,1) * x(1,1) );
check += x(0,2) * x(0,2) + x(1,2) * x(1,2);
check *= delta_t / 4.0;
for(size_t i = 0; i < 4; i++)
check += q[i] * y(i,2) * y(i, 2) / 2.0;
ok &= CppAD::NearEqual(F, check, eps99, eps99);
//
return ok;
}
Input File: src/control.hpp