JuliaDynamics / PeriodicOrbits.jl

Interface and algorithms for finding periodic orbits (stable or unstable) in dynamical systems
https://juliadynamics.github.io/PeriodicOrbits.jl/
Other
8 stars 2 forks source link

Minimal period for continuous systems #6

Closed JonasKoziorek closed 1 month ago

JonasKoziorek commented 2 months ago

I reuse the Poincare map current_crossing_time to compute the minimal period of a PO. I create the hyperplane by stepping shortly along the trajectory and using the difference as a normal vector.

JonasKoziorek commented 2 months ago

In our last call, have we decided that minimal period should always be called by periodic orbit returning algorithms? Or not, and we leave it to the user to call it?

We have decided to always complete the orbit on creation and also always check the local stability. Doing minimal period check shouldn't introduce too much overhead.

I think that minimal period should be called by default on creation. We can add a keyword argument to enable the user to disable this (and the local stability check).

JonasKoziorek commented 2 months ago

In a different PR, I will allow the user to enable/disable minimal period check and stability check.

JonasKoziorek commented 2 months ago

I am thinking whether it is useful to have function minimal_period -> minT_PO that returns a new PO with the minimal period or whether it would be enough to have minimal_period -> minT that just returns the minimal period (right now there are both but the second is not exported). If the period is minimal by default in the constructor, the user will not have the need to ever call the first function. What do you think is the best for the user?

Datseris commented 2 months ago

I think minimal_period -> minT_PO makes more sense. Since the struct is immutable and it references the inner vectors, constructing a new version is practically zero cost. In any case, this doesn't matter so much, since we agreed that this function is called internally, so it is not much use for the user to call it. However, it is important to allow to disable the call for performance (which we can do in a different PR).

In a different PR we can make a high level function periodic_orbit and separate a low level function _periodic_orbit. The latter just finds the orbit. While, periodic_orbit first calls _periodic_orbit and then calls both the stability function and the minimal period function. This allows us to detach the internal implementations from the estimation of stability and minimal period. We can do something like:

function _periodic_orbit(...)

return PO, stability, minimalperiod

for the internal function. By default stability, minimalperiod can be both missing. The high level function periodic_orbit then checks and computes the stability and minimal period. This allows the internal algorithms to communitcate the stability of the orbit, if it is known/found while finding the orbit, but also not communicate it if it isn't.

Datseris commented 2 months ago

oh, by the way, I think in most literature what we call "minimal period" is called "principal period". I like minimal more, but we should just put a quick note in the docstring of minimal_period about this.

JonasKoziorek commented 1 month ago

oh, by the way, I think in most literature what we call "minimal period" is called "principal period". I like minimal more, but we should just put a quick note in the docstring of minimal_period about this.

I mentioned prime, principal and fundamental period.

Datseris commented 1 month ago

fantastic