Poincare map and return time - interval version
Computing rigorous bounds for Poincare map is quite similar to nonrigorous version - see Poincare maps - nonrigorous methods. We have to specify initial condition as doubleton set (see Representation of initial condition)
capd::dynset::C0DoubletonSet< capd::IMatrix, C0Rect2Policies > C0Rect2Set
Definition: typedefs.h:46
and call operator of class IPoincareMap
capd::poincare::PoincareMap< capd::IOdeSolver > IPoincareMap
Definition: typedefs.h:44
intervals::DoubleInterval interval
Definition: DoubleInterval.h:36
The following example is a complete proof of the existence of Lyapunov orbit L1 in the Planar Restricted Circular Three Body Problem for a fixed Jacobi constant.
Complete example (from examples/poincare/IPoincareMapExample.cpp):
#include <iostream>
void pcr3bpVectorField(Node , Node in[],
int , Node out[],
int , Node params[],
int )
{
Node mj = 1-params[0];
Node xMu = in[0] + params[0];
Node xMj = in[0] - mj;
Node xMuSquare = xMu^2;
Node xMjSquare = xMj^2;
Node ySquare = in[1]^2;
Node factor1 = mj*((xMuSquare+ySquare)^-1.5);
Node factor2 = params[0]*((xMjSquare+ySquare)^-1.5);
out[0] = in[2];
out[1] = in[3];
out[2] = in[0] - xMu*factor1 - xMj*factor2 + 2*in[3];
out[3] = in[1]*(1 - factor1 - factor2) - 2*in[2];
}
{
return sqrt(
sqr(x) + 2.*(mj/
abs(x+mu) + mu/
abs(x-mj)) + mu*mj - JacobiConstant);
}
cout.precision(17);
int dim=4, noParam=1;
vf.setParameter(0, mu);
L1[0] = 0.9208034913207435 +
interval(-1,1)*5e-15;
cout <<
"P(left)=(" <<
left[0] <<
"," <<
left[2] <<
")" << endl;
cout <<
"P(right)=(" <<
right[0] <<
"," <<
right[2] <<
")" << endl;
pm(set,returnTime);
cout << "half return time=" << returnTime << endl;
cout <<
"The existence of L1 orbit validated with accuracy " <<
diam(L1[0]) << endl;
else
cout << "Could not validate L1 periodic orbit" << endl;
return 0;
}
interval toEnergyLevel(interval x, interval mu, interval JacobiConstant)
Definition: IPoincareMapExample.cpp:37
This class is used to represent a map .
Definition: Map.h:125
long double right(long double x)
Definition: doubleFun.h:95
long double rightBound(long double x)
Definition: doubleFun.h:120
long double leftBound(long double x)
Definition: doubleFun.h:105
long double left(long double x)
Definition: doubleFun.h:85
double sqr(double x)
Definition: power.h:42
T abs(const T &x)
Definition: minmax.h:54
int main(int argc, char *argv[])
Definition: argdemo.cpp:81
Interval< T_Bound, T_Rnd > sqrt(const Interval< T_Bound, T_Rnd > &x)
square root of x
Definition: Interval_Fun.hpp:290
void pcr3bpVectorField(Node, Node in[], int, Node out[], int, Node params[], int)
Definition: mapExample.cpp:16
Interval diam(const Interval &ix)
Definition: Interval.h:816
IVector leftVector(const IVector &u)
Definition: Vector_Interval.hpp:29
IVector rightVector(const IVector &u)
Definition: Vector_Interval.hpp:36
Definition: ApplicationDesc.h:23
capd::dynsys::OdeSolver< capd::IMap > IOdeSolver
Definition: typedefs.h:19
capd::poincare::CoordinateSection< capd::IMatrix > ICoordinateSection
Definition: typedefs.h:30
Definition: NodeType.h:192
Derivative of Poincare map.
The class IPoincareMap provides an overloaded operator for computation of Poincare map and its derivative. First, an initial condition for the main equation and for the variational equation must be specified - see Representation of initial condition.
capd::dynset::C1DoubletonSet< capd::IMatrix, C1Rect2Policies > C1Rect2Set
Definition: typedefs.h:54
We have to define an interval matrix that will store bound for set of monodromy matrices where and is a bound for the return time.
Eventually we have to call an operator
IVector P = pm(set,monodromyMatrix,returnTime);
- Note
- The last argument
returnTime
is optional and can be skipped for autonomous systems
After successful integration we have
P
bound for the Poincare map at the set of initial conditions set
- bound for the monodromy matrix
Given monodromy matrix we can recompute it to derivative of Poincare map by
IMatrix DP = pm.computeDP(P,monodromyMatrix,returnTime);
- Note
- for nonautonomous systems the argument
returnTime
can be skipped
- Note
- we split computation of derivative of Poincare map into computation of monodromy matrix and solving implicit equation. This is because the user can provide own and optimized routine for recomputation of monodromy matrix to derivative of Poincare map. For user convenience we provide a general routine
computeDP
.
- Note
- The matrix
DP
returned by computeDP
is in full dimension. One can take a submatrix of DP
that correspond to variables on the section.
Below we give an easy example of computing derivative of Poincare map. See also more advanced examples
Complete example (from examples/poincare/IPoincareMapDerivativeExample.cpp):
#include <iostream>
{
cout.precision(17);
try{
IMap vectorField(
"par:a,b;var:x,y,z;fun:-(y+z),x+b*y,b+z*(x-a);");
interval data[] = {0.,-8.3809417428298 , 0.029590060630665};
IVector P = pm(set,monodromyMatrix,returnTime);
IMatrix DP = pm.computeDP(P,monodromyMatrix,returnTime);
cout << " u=" << u << endl;
cout << "P(u)=" << P << endl;
cout << "return time = " << returnTime << endl;
cout << "monodromyMatrix=" << monodromyMatrix << endl;
cout << "DP(u)=" << DP << endl;
}catch(exception& e)
{
cout << "\n\nException caught: "<< e.what() << endl;
}
return 0;
}
@ MinusPlus
Definition: BasicPoincareMap.h:37