From a974e7427372c14bd67c219fe0824a849e4e0b34 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Tue, 9 Apr 2024 07:56:40 +0000 Subject: [PATCH] build based on e496c06 --- latest/.documenter-siteinfo.json | 2 +- .../abc_flow/{c0666aea.svg => f1cb6da4.svg} | 90 ++++++------- latest/abc_flow/index.html | 4 +- latest/coupled_harmonic_oscillator/index.html | 6 +- latest/diagnostics/index.html | 2 +- latest/double_pendulum/index.html | 6 +- latest/harmonic_oscillator/index.html | 2 +- latest/henon_heiles/index.html | 2 +- latest/index.html | 2 +- latest/inner_solar_system/index.html | 2 +- latest/kepler_problem/index.html | 2 +- latest/lorenz_attractor/index.html | 2 +- latest/lotka_volterra_2d.svg | 118 +++++++++--------- latest/lotka_volterra_2d/index.html | 8 +- latest/lotka_volterra_3d/index.html | 2 +- latest/lotka_volterra_4d/index.html | 2 +- latest/massless_charged_particle.svg | 110 ++++++++-------- latest/massless_charged_particle/index.html | 2 +- latest/nonlinear_oscillators/index.html | 2 +- latest/objects.inv | Bin 1863 -> 1862 bytes latest/outer_solar_system/index.html | 2 +- latest/pendulum/index.html | 2 +- latest/point_vortices/index.html | 2 +- latest/q_component.png | Bin 0 -> 117191 bytes latest/releasenotes/index.html | 2 +- latest/search_index.js | 2 +- .../{81cb3e78.svg => b0252da6.svg} | 88 ++++++------- latest/toda_lattice/index.html | 2 +- 28 files changed, 233 insertions(+), 233 deletions(-) rename latest/abc_flow/{c0666aea.svg => f1cb6da4.svg} (93%) create mode 100644 latest/q_component.png rename latest/toda_lattice/{81cb3e78.svg => b0252da6.svg} (89%) diff --git a/latest/.documenter-siteinfo.json b/latest/.documenter-siteinfo.json index 0295e8f..a78e893 100644 --- a/latest/.documenter-siteinfo.json +++ b/latest/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-03-21T19:41:45","documenter_version":"1.3.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.2","generation_timestamp":"2024-04-09T07:56:35","documenter_version":"1.3.0"}} \ No newline at end of file diff --git a/latest/abc_flow/c0666aea.svg b/latest/abc_flow/f1cb6da4.svg similarity index 93% rename from latest/abc_flow/c0666aea.svg rename to latest/abc_flow/f1cb6da4.svg index e02a7c4..97a4ad6 100644 --- a/latest/abc_flow/c0666aea.svg +++ b/latest/abc_flow/f1cb6da4.svg @@ -1,59 +1,59 @@ - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/abc_flow/index.html b/latest/abc_flow/index.html index 8214116..58dcf11 100644 --- a/latest/abc_flow/index.html +++ b/latest/abc_flow/index.html @@ -9,8 +9,8 @@ for solution in ensemble_solution plot!(p, solution.q[:, 1], solution.q[:, 2], solution.q[:, 3]) end -pExample block output

Library functions

GeometricProblems.ABCFlowModule

ABC Flow

\[\begin{aligned} +pExample block output

Library functions

GeometricProblems.ABCFlowModule

ABC Flow

\[\begin{aligned} \dot{x} = A\sin(z) + C\cos(y) \\ \dot{y} = B\sin(x) + A\cos(z) \\ \dot{z} = C\sin(y) + B\cos(x) -\end{aligned}\]

source
[1]
E. Hairer, C. Lubich and G. Wanner. Geometric Numerical integration: structure-preserving algorithms for ordinary differential equations (Springer, Berlin, 2006).
+\end{aligned}\]

source
[1]
E. Hairer, C. Lubich and G. Wanner. Geometric Numerical integration: structure-preserving algorithms for ordinary differential equations (Springer, Berlin, 2006).
diff --git a/latest/coupled_harmonic_oscillator/index.html b/latest/coupled_harmonic_oscillator/index.html index 155d0a8..f099f86 100644 --- a/latest/coupled_harmonic_oscillator/index.html +++ b/latest/coupled_harmonic_oscillator/index.html @@ -1,14 +1,14 @@ -Coupled Harmonic Oscillator · GeometricProblems.jl

Coupled Harmonic Oscillator

This system describes two harmonic oscillators that are coupled nonlinearly.

Library functions

GeometricProblems.CoupledHarmonicOscillatorModule
CoupledHarmonicOscillator

The CoupledHarmonicOscillator module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.

The coupled harmonic oscillator is a collection of two point masses that are connected to a fixed wall with spring constants $k_1$ and $k_2$ and are furthermore coupled nonlinearly resulting in the Hamiltonian:

\[H(q_1, q_2, p_1, p_2) = \frac{q_1^2}{2m_1} + \frac{q_2^2}{2m_2} + k_1\frac{q_1^2}{2} + k_2\frac{q_2^2}{2} + k\sigma(q_1)\frac{(q_2 - q_1)^2}{2},\]

where $\sigma(x) = 1 / (1 + e^{-x})$ is the sigmoid activation function.

System parameters:

  • k₁: spring constant of mass 1
  • k₂: spring constant of mass 2
  • m₁: mass 1
  • m₂: mass 2
  • k: coupling strength between the two masses.
source
GeometricProblems.CoupledHarmonicOscillator.hodeproblemFunction
Hamiltonian problem for coupled oscillator

Constructor with default arguments:

hodeproblem(
+Coupled Harmonic Oscillator · GeometricProblems.jl

Coupled Harmonic Oscillator

This system describes two harmonic oscillators that are coupled nonlinearly.

The following shows the $q_1$ component of the system for different values of $k$:

Library functions

GeometricProblems.CoupledHarmonicOscillatorModule
CoupledHarmonicOscillator

The CoupledHarmonicOscillator module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.

The coupled harmonic oscillator is a collection of two point masses that are connected to a fixed wall with spring constants $k_1$ and $k_2$ and are furthermore coupled nonlinearly resulting in the Hamiltonian:

\[H(q_1, q_2, p_1, p_2) = \frac{q_1^2}{2m_1} + \frac{q_2^2}{2m_2} + k_1\frac{q_1^2}{2} + k_2\frac{q_2^2}{2} + k\sigma(q_1)\frac{(q_2 - q_1)^2}{2},\]

where $\sigma(x) = 1 / (1 + e^{-x})$ is the sigmoid activation function.

System parameters:

  • k₁: spring constant of mass 1
  • k₂: spring constant of mass 2
  • m₁: mass 1
  • m₂: mass 2
  • k: coupling strength between the two masses.
source
GeometricProblems.CoupledHarmonicOscillator.hodeproblemFunction
Hamiltonian problem for coupled oscillator

Constructor with default arguments:

hodeproblem(
     q₀ = [1.0, 0.0],
     p₀ = [2.0, 0.0];
     tspan = (0.0, 100.0),
     tstep = 0.4,
     params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)
-)
source
GeometricProblems.CoupledHarmonicOscillator.lodeproblemFunction
Lagrangian problem for the coupled oscillator

Constructor with default arguments:

lodeproblem(
     q₀ = [1.0, 0.0],
     p₀ = [2.0, 0.0];
     tspan = (0.0, 100.0),
     tstep = 0.4,
     params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)
-)
source
+)
source
diff --git a/latest/diagnostics/index.html b/latest/diagnostics/index.html index d8661c9..3e226c0 100644 --- a/latest/diagnostics/index.html +++ b/latest/diagnostics/index.html @@ -1,2 +1,2 @@ -Diagnostics · GeometricProblems.jl

Diagnostics

GeometricProblems.Diagnostics.compute_error_driftMethod

Computes the drift in an invariant error.

Arguments: (t::TimeSeries, invariant_error::DataSeries{T,1}, interval_length=100)

The time series of the solution is split into intervals of interval_length time steps. In each interval, the maximum of the absolute value of the invariant error is determined. Returns a tuple of a TimeSeries that holds the centers of all intervals and a ScalarDataSeries that holds the maxima.

This is useful to detect drifts in invariants that are not preserved exactly but whose error is oscillating such as the energy error of Hamiltonian systems with symplectic integrators.

source
GeometricProblems.Diagnostics.compute_invariantMethod

Compute an invariant for the solution of a partitioned ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.

Returns a ScalarDataSeries holding the time series of the invariant.

source
GeometricProblems.Diagnostics.compute_invariantMethod

Compute an invariant for the solution of an ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.

Returns a ScalarDataSeries holding the time series of the invariant.

source
GeometricProblems.Diagnostics.compute_invariant_errorMethod

Compute the relative error of an invariant for the solution of an ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.

Returns a tuple of two 1d DataSeries holding the time series of the invariant and the relativ error, respectively.

source
GeometricProblems.Diagnostics.compute_invariant_errorMethod

Compute the relative error of an invariant for the solution of a partitioned ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.

Returns a tuple of two ScalarDataSeries holding the time series of the invariant and the relativ error, respectively.

source
GeometricProblems.Diagnostics.compute_momentum_errorMethod

Computes the difference of the momentum and the one-form of an implicit ODE or DAE system.

Arguments: (p::DataSeries{DT}, ϑ::DataSeries{DT})

Returns a DataSeries similar to p holding the time series of the difference between p and ϑ.

source
GeometricProblems.Diagnostics.compute_one_formMethod

Compute the one-form (symplectic potential) for the solution of a Lagrangian system.

Arguments: (t::TimeSeries, q::DataSeries, one_form::Base.Callable)

The one_form function needs to take three arguments (t,q,k) where k is the index of the one-form component.

Returns a DataSeries similar to q holding the time series of the one-form.

source
+Diagnostics · GeometricProblems.jl

Diagnostics

GeometricProblems.Diagnostics.compute_error_driftMethod

Computes the drift in an invariant error.

Arguments: (t::TimeSeries, invariant_error::DataSeries{T,1}, interval_length=100)

The time series of the solution is split into intervals of interval_length time steps. In each interval, the maximum of the absolute value of the invariant error is determined. Returns a tuple of a TimeSeries that holds the centers of all intervals and a ScalarDataSeries that holds the maxima.

This is useful to detect drifts in invariants that are not preserved exactly but whose error is oscillating such as the energy error of Hamiltonian systems with symplectic integrators.

source
GeometricProblems.Diagnostics.compute_invariantMethod

Compute an invariant for the solution of a partitioned ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.

Returns a ScalarDataSeries holding the time series of the invariant.

source
GeometricProblems.Diagnostics.compute_invariantMethod

Compute an invariant for the solution of an ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.

Returns a ScalarDataSeries holding the time series of the invariant.

source
GeometricProblems.Diagnostics.compute_invariant_errorMethod

Compute the relative error of an invariant for the solution of an ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.

Returns a tuple of two 1d DataSeries holding the time series of the invariant and the relativ error, respectively.

source
GeometricProblems.Diagnostics.compute_invariant_errorMethod

Compute the relative error of an invariant for the solution of a partitioned ODE or DAE system.

Arguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)

The invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.

Returns a tuple of two ScalarDataSeries holding the time series of the invariant and the relativ error, respectively.

source
GeometricProblems.Diagnostics.compute_momentum_errorMethod

Computes the difference of the momentum and the one-form of an implicit ODE or DAE system.

Arguments: (p::DataSeries{DT}, ϑ::DataSeries{DT})

Returns a DataSeries similar to p holding the time series of the difference between p and ϑ.

source
GeometricProblems.Diagnostics.compute_one_formMethod

Compute the one-form (symplectic potential) for the solution of a Lagrangian system.

Arguments: (t::TimeSeries, q::DataSeries, one_form::Base.Callable)

The one_form function needs to take three arguments (t,q,k) where k is the index of the one-form component.

Returns a DataSeries similar to q holding the time series of the one-form.

source
diff --git a/latest/double_pendulum/index.html b/latest/double_pendulum/index.html index b002b76..172474c 100644 --- a/latest/double_pendulum/index.html +++ b/latest/double_pendulum/index.html @@ -20,16 +20,16 @@ \end{align*}\]

the Hamiltonian can be obtained via the Legendre transform,

\[H = \sum_{i=1}^2 \dot{\theta}_i p_i - L ,\]

as

\[\begin{align*} H &= \frac{m_2 l_2^2 p^2_{\theta_1} + (m_1 + m_2) l_1^2 p^2_{\theta_2} - 2 m_2 l_1 l_2 p_{\theta_1} p_{\theta_2} \cos(\theta_1 - \theta_2)}{2 m_2 l_1^2 l_2^2 \left[ m_1 + m_2 \sin^2(\theta_1 - \theta_2) \right] } \\ & \qquad\qquad \vphantom{\frac{l}{l}} - g (m_1 + m_2) l_1 \cos\theta_1 - g m_2 l_2 \cos\theta_2 . -\end{align*}\]

Library functions

GeometricProblems.DoublePendulumModule
DoublePendulum

The DoublePendulum module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.

The double pendulum consists of two pendula, one attached to the origin at $(x,y) = (0,0)$, and the second attached to the first. Each pendulum consists of a point mass $m_i$ attached to a massless rod of length $l_i$ with $i \in (1,2)$. The dynamics of the system is described in terms of the angles $\theta_i$ between the rods $l_i$ and the vertical axis $y$. All motion is assumed to be frictionless.

System parameters:

  • l₁: length of rod 1
  • l₂: length of rod 2
  • m₁: mass of pendulum 1
  • m₂: mass of pendulum 2
  • g: gravitational constant
source
GeometricProblems.DoublePendulum.hodeproblemFunction
Hamiltonian problem for the double pendulum

Constructor with default arguments:

hodeproblem(
+\end{align*}\]

Library functions

GeometricProblems.DoublePendulumModule
DoublePendulum

The DoublePendulum module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.

The double pendulum consists of two pendula, one attached to the origin at $(x,y) = (0,0)$, and the second attached to the first. Each pendulum consists of a point mass $m_i$ attached to a massless rod of length $l_i$ with $i \in (1,2)$. The dynamics of the system is described in terms of the angles $\theta_i$ between the rods $l_i$ and the vertical axis $y$. All motion is assumed to be frictionless.

System parameters:

  • l₁: length of rod 1
  • l₂: length of rod 2
  • m₁: mass of pendulum 1
  • m₂: mass of pendulum 2
  • g: gravitational constant
source
GeometricProblems.DoublePendulum.hodeproblemFunction
Hamiltonian problem for the double pendulum

Constructor with default arguments:

hodeproblem(
     q₀ = [π/4, π/2],
     p₀ = [3.3321622036187746, 7.0685834705770345];
     tspan = (0.0, 10.0),
     tstep = 0.01,
     params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)
-)
source
GeometricProblems.DoublePendulum.lodeproblemFunction
Lagrangian problem for the double pendulum

Constructor with default arguments:

lodeproblem(
     q₀ = [π/4, π/2],
     p₀ = [3.3321622036187746, 7.0685834705770345];
     tspan = (0.0, 10.0),
     tstep = 0.01,
     params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)
-)
source
+)source diff --git a/latest/harmonic_oscillator/index.html b/latest/harmonic_oscillator/index.html index 8262b28..90b20d7 100644 --- a/latest/harmonic_oscillator/index.html +++ b/latest/harmonic_oscillator/index.html @@ -1,2 +1,2 @@ -Harmonic Oscillator · GeometricProblems.jl +Harmonic Oscillator · GeometricProblems.jl diff --git a/latest/henon_heiles/index.html b/latest/henon_heiles/index.html index f31896f..f198dea 100644 --- a/latest/henon_heiles/index.html +++ b/latest/henon_heiles/index.html @@ -1,2 +1,2 @@ -Hénon-Heiles System · GeometricProblems.jl +Hénon-Heiles System · GeometricProblems.jl diff --git a/latest/index.html b/latest/index.html index 11d2dfb..9c83f1e 100644 --- a/latest/index.html +++ b/latest/index.html @@ -11,4 +11,4 @@ year={2020}, howpublished={\url{https://github.com/JuliaGNI/GeometricProblems.jl}}, doi={10.5281/zenodo.4285904} -}

Figure License

Copyright (c) Michael Kraus <michael.kraus@ipp.mpg.de>

All figures are licensed under the Creative Commons CC BY-NC-SA 4.0 License.

Software License

Copyright (c) Michael Kraus <michael.kraus@ipp.mpg.de>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+}

Figure License

Copyright (c) Michael Kraus <michael.kraus@ipp.mpg.de>

All figures are licensed under the Creative Commons CC BY-NC-SA 4.0 License.

Software License

Copyright (c) Michael Kraus <michael.kraus@ipp.mpg.de>

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

diff --git a/latest/inner_solar_system/index.html b/latest/inner_solar_system/index.html index 9232a94..874e179 100644 --- a/latest/inner_solar_system/index.html +++ b/latest/inner_solar_system/index.html @@ -1,2 +1,2 @@ -Inner Solar System · GeometricProblems.jl +Inner Solar System · GeometricProblems.jl diff --git a/latest/kepler_problem/index.html b/latest/kepler_problem/index.html index c31d7f0..28151d9 100644 --- a/latest/kepler_problem/index.html +++ b/latest/kepler_problem/index.html @@ -1,2 +1,2 @@ -Kepler Problem · GeometricProblems.jl +Kepler Problem · GeometricProblems.jl diff --git a/latest/lorenz_attractor/index.html b/latest/lorenz_attractor/index.html index 2eb3c43..1271b0e 100644 --- a/latest/lorenz_attractor/index.html +++ b/latest/lorenz_attractor/index.html @@ -1,2 +1,2 @@ -Lorenz Attractor · GeometricProblems.jl +Lorenz Attractor · GeometricProblems.jl diff --git a/latest/lotka_volterra_2d.svg b/latest/lotka_volterra_2d.svg index d2c824f..4658395 100644 --- a/latest/lotka_volterra_2d.svg +++ b/latest/lotka_volterra_2d.svg @@ -1,78 +1,78 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/lotka_volterra_2d/index.html b/latest/lotka_volterra_2d/index.html index 8d6ecb0..c13303d 100644 --- a/latest/lotka_volterra_2d/index.html +++ b/latest/lotka_volterra_2d/index.html @@ -8,13 +8,13 @@ H (q) = a_1 \, q_1 + a_2 \, q_2 + b_1 \, \log q_1 + b_2 \, \log q_2 .\]

Sub-models

The Euler-Lagrange equations of the Lotka-Volterra model can be obtained from different Lagrangians, which are connected by gauge transformations. Although they all lead to the same equations of motion, they lead to different variational integrators. Therefore different models based on different Lagrangians are implemented.

GeometricProblems.LotkaVolterra2dModule

Lotka-Volterra model in 2D

\[\begin{aligned} L (q, \dot{q}) &= \bigg( q_2 + \frac{\log q_2}{q_1} \bigg) \, \dot{q_1} + q_1 \, \dot{q_2} - H(q) , \\ H(q) &= a_1 \, q_1 + a_2 \, q_2 + b_1 \, \log q_1 + b_2 \, \log q_2 -\end{aligned}\]

source
GeometricProblems.LotkaVolterra2dSymmetricModule

Lotka-Volterra model in 2D with symmetric Lagrangian

\[\begin{aligned} L (q, \dot{q}) &= \frac{1}{2} \frac{\log q_2}{q_1} \, \dot{q_1} - \frac{1}{2} \frac{\log q_1}{q_2} \, \dot{q_2} - H(q) , \\ H(q) &= a_1 \, q_1 + a_2 \, q_2 + b_1 \, \log q_1 + b_2 \, \log q_2 -\end{aligned}\]

This Lagrangian is a slight generalization of Equation (5) in José Fernández-Núñez, Lagrangian Structure of the Two-Dimensional Lotka-Volterra System, International Journal of Theoretical Physics, Vol. 37, No. 9, pp. 2457-2462, 1998.

source
GeometricProblems.LotkaVolterra2dSingularModule

Lotka-Volterra model in 2D with "singular" Lagrangian

\[\begin{aligned} +\end{aligned}\]

This Lagrangian is a slight generalization of Equation (5) in José Fernández-Núñez, Lagrangian Structure of the Two-Dimensional Lotka-Volterra System, International Journal of Theoretical Physics, Vol. 37, No. 9, pp. 2457-2462, 1998.

source
GeometricProblems.LotkaVolterra2dSingularModule

Lotka-Volterra model in 2D with "singular" Lagrangian

\[\begin{aligned} L (q, \dot{q}) &= \frac{\log q_2}{q_1} \, \dot{q_1} - H(q) , \\ H(q) &= a_1 \, q_1 + a_2 \, q_2 + b_1 \, \log q_1 + b_2 \, \log q_2 -\end{aligned}\]

This Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term $- 1/2 \, d(\log(q_1) \log(q_2))/dt$. It leads to the same Euler-Lagrange equations but to a different variational integrator.

source
GeometricProblems.LotkaVolterra2dGaugeModule

Lotka-Volterra model in 2D with symmetric Lagrangian with gauge term

\[\begin{aligned} +\end{aligned}\]

This Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term $- 1/2 \, d(\log(q_1) \log(q_2))/dt$. It leads to the same Euler-Lagrange equations but to a different variational integrator.

source
GeometricProblems.LotkaVolterra2dGaugeModule

Lotka-Volterra model in 2D with symmetric Lagrangian with gauge term

\[\begin{aligned} L (q, \dot{q}) &= \bigg( q_2 + \frac{1}{2} \frac{\log q_2}{q_1} \bigg) \, \dot{q_1} + \bigg( q_1 - \frac{1}{2} \frac{\log q_1}{q_2} \bigg) \, \dot{q_2} - H(q) , \\ H(q) &= a_1 \, q_1 + a_2 \, q_2 + b_1 \, \log q_1 + b_2 \, \log q_2 -\end{aligned}\]

This Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term $d(q_1 q_2)/dt$. It leads to the same Euler-Lagrange equations but to a different variational integrator.

source

User Functions

Plotting Functions

GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!Method

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!Method

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2dMethod

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
+\end{aligned}\]

This Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term $d(q_1 q_2)/dt$. It leads to the same Euler-Lagrange equations but to a different variational integrator.

source

User Functions

Plotting Functions

GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!Method

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!Method

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2dMethod

Plots the solution of a 2D Lotka-Volterra model together with the energy error.

Arguments:

  • sol <: GeometricSolution
  • equ <: GeometricProblem

Keyword aguments:

  • nplot=1: plot every nplotth time step
  • xlims=:auto: xlims for solution plot
  • ylims=:auto: ylims for solution plot
  • latex=true: use LaTeX guides
source
diff --git a/latest/lotka_volterra_3d/index.html b/latest/lotka_volterra_3d/index.html index 121208d..0cded8e 100644 --- a/latest/lotka_volterra_3d/index.html +++ b/latest/lotka_volterra_3d/index.html @@ -7,4 +7,4 @@ 0 & - q_{1} q_{2} & \hphantom{-} q_{1} q_{3} \\ \hphantom{-} q_{1} q_{2} & 0 & - q_{2} q_{3} \\ - q_{1} q_{3} & \hphantom{-} q_{2} q_{3} & 0 \\ -\end{pmatrix} ,\]

and Hamiltonian

\[H(q) = a_{1} q_{1} + a_{2} q_{2} + a_{3} q_{3} + b_{1} \ln q_{1} + b_{2} \ln q_{2} + b_{3} \ln q_{3} .\]

References:

  • A. M. Perelomov. Selected topics on classical integrable systems, Troisième cycle de la physique, expanded version of lectures delivered in May 1995.

  • Yuri B. Suris. Integrable discretizations for lattice systems: local equations of motion and their Hamiltonian properties, Rev. Math. Phys. 11, pp. 727–822, 1999.

source +\end{pmatrix} ,\]

and Hamiltonian

\[H(q) = a_{1} q_{1} + a_{2} q_{2} + a_{3} q_{3} + b_{1} \ln q_{1} + b_{2} \ln q_{2} + b_{3} \ln q_{3} .\]

References:

  • A. M. Perelomov. Selected topics on classical integrable systems, Troisième cycle de la physique, expanded version of lectures delivered in May 1995.

  • Yuri B. Suris. Integrable discretizations for lattice systems: local equations of motion and their Hamiltonian properties, Rev. Math. Phys. 11, pp. 727–822, 1999.

source diff --git a/latest/lotka_volterra_4d/index.html b/latest/lotka_volterra_4d/index.html index 3166322..964b96e 100644 --- a/latest/lotka_volterra_4d/index.html +++ b/latest/lotka_volterra_4d/index.html @@ -1,2 +1,2 @@ -Lotka-Volterra 4d · GeometricProblems.jl +Lotka-Volterra 4d · GeometricProblems.jl diff --git a/latest/massless_charged_particle.svg b/latest/massless_charged_particle.svg index 08593c8..7744caf 100644 --- a/latest/massless_charged_particle.svg +++ b/latest/massless_charged_particle.svg @@ -1,74 +1,74 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/massless_charged_particle/index.html b/latest/massless_charged_particle/index.html index 4b386e9..ecfb5c4 100644 --- a/latest/massless_charged_particle/index.html +++ b/latest/massless_charged_particle/index.html @@ -8,4 +8,4 @@ \end{aligned}\]

The Hamiltonian form of the equations of motion reads

\[\dot{x} = \frac{1}{B(x)} \begin{pmatrix} \hphantom{-} 0 & + 1 \\ - 1 & \hphantom{+} 0 \\ -\end{pmatrix} \nabla \phi (x) .\]

source

+\end{pmatrix} \nabla \phi (x) .\]

source

diff --git a/latest/nonlinear_oscillators/index.html b/latest/nonlinear_oscillators/index.html index b8f0823..9b608b4 100644 --- a/latest/nonlinear_oscillators/index.html +++ b/latest/nonlinear_oscillators/index.html @@ -1,2 +1,2 @@ -Nonlinear Oscillators · GeometricProblems.jl +Nonlinear Oscillators · GeometricProblems.jl diff --git a/latest/objects.inv b/latest/objects.inv index 07811d7cd3029bb17feeeeab2299d28738c8504b..2865535b77852b1861c514d2652c34acc9e955f3 100644 GIT binary patch delta 14 VcmX@kcZ_d>7qgk3!A8HIYyc+y1sMPU delta 15 WcmX@ccbsp67mKN$q2Wf~pKJgt5CuvA diff --git a/latest/outer_solar_system/index.html b/latest/outer_solar_system/index.html index cdeeb40..1661a74 100644 --- a/latest/outer_solar_system/index.html +++ b/latest/outer_solar_system/index.html @@ -1,2 +1,2 @@ -Outer Solar System · GeometricProblems.jl +Outer Solar System · GeometricProblems.jl diff --git a/latest/pendulum/index.html b/latest/pendulum/index.html index 01cea52..bd99bfb 100644 --- a/latest/pendulum/index.html +++ b/latest/pendulum/index.html @@ -1,2 +1,2 @@ -Mathematical Pendulum · GeometricProblems.jl +Mathematical Pendulum · GeometricProblems.jl diff --git a/latest/point_vortices/index.html b/latest/point_vortices/index.html index 6eba326..0930b22 100644 --- a/latest/point_vortices/index.html +++ b/latest/point_vortices/index.html @@ -1,2 +1,2 @@ -Point Vortices · GeometricProblems.jl +Point Vortices · GeometricProblems.jl diff --git a/latest/q_component.png b/latest/q_component.png new file mode 100644 index 0000000000000000000000000000000000000000..77558289a9b6dd15af82533794ecf702d505e20a GIT binary patch literal 117191 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%0AEagan?tw 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 F`XBF5C076d literal 0 HcmV?d00001 diff --git a/latest/releasenotes/index.html b/latest/releasenotes/index.html index bec59b8..afc38c5 100644 --- a/latest/releasenotes/index.html +++ b/latest/releasenotes/index.html @@ -1,2 +1,2 @@ -Release Notes · GeometricProblems.jl +Release Notes · GeometricProblems.jl

Release Notes

0.1.1

New Features

  • Poincaré invariants for Lotka-Volterra 2d model
  • More equation types for massless charged particle

Fixes

  • Fixes in general plot recipes

0.1.0

Initial release with equations for

  • Exponential Growth,
  • Lorenz Attractor in 3D,
  • Lotka-Volterra in 2D,
  • Lotka-Volterra in 3D,
  • Lotka-Volterra in 4D,
  • Massless Charged Particle,
  • Harmonic Oscillator,
  • Mathematical Pendulum,
  • Planar Point Vortices.
diff --git a/latest/search_index.js b/latest/search_index.js index 55a72c8..b7b300f 100644 --- a/latest/search_index.js +++ b/latest/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"double_pendulum/#Double-Pendulum","page":"Double Pendulum","title":"Double Pendulum","text":"","category":"section"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The double pendulum consists of two pendula, one attached to the origin at (xy) = (00), and the second attached to the first. Each pendulum consists of a point mass m_i attached to a massless rod of length l_i with i in (12). All motion is assumed to be frictionless.","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The dynamics of the system is most naturally described in terms of the angles theta_i between the rods l_i and the vertical axis y. In terms of these angles, the cartesian coordinates are given by","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nx_1 = l_1 sintheta_1 \nx_2 = l_1 sintheta_1 + l_2 sintheta_2 \ny_1 = - l_1 costheta_1 \ny_2 = -l_1 costheta_1 - l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"In terms of the generalized coordinates theta_i, the Lagrangian reads","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nL (theta_1 theta_2 dottheta_1 dottheta_2)\n = frac12 (m_1 + m_2) l_1^2 dottheta_1^2 \n + frac12 m_2 l_2^2 dottheta_2^2\n + m_2 l_1 l_2 dottheta_1 dottheta_2 cos(theta_1 - theta_2) \n + g (m_1 + m_2) l_1 costheta_1\n + g m_2 l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The canonical conjugate momenta p_i are obtained from the Lagrangian as","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\np_1 = fracpartial Lpartial dottheta_1 = (m_1 + m_2) l_1^2 dottheta_1 + m_2 l_1 l_2 dottheta_2 cos(theta_1 - theta_2) \np_2 = fracpartial Lpartial dottheta_2 = m_2 l_2^2 dottheta_2 + m_2 l_1 l_2 dottheta_1 cos(theta_1 - theta_2) \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"After solving these relations for the generalized velocities dottheta_i,","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\ndottheta_1 = fracl_2 p_theta_1 - l_1 p_theta_2 cos(theta_1 - theta_2)l_1^2 l_2 left m_1 + m_2 sin^2(theta_1 - theta_2) right \ndottheta_2 = frac(m_1 + m_2) l_1 p_theta_2 - m_2 l_2 p_theta_1 cos(theta_1 - theta_2)m_2 l_1 l_2^2 left m_1 + m_2 sin^2 (theta_1 - theta_2) right \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"the Hamiltonian can be obtained via the Legendre transform,","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"H = sum_i=1^2 dottheta_i p_i - L ","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"as","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nH = fracm_2 l_2^2 p^2_theta_1 + (m_1 + m_2) l_1^2 p^2_theta_2 - 2 m_2 l_1 l_2 p_theta_1 p_theta_2 cos(theta_1 - theta_2)2 m_2 l_1^2 l_2^2 left m_1 + m_2 sin^2(theta_1 - theta_2) right \n qquadqquad vphantomfracll - g (m_1 + m_2) l_1 costheta_1 - g m_2 l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/#Library-functions","page":"Double Pendulum","title":"Library functions","text":"","category":"section"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"GeometricProblems.DoublePendulum","category":"page"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum","text":"DoublePendulum\n\nThe DoublePendulum module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.\n\nThe double pendulum consists of two pendula, one attached to the origin at (xy) = (00), and the second attached to the first. Each pendulum consists of a point mass m_i attached to a massless rod of length l_i with i in (12). The dynamics of the system is described in terms of the angles theta_i between the rods l_i and the vertical axis y. All motion is assumed to be frictionless.\n\nSystem parameters:\n\nl₁: length of rod 1\nl₂: length of rod 2\nm₁: mass of pendulum 1\nm₂: mass of pendulum 2\ng: gravitational constant\n\n\n\n\n\n","category":"module"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"Modules = [GeometricProblems.DoublePendulum]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum.hodeproblem","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum.hodeproblem","text":"Hamiltonian problem for the double pendulum\n\nConstructor with default arguments:\n\nhodeproblem(\n q₀ = [π/4, π/2],\n p₀ = [3.3321622036187746, 7.0685834705770345];\n tspan = (0.0, 10.0),\n tstep = 0.01,\n params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)\n)\n\n\n\n\n\n","category":"function"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum.lodeproblem","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum.lodeproblem","text":"Lagrangian problem for the double pendulum\n\nConstructor with default arguments:\n\nlodeproblem(\n q₀ = [π/4, π/2],\n p₀ = [3.3321622036187746, 7.0685834705770345];\n tspan = (0.0, 10.0),\n tstep = 0.01,\n params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)\n)\n\n\n\n\n\n","category":"function"},{"location":"coupled_harmonic_oscillator/#Coupled-Harmonic-Oscillator","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"","category":"section"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"This system describes two harmonic oscillators that are coupled nonlinearly. ","category":"page"},{"location":"coupled_harmonic_oscillator/#Library-functions","page":"Coupled Harmonic Oscillator","title":"Library functions","text":"","category":"section"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"GeometricProblems.CoupledHarmonicOscillator","category":"page"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator","text":"CoupledHarmonicOscillator\n\nThe CoupledHarmonicOscillator module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.\n\nThe coupled harmonic oscillator is a collection of two point masses that are connected to a fixed wall with spring constants k_1 and k_2 and are furthermore coupled nonlinearly resulting in the Hamiltonian: \n\nH(q_1 q_2 p_1 p_2) = fracq_1^22m_1 + fracq_2^22m_2 + k_1fracq_1^22 + k_2fracq_2^22 + ksigma(q_1)frac(q_2 - q_1)^22\n\nwhere sigma(x) = 1 (1 + e^-x) is the sigmoid activation function. \n\nSystem parameters:\n\nk₁: spring constant of mass 1\nk₂: spring constant of mass 2\nm₁: mass 1\nm₂: mass 2\nk: coupling strength between the two masses. \n\n\n\n\n\n","category":"module"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"Modules = [GeometricProblems.CoupledHarmonicOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator.hodeproblem","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator.hodeproblem","text":"Hamiltonian problem for coupled oscillator\n\nConstructor with default arguments:\n\nhodeproblem(\n q₀ = [1.0, 0.0],\n p₀ = [2.0, 0.0];\n tspan = (0.0, 100.0),\n tstep = 0.4,\n params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)\n)\n\n\n\n\n\n","category":"function"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator.lodeproblem","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator.lodeproblem","text":"Lagrangian problem for the coupled oscillator\n\nConstructor with default arguments:\n\nlodeproblem(\n q₀ = [1.0, 0.0],\n p₀ = [2.0, 0.0];\n tspan = (0.0, 100.0),\n tstep = 0.4,\n params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)\n)\n\n\n\n\n\n","category":"function"},{"location":"abc_flow/#ABC-Flow","page":"ABC Flow","title":"ABC Flow","text":"","category":"section"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"The ABC flow (see [1]) is described by a divergence-free differential equation whose flow strongly depends on the initial condition. ","category":"page"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"using GeometricIntegrators: integrate, ImplicitMidpoint\nusing GeometricProblems.ABCFlow\nusing Plots\n\nensemble_solution = integrate(odeensemble(), ImplicitMidpoint())\n\np = plot()\nfor solution in ensemble_solution\n plot!(p, solution.q[:, 1], solution.q[:, 2], solution.q[:, 3])\nend\np","category":"page"},{"location":"abc_flow/#Library-functions","page":"ABC Flow","title":"Library functions","text":"","category":"section"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"GeometricProblems.ABCFlow","category":"page"},{"location":"abc_flow/#GeometricProblems.ABCFlow","page":"ABC Flow","title":"GeometricProblems.ABCFlow","text":"ABC Flow\n\nbeginaligned\n dotx = Asin(z) + Ccos(y) \n doty = Bsin(x) + Acos(z) \n dotz = Csin(y) + Bcos(x)\nendaligned\n\n\n\n\n\n","category":"module"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"Modules = [GeometricProblems.ABCFlow]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"E. Hairer, C. Lubich and G. Wanner. Geometric Numerical integration: structure-preserving algorithms for ordinary differential equations (Springer, Berlin, 2006).\n\n\n\n","category":"page"},{"location":"lotka_volterra_4d/#Lotka-Volterra-4d","page":"Lotka-Volterra 4d","title":"Lotka-Volterra 4d","text":"","category":"section"},{"location":"lotka_volterra_4d/","page":"Lotka-Volterra 4d","title":"Lotka-Volterra 4d","text":"Modules = [GeometricProblems.LotkaVolterra4d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"massless_charged_particle/#Massless-Charged-Particle","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"","category":"section"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"GeometricProblems.MasslessChargedParticle","category":"page"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle","text":"Massless charged particle in 2D\n\nThe Lagrangian is given by\n\nL(x dotx) = A(x) cdot dotx - phi (x) \n\nwith magnetic vector potential\n\nA(x) = fracA_02 big( 1 + x_1^2 + x_2^2 big) beginpmatrix\n- x_2 \n+ x_1 \nendpmatrix \n\nelectrostatic potential\n\nphi(x) = E_0 big( cos (x_1) + sin(x_2) big) \n\nand magnetic and electric fields\n\nbeginaligned\nB(x) = nabla times A(x) = A_0 (1 + 2 x_1^2 + 2 x_2^2) \nE(x) = - nabla phi(x) = E_0 big( sin x_1 - cos x_2 big)^T \nendaligned\n\nThe Hamiltonian form of the equations of motion reads\n\ndotx = frac1B(x) beginpmatrix\nhphantom- 0 + 1 \n- 1 hphantom+ 0 \nendpmatrix nabla phi (x) \n\n\n\n\n\n","category":"module"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"using Plots\nusing GeometricIntegrators\nusing GeometricProblems.MasslessChargedParticle\nusing GeometricProblems.MasslessChargedParticlePlots\n\node = odeproblem()\nsol = integrate(ode, Gauss(1))\n\nplot_massless_charged_particle(sol, ode)\nsavefig(\"massless_charged_particle.svg\")\n\nnothing","category":"page"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"(Image: )","category":"page"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"Modules = [GeometricProblems.MasslessChargedParticle]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.idaeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.idaeproblem","text":"Creates an implicit DAE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.idaeproblem_spark","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.idaeproblem_spark","text":"Creates an implicit DAE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.iodeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.iodeproblem","text":"Creates an implicit ODE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.odeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.odeproblem","text":"Creates an ODE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_3d/#Lotka-Volterra-3d","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"","category":"section"},{"location":"lotka_volterra_3d/","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"GeometricProblems.LotkaVolterra3d","category":"page"},{"location":"lotka_volterra_3d/#GeometricProblems.LotkaVolterra3d","page":"Lotka-Volterra 3d","title":"GeometricProblems.LotkaVolterra3d","text":"Lotka-Volterra Model in 3D\n\nThe Lotka–Volterra model in 3D is an example of a Hamiltonian system with degenerate Poisson structure.\n\nThe equations read\n\nbeginaligned\ndotq_1 = q_1 ( - a_2 q_2 + a_3 q_3 - b_2 + b_3 ) \ndotq_2 = q_2 ( hphantom- a_1 q_1 - a_3 q_3 + b_1 - b_3 ) \ndotq_3 = q_3 ( - a_1 q_1 + a_2 q_2 - b_1 + b_2 ) \nendaligned\n\nwhich can be written in Poisson-form as\n\ndotq = P(q) nabla H(q) \n\nwith Poisson matrix\n\nP(q) = beginpmatrix\n 0 - q_1 q_2 hphantom- q_1 q_3 \nhphantom- q_1 q_2 0 - q_2 q_3 \n- q_1 q_3 hphantom- q_2 q_3 0 \nendpmatrix \n\nand Hamiltonian\n\nH(q) = a_1 q_1 + a_2 q_2 + a_3 q_3 + b_1 ln q_1 + b_2 ln q_2 + b_3 ln q_3 \n\nReferences:\n\nA. M. Perelomov. Selected topics on classical integrable systems, Troisième cycle de la physique, expanded version of lectures delivered in May 1995.\nYuri B. Suris. Integrable discretizations for lattice systems: local equations of motion and their Hamiltonian properties, Rev. Math. Phys. 11, pp. 727–822, 1999.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_3d/","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"Modules = [GeometricProblems.LotkaVolterra3d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"diagnostics/#Diagnostics","page":"Diagnostics","title":"Diagnostics","text":"","category":"section"},{"location":"diagnostics/","page":"Diagnostics","title":"Diagnostics","text":"Modules = [GeometricProblems.Diagnostics]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_error_drift-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.ScalarDataSeries{T}}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.ScalarDataSeries{T}, Any}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_error_drift","text":"Computes the drift in an invariant error.\n\nArguments: (t::TimeSeries, invariant_error::DataSeries{T,1}, interval_length=100)\n\nThe time series of the solution is split into intervals of interval_length time steps. In each interval, the maximum of the absolute value of the invariant error is determined. Returns a tuple of a TimeSeries that holds the centers of all intervals and a ScalarDataSeries that holds the maxima.\n\nThis is useful to detect drifts in invariants that are not preserved exactly but whose error is oscillating such as the energy error of Hamiltonian systems with symplectic integrators.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant","text":"Compute an invariant for the solution of a partitioned ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.\n\nReturns a ScalarDataSeries holding the time series of the invariant.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant","text":"Compute an invariant for the solution of an ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.\n\nReturns a ScalarDataSeries holding the time series of the invariant.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant_error-Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries, Union{Function, Type}}","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant_error","text":"Compute the relative error of an invariant for the solution of an ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.\n\nReturns a tuple of two 1d DataSeries holding the time series of the invariant and the relativ error, respectively.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant_error-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant_error","text":"Compute the relative error of an invariant for the solution of a partitioned ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.\n\nReturns a tuple of two ScalarDataSeries holding the time series of the invariant and the relativ error, respectively.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_momentum_error-Union{Tuple{DT}, Tuple{GeometricSolutions.DataSeries{DT, AT} where AT<:Union{AbstractArray{DT}, DT}, GeometricSolutions.DataSeries{DT, AT} where AT<:Union{AbstractArray{DT}, DT}}} where DT","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_momentum_error","text":"Computes the difference of the momentum and the one-form of an implicit ODE or DAE system.\n\nArguments: (p::DataSeries{DT}, ϑ::DataSeries{DT})\n\nReturns a DataSeries similar to p holding the time series of the difference between p and ϑ.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_one_form-Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries, Union{Function, Type}}","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_one_form","text":"Compute the one-form (symplectic potential) for the solution of a Lagrangian system.\n\nArguments: (t::TimeSeries, q::DataSeries, one_form::Base.Callable)\n\nThe one_form function needs to take three arguments (t,q,k) where k is the index of the one-form component.\n\nReturns a DataSeries similar to q holding the time series of the one-form.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_relative_error-Union{Tuple{GeometricSolutions.ScalarDataSeries{T}}, Tuple{T}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_relative_error","text":"Takes a ScalarDataSeries holding an invariant and computes the relative error (inv(t)-inv(0))/inv(0).\n\nReturns a ScalarDataSeries similar to the argument holding the time series of the relativ errors.\n\n\n\n\n\n","category":"method"},{"location":"kepler_problem/#Kepler-Problem","page":"Kepler Problem","title":"Kepler Problem","text":"","category":"section"},{"location":"pendulum/#Mathematical-Pendulum","page":"Mathematical Pendulum","title":"Mathematical Pendulum","text":"","category":"section"},{"location":"pendulum/","page":"Mathematical Pendulum","title":"Mathematical Pendulum","text":"Modules = [GeometricProblems.Pendulum]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"releasenotes/#Release-Notes","page":"Release Notes","title":"Release Notes","text":"","category":"section"},{"location":"releasenotes/#0.1.1","page":"Release Notes","title":"0.1.1","text":"","category":"section"},{"location":"releasenotes/#New-Features","page":"Release Notes","title":"New Features","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Poincaré invariants for Lotka-Volterra 2d model\nMore equation types for massless charged particle","category":"page"},{"location":"releasenotes/#Fixes","page":"Release Notes","title":"Fixes","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Fixes in general plot recipes","category":"page"},{"location":"releasenotes/#0.1.0","page":"Release Notes","title":"0.1.0","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Initial release with equations for","category":"page"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Exponential Growth,\nLorenz Attractor in 3D,\nLotka-Volterra in 2D,\nLotka-Volterra in 3D,\nLotka-Volterra in 4D,\nMassless Charged Particle,\nHarmonic Oscillator,\nMathematical Pendulum,\nPlanar Point Vortices.","category":"page"},{"location":"nonlinear_oscillators/#Nonlinear-Oscillators","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"","category":"section"},{"location":"nonlinear_oscillators/#Duffing-Oscillator","page":"Nonlinear Oscillators","title":"Duffing Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.DuffingOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.DuffingOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.DuffingOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.DuffingOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Lennard-Jones-Oscillator","page":"Nonlinear Oscillators","title":"Lennard-Jones Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.LennardJonesOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.LennardJonesOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.LennardJonesOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.LennardJonesOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Mathews-Lakshmanan-Oscillator","page":"Nonlinear Oscillators","title":"Mathews-Lakshmanan Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.MathewsLakshmananOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.MathewsLakshmananOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.MathewsLakshmananOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.MathewsLakshmananOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Morse-Oscillator","page":"Nonlinear Oscillators","title":"Morse Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.MorseOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.MorseOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.MorseOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.MorseOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"henon_heiles/#Henon-Heiles-System","page":"Hénon-Heiles System","title":"Hénon-Heiles System","text":"","category":"section"},{"location":"lotka_volterra_2d/#Lotka-Volterra-2d","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Lotka–Volterra models are used in mathematical biology for modelling population dynamics of animal species, as well as many other fields where predator-prey and similar models appear. The dynamics of the growth of two interacting species can be modelled by the following noncanonical Hamiltonian system","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"dotq = beginpmatrix\nhphantom- 0 + q_1 q_2 \n- q_1 q_2 hphantom+ 0 \nendpmatrix\nnabla H (q) \nquad\nH (q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2 ","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"using Plots\nusing GeometricIntegrators\nusing GeometricProblems.LotkaVolterra2d\nusing GeometricProblems.LotkaVolterra2dPlots\n\node = odeproblem()\nsol = integrate(ode, Gauss(1))\n\nplot_lotka_volterra_2d(sol, ode)\nsavefig(\"lotka_volterra_2d.svg\")\n\nnothing","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"(Image: )","category":"page"},{"location":"lotka_volterra_2d/#Sub-models","page":"Lotka-Volterra 2d","title":"Sub-models","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"The Euler-Lagrange equations of the Lotka-Volterra model can be obtained from different Lagrangians, which are connected by gauge transformations. Although they all lead to the same equations of motion, they lead to different variational integrators. Therefore different models based on different Lagrangians are implemented.","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2d","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d","text":"Lotka-Volterra model in 2D\n\nbeginaligned\nL (q dotq) = bigg( q_2 + fraclog q_2q_1 bigg) dotq_1 + q_1 dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dSymmetric","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dSymmetric","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dSymmetric","text":"Lotka-Volterra model in 2D with symmetric Lagrangian\n\nbeginaligned\nL (q dotq) = frac12 fraclog q_2q_1 dotq_1 - frac12 fraclog q_1q_2 dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is a slight generalization of Equation (5) in José Fernández-Núñez, Lagrangian Structure of the Two-Dimensional Lotka-Volterra System, International Journal of Theoretical Physics, Vol. 37, No. 9, pp. 2457-2462, 1998.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dSingular","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dSingular","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dSingular","text":"Lotka-Volterra model in 2D with \"singular\" Lagrangian\n\nbeginaligned\nL (q dotq) = fraclog q_2q_1 dotq_1 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term - 12 d(log(q_1) log(q_2))dt. It leads to the same Euler-Lagrange equations but to a different variational integrator.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dGauge","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dGauge","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dGauge","text":"Lotka-Volterra model in 2D with symmetric Lagrangian with gauge term\n\nbeginaligned\nL (q dotq) = bigg( q_2 + frac12 fraclog q_2q_1 bigg) dotq_1 + bigg( q_1 - frac12 fraclog q_1q_2 bigg) dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term d(q_1 q_2)dt. It leads to the same Euler-Lagrange equations but to a different variational integrator.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/#User-Functions","page":"Lotka-Volterra 2d","title":"User Functions","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Modules = [GeometricProblems.LotkaVolterra2d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.daeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.daeproblem","text":"Creates a DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.hdaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.hdaeproblem","text":"Creates a Hamiltonian DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.hodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.hodeproblem","text":"Creates a Hamiltonian ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.idaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.idaeproblem","text":"Creates an implicit DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.idaeproblem_spark","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.idaeproblem_spark","text":"Creates an implicit DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.iodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.iodeproblem","text":"Creates an implicit ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.iodeproblem_dg","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.iodeproblem_dg","text":"Creates an implicit ODE object for the Lotka-Volterra 2D model for use with DG integrators.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.ldaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.ldaeproblem","text":"Creates a variational DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.ldaeproblem_slrk","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.ldaeproblem_slrk","text":"Creates a variational DAE object for the Lotka-Volterra 2D model for use with SLRK integrators.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.lodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.lodeproblem","text":"Creates a variational ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.odeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.odeproblem","text":"Creates an ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.pdaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.pdaeproblem","text":"Creates a partitioned DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.podeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.podeproblem","text":"Creates a partitioned ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#Plotting-Functions","page":"Lotka-Volterra 2d","title":"Plotting Functions","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Modules = [GeometricProblems.LotkaVolterra2dPlots]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"point_vortices/#Planar-Point-Vortices","page":"Point Vortices","title":"Planar Point Vortices","text":"","category":"section"},{"location":"point_vortices/","page":"Point Vortices","title":"Point Vortices","text":"Modules = [GeometricProblems.PointVortices]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"inner_solar_system/#Inner-Solar-System","page":"Inner Solar System","title":"Inner Solar System","text":"","category":"section"},{"location":"outer_solar_system/#Outer-Solar-System","page":"Outer Solar System","title":"Outer Solar System","text":"","category":"section"},{"location":"toda_lattice/#Toda-Lattice","page":"Toda Lattice","title":"Toda Lattice","text":"","category":"section"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"The Toda lattice is a prime example of an completely-integrable system, i.e. a Hamiltonian system evolving in mathbbR^2n that has n Poisson-commuting invariants of motion (see [2]). It is named after Morikazu Toda who used it to model a one-dimensional crystal [3].","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"The Hamiltonian of the Toda lattice takes the following form: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":" H(q p) = sum_ninmathbbZleft( fracp_n^22 + alpha e^q_n - q_n+1 right)","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"In practice we work with a finite number of particles N and impose periodic boundary conditions: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"beginaligned\n q_n+N equiv q_n \n p_n+N equiv p_n\nendaligned","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"Hence we have: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":" H(q p) = sum_n=1^N-1 left( fracp_n^22 + alpha e^q_n - q_n+1 right) + fracp_N^22 + alpha e^q_N - q_1","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"We can model the evolution of a thin pulse in this system:","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"using GeometricProblems, GeometricIntegrators, Plots # hide\n\nproblem = GeometricProblems.TodaLattice.hodeproblem() \nsol = integrate(problem, ImplicitMidpoint())\n\ntime_steps = (0, 200, 400, 600, 800, 1000, 1200)\np = plot()\nfor time_step in time_steps\n plot!(p, sol.q[time_step, :], label = \"t = $(sol.t[time_step])\")\nend\n\np","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"As we can see the thin pulse separates into two smaller pulses an they start traveling in opposite directions until they meet again at time tapprox120. ","category":"page"},{"location":"toda_lattice/#Library-functions","page":"Toda Lattice","title":"Library functions","text":"","category":"section"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"GeometricProblems.TodaLattice","category":"page"},{"location":"toda_lattice/#GeometricProblems.TodaLattice","page":"Toda Lattice","title":"GeometricProblems.TodaLattice","text":"The Toda lattice is a model for a one-dimensional crystal named after its discoverer Morikazu Toda [3].\n\nIt is a prime example of a non-trivial completely integrable system.\n\nThe only system parameters are the number of points N in the periodic lattice and \\alpha which adjusts the strength of the interactions in the lattice.\n\n\n\n\n\n","category":"module"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"V. I. Arnold. Mathematical methods of classical mechanics. Vol. 60 of Graduate Texts in Mathematics (Springer Verlag, Berlin, 1978).\n\n\n\nM. Toda. Vibration of a chain with nonlinear interaction. Journal of the Physical Society of Japan 22, 431–436 (1967).\n\n\n\n","category":"page"},{"location":"harmonic_oscillator/#Harmonic-Oscillator","page":"Harmonic Oscillator","title":"Harmonic Oscillator","text":"","category":"section"},{"location":"harmonic_oscillator/","page":"Harmonic Oscillator","title":"Harmonic Oscillator","text":"Modules = [GeometricProblems.HarmonicOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"#GeometricProblems.jl","page":"Home","title":"GeometricProblems.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeometricProblems.jl is a collection of ODEs and DAEs with interesting geometric structures together with useful diagnostics and plotting tools.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: PkgEval Status) (Image: CI) (Image: Build Status) (Image: Coverage Status) (Image: codecov) (Image: DOI)","category":"page"},{"location":"","page":"Home","title":"Home","text":"Typical structures are","category":"page"},{"location":"","page":"Home","title":"Home","text":"Variational structure, i.e., the equations can defined in terms of a Lagrangian function and be obtained from an action principle;\nHamiltonian structure, i.e., the equations can be defined in terms of a Hamiltonian function together with a symplectic or Poisson matrix;\nInvariants, i.e., the equations have symmetries and associated conservation laws;\nVolume preservation, i.e., the flow of the equations is divergence-free.","category":"page"},{"location":"#Contents","page":"Home","title":"Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n\"diagnostics.md\",\n\"abc_flow.md\",\n\"coupled_harmonic_oscillator.md\",\n\"henon_heiles.md\",\n\"kepler_problem.md\",\n\"lorenz_attractor.md\",\n\"lotka_volterra_2d.md\",\n\"lotka_volterra_3d.md\",\n\"lotka_volterra_4d.md\",\n\"massless_charged_particle.md\",\n\"harmonic_oscillator.md\",\n\"nonlinear_oscillators.md\",\n\"pendulum.md\",\n\"double_pendulum.md\",\n\"point_vortices.md\",\n\"inner_solar_system.md\",\n\"outer_solar_system.md\",\n\"toda_lattice.md\"\n]\nDepth = 1","category":"page"},{"location":"#References","page":"Home","title":"References","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use the figures or implementations provided here, please consider citing GeometricIntegrators.jl as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{Kraus:2020:GeometricIntegratorsRepo,\n title={GeometricIntegrators.jl: Geometric Numerical Integration in Julia},\n author={Kraus, Michael},\n year={2020},\n howpublished={\\url{https://github.com/JuliaGNI/GeometricIntegrators.jl}},\n doi={10.5281/zenodo.3648325}\n}","category":"page"},{"location":"","page":"Home","title":"Home","text":"as well as this repository as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{Kraus:2020:GeometricProblemsRepo,\n title={GeometricProblems.jl: Collection of Differential Equations with Geometric Structure.},\n author={Kraus, Michael},\n year={2020},\n howpublished={\\url{https://github.com/JuliaGNI/GeometricProblems.jl}},\n doi={10.5281/zenodo.4285904}\n}","category":"page"},{"location":"#Figure-License","page":"Home","title":"Figure License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Copyright (c) Michael Kraus All figures are licensed under the Creative Commons CC BY-NC-SA 4.0 License.","category":"page"},{"location":"#Software-License","page":"Home","title":"Software License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Copyright (c) Michael Kraus Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","category":"page"},{"location":"lorenz_attractor/#Lorenz-Attractor-in-3d","page":"Lorenz Attractor","title":"Lorenz Attractor in 3d","text":"","category":"section"},{"location":"lorenz_attractor/","page":"Lorenz Attractor","title":"Lorenz Attractor","text":"Modules = [GeometricProblems.LorenzAttractor]\nOrder = [:constant, :type, :macro, :function]","category":"page"}] +[{"location":"double_pendulum/#Double-Pendulum","page":"Double Pendulum","title":"Double Pendulum","text":"","category":"section"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The double pendulum consists of two pendula, one attached to the origin at (xy) = (00), and the second attached to the first. Each pendulum consists of a point mass m_i attached to a massless rod of length l_i with i in (12). All motion is assumed to be frictionless.","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The dynamics of the system is most naturally described in terms of the angles theta_i between the rods l_i and the vertical axis y. In terms of these angles, the cartesian coordinates are given by","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nx_1 = l_1 sintheta_1 \nx_2 = l_1 sintheta_1 + l_2 sintheta_2 \ny_1 = - l_1 costheta_1 \ny_2 = -l_1 costheta_1 - l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"In terms of the generalized coordinates theta_i, the Lagrangian reads","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nL (theta_1 theta_2 dottheta_1 dottheta_2)\n = frac12 (m_1 + m_2) l_1^2 dottheta_1^2 \n + frac12 m_2 l_2^2 dottheta_2^2\n + m_2 l_1 l_2 dottheta_1 dottheta_2 cos(theta_1 - theta_2) \n + g (m_1 + m_2) l_1 costheta_1\n + g m_2 l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"The canonical conjugate momenta p_i are obtained from the Lagrangian as","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\np_1 = fracpartial Lpartial dottheta_1 = (m_1 + m_2) l_1^2 dottheta_1 + m_2 l_1 l_2 dottheta_2 cos(theta_1 - theta_2) \np_2 = fracpartial Lpartial dottheta_2 = m_2 l_2^2 dottheta_2 + m_2 l_1 l_2 dottheta_1 cos(theta_1 - theta_2) \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"After solving these relations for the generalized velocities dottheta_i,","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\ndottheta_1 = fracl_2 p_theta_1 - l_1 p_theta_2 cos(theta_1 - theta_2)l_1^2 l_2 left m_1 + m_2 sin^2(theta_1 - theta_2) right \ndottheta_2 = frac(m_1 + m_2) l_1 p_theta_2 - m_2 l_2 p_theta_1 cos(theta_1 - theta_2)m_2 l_1 l_2^2 left m_1 + m_2 sin^2 (theta_1 - theta_2) right \nendalign*","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"the Hamiltonian can be obtained via the Legendre transform,","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"H = sum_i=1^2 dottheta_i p_i - L ","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"as","category":"page"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"beginalign*\nH = fracm_2 l_2^2 p^2_theta_1 + (m_1 + m_2) l_1^2 p^2_theta_2 - 2 m_2 l_1 l_2 p_theta_1 p_theta_2 cos(theta_1 - theta_2)2 m_2 l_1^2 l_2^2 left m_1 + m_2 sin^2(theta_1 - theta_2) right \n qquadqquad vphantomfracll - g (m_1 + m_2) l_1 costheta_1 - g m_2 l_2 costheta_2 \nendalign*","category":"page"},{"location":"double_pendulum/#Library-functions","page":"Double Pendulum","title":"Library functions","text":"","category":"section"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"GeometricProblems.DoublePendulum","category":"page"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum","text":"DoublePendulum\n\nThe DoublePendulum module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.\n\nThe double pendulum consists of two pendula, one attached to the origin at (xy) = (00), and the second attached to the first. Each pendulum consists of a point mass m_i attached to a massless rod of length l_i with i in (12). The dynamics of the system is described in terms of the angles theta_i between the rods l_i and the vertical axis y. All motion is assumed to be frictionless.\n\nSystem parameters:\n\nl₁: length of rod 1\nl₂: length of rod 2\nm₁: mass of pendulum 1\nm₂: mass of pendulum 2\ng: gravitational constant\n\n\n\n\n\n","category":"module"},{"location":"double_pendulum/","page":"Double Pendulum","title":"Double Pendulum","text":"Modules = [GeometricProblems.DoublePendulum]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum.hodeproblem","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum.hodeproblem","text":"Hamiltonian problem for the double pendulum\n\nConstructor with default arguments:\n\nhodeproblem(\n q₀ = [π/4, π/2],\n p₀ = [3.3321622036187746, 7.0685834705770345];\n tspan = (0.0, 10.0),\n tstep = 0.01,\n params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)\n)\n\n\n\n\n\n","category":"function"},{"location":"double_pendulum/#GeometricProblems.DoublePendulum.lodeproblem","page":"Double Pendulum","title":"GeometricProblems.DoublePendulum.lodeproblem","text":"Lagrangian problem for the double pendulum\n\nConstructor with default arguments:\n\nlodeproblem(\n q₀ = [π/4, π/2],\n p₀ = [3.3321622036187746, 7.0685834705770345];\n tspan = (0.0, 10.0),\n tstep = 0.01,\n params = (l₁ = 2.0, l₂ = 3.0, m₁ = 1.0, m₂ = 2.0, g = 9.80665)\n)\n\n\n\n\n\n","category":"function"},{"location":"coupled_harmonic_oscillator/#Coupled-Harmonic-Oscillator","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"","category":"section"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"This system describes two harmonic oscillators that are coupled nonlinearly. ","category":"page"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"HTML(\"\"\"\"\"\") # hide","category":"page"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"The following shows the q_1 component of the system for different values of k: ","category":"page"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"using GeometricIntegrators: integrate, ImplicitMidpoint \nusing GeometricProblems.CoupledHarmonicOscillator: hodeproblem, default_parameters\nusing Plots \n \nconst m₁ = default_parameters.m₁ \nconst m₂ = default_parameters.m₂ \nconst k₁ = default_parameters.k₁ \nconst k₂ = default_parameters.k₂ \nconst k = [0.0, 0.5, 0.75, 1.0, 2.0, 3.0, 4.0] \n \nparams_collection = [(m₁ = m₁, m₂ = m₂, k₁ = k₁, k₂ = k₂, k = k_val) for k_val in k] \nproblems = [hodeproblem(; params = params_collection[i]) for i in axes(k, 1)] \nensemble_solution = [integrate(problem, ImplicitMidpoint()) for problem in problems]\n \nt = ensemble_solution[1].t\n\nq₁ = zeros(1, length(t), length(k))\n\nfor index in axes(k, 1)\n q₁[1, :, index] = ensemble_solution[index].q[:, 1]\nend\n\nn_param_sets = length(params_collection) #hide \nlabels = reshape([\"k = \"*string(params.k) for params in params_collection], 1, n_param_sets) \n \nq₁ = q₁[1, :, :]\nconst one_plot = false \nconst psize = (900, 600) \nplot_q₁ = one_plot ? plot(0.0:0.4:100.0, q₁, size=psize) : plot(0.0:0.4:100.0, q₁, layout=(n_param_sets, 1), size=psize, label=labels, legend=:topright)\n\npng(plot_q₁, \"q_component\")\n\nnothing","category":"page"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"(Image: )","category":"page"},{"location":"coupled_harmonic_oscillator/#Library-functions","page":"Coupled Harmonic Oscillator","title":"Library functions","text":"","category":"section"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"GeometricProblems.CoupledHarmonicOscillator","category":"page"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator","text":"CoupledHarmonicOscillator\n\nThe CoupledHarmonicOscillator module provides functions hodeproblem and lodeproblem each returning a Hamiltonian or Lagrangian problem, respectively, to be solved in the GeometricIntegrators.jl ecosystem. The actual code is generated with EulerLagrange.jl.\n\nThe coupled harmonic oscillator is a collection of two point masses that are connected to a fixed wall with spring constants k_1 and k_2 and are furthermore coupled nonlinearly resulting in the Hamiltonian: \n\nH(q_1 q_2 p_1 p_2) = fracq_1^22m_1 + fracq_2^22m_2 + k_1fracq_1^22 + k_2fracq_2^22 + ksigma(q_1)frac(q_2 - q_1)^22\n\nwhere sigma(x) = 1 (1 + e^-x) is the sigmoid activation function. \n\nSystem parameters:\n\nk₁: spring constant of mass 1\nk₂: spring constant of mass 2\nm₁: mass 1\nm₂: mass 2\nk: coupling strength between the two masses. \n\n\n\n\n\n","category":"module"},{"location":"coupled_harmonic_oscillator/","page":"Coupled Harmonic Oscillator","title":"Coupled Harmonic Oscillator","text":"Modules = [GeometricProblems.CoupledHarmonicOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator.hodeproblem","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator.hodeproblem","text":"Hamiltonian problem for coupled oscillator\n\nConstructor with default arguments:\n\nhodeproblem(\n q₀ = [1.0, 0.0],\n p₀ = [2.0, 0.0];\n tspan = (0.0, 100.0),\n tstep = 0.4,\n params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)\n)\n\n\n\n\n\n","category":"function"},{"location":"coupled_harmonic_oscillator/#GeometricProblems.CoupledHarmonicOscillator.lodeproblem","page":"Coupled Harmonic Oscillator","title":"GeometricProblems.CoupledHarmonicOscillator.lodeproblem","text":"Lagrangian problem for the coupled oscillator\n\nConstructor with default arguments:\n\nlodeproblem(\n q₀ = [1.0, 0.0],\n p₀ = [2.0, 0.0];\n tspan = (0.0, 100.0),\n tstep = 0.4,\n params = (m₁ = 2.0, m₂ = 1.0, k₁ = 1.5, k₂ = 0.3, k = 1.0)\n)\n\n\n\n\n\n","category":"function"},{"location":"abc_flow/#ABC-Flow","page":"ABC Flow","title":"ABC Flow","text":"","category":"section"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"The ABC flow (see [1]) is described by a divergence-free differential equation whose flow strongly depends on the initial condition. ","category":"page"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"using GeometricIntegrators: integrate, ImplicitMidpoint\nusing GeometricProblems.ABCFlow\nusing Plots\n\nensemble_solution = integrate(odeensemble(), ImplicitMidpoint())\n\np = plot()\nfor solution in ensemble_solution\n plot!(p, solution.q[:, 1], solution.q[:, 2], solution.q[:, 3])\nend\np","category":"page"},{"location":"abc_flow/#Library-functions","page":"ABC Flow","title":"Library functions","text":"","category":"section"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"GeometricProblems.ABCFlow","category":"page"},{"location":"abc_flow/#GeometricProblems.ABCFlow","page":"ABC Flow","title":"GeometricProblems.ABCFlow","text":"ABC Flow\n\nbeginaligned\n dotx = Asin(z) + Ccos(y) \n doty = Bsin(x) + Acos(z) \n dotz = Csin(y) + Bcos(x)\nendaligned\n\n\n\n\n\n","category":"module"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"Modules = [GeometricProblems.ABCFlow]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"abc_flow/","page":"ABC Flow","title":"ABC Flow","text":"E. Hairer, C. Lubich and G. Wanner. Geometric Numerical integration: structure-preserving algorithms for ordinary differential equations (Springer, Berlin, 2006).\n\n\n\n","category":"page"},{"location":"lotka_volterra_4d/#Lotka-Volterra-4d","page":"Lotka-Volterra 4d","title":"Lotka-Volterra 4d","text":"","category":"section"},{"location":"lotka_volterra_4d/","page":"Lotka-Volterra 4d","title":"Lotka-Volterra 4d","text":"Modules = [GeometricProblems.LotkaVolterra4d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"massless_charged_particle/#Massless-Charged-Particle","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"","category":"section"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"GeometricProblems.MasslessChargedParticle","category":"page"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle","text":"Massless charged particle in 2D\n\nThe Lagrangian is given by\n\nL(x dotx) = A(x) cdot dotx - phi (x) \n\nwith magnetic vector potential\n\nA(x) = fracA_02 big( 1 + x_1^2 + x_2^2 big) beginpmatrix\n- x_2 \n+ x_1 \nendpmatrix \n\nelectrostatic potential\n\nphi(x) = E_0 big( cos (x_1) + sin(x_2) big) \n\nand magnetic and electric fields\n\nbeginaligned\nB(x) = nabla times A(x) = A_0 (1 + 2 x_1^2 + 2 x_2^2) \nE(x) = - nabla phi(x) = E_0 big( sin x_1 - cos x_2 big)^T \nendaligned\n\nThe Hamiltonian form of the equations of motion reads\n\ndotx = frac1B(x) beginpmatrix\nhphantom- 0 + 1 \n- 1 hphantom+ 0 \nendpmatrix nabla phi (x) \n\n\n\n\n\n","category":"module"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"using Plots\nusing GeometricIntegrators\nusing GeometricProblems.MasslessChargedParticle\nusing GeometricProblems.MasslessChargedParticlePlots\n\node = odeproblem()\nsol = integrate(ode, Gauss(1))\n\nplot_massless_charged_particle(sol, ode)\nsavefig(\"massless_charged_particle.svg\")\n\nnothing","category":"page"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"(Image: )","category":"page"},{"location":"massless_charged_particle/","page":"Massless Charged Particle","title":"Massless Charged Particle","text":"Modules = [GeometricProblems.MasslessChargedParticle]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.idaeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.idaeproblem","text":"Creates an implicit DAE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.idaeproblem_spark","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.idaeproblem_spark","text":"Creates an implicit DAE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.iodeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.iodeproblem","text":"Creates an implicit ODE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"massless_charged_particle/#GeometricProblems.MasslessChargedParticle.odeproblem","page":"Massless Charged Particle","title":"GeometricProblems.MasslessChargedParticle.odeproblem","text":"Creates an ODE object for the massless charged particle in 2D.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_3d/#Lotka-Volterra-3d","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"","category":"section"},{"location":"lotka_volterra_3d/","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"GeometricProblems.LotkaVolterra3d","category":"page"},{"location":"lotka_volterra_3d/#GeometricProblems.LotkaVolterra3d","page":"Lotka-Volterra 3d","title":"GeometricProblems.LotkaVolterra3d","text":"Lotka-Volterra Model in 3D\n\nThe Lotka–Volterra model in 3D is an example of a Hamiltonian system with degenerate Poisson structure.\n\nThe equations read\n\nbeginaligned\ndotq_1 = q_1 ( - a_2 q_2 + a_3 q_3 - b_2 + b_3 ) \ndotq_2 = q_2 ( hphantom- a_1 q_1 - a_3 q_3 + b_1 - b_3 ) \ndotq_3 = q_3 ( - a_1 q_1 + a_2 q_2 - b_1 + b_2 ) \nendaligned\n\nwhich can be written in Poisson-form as\n\ndotq = P(q) nabla H(q) \n\nwith Poisson matrix\n\nP(q) = beginpmatrix\n 0 - q_1 q_2 hphantom- q_1 q_3 \nhphantom- q_1 q_2 0 - q_2 q_3 \n- q_1 q_3 hphantom- q_2 q_3 0 \nendpmatrix \n\nand Hamiltonian\n\nH(q) = a_1 q_1 + a_2 q_2 + a_3 q_3 + b_1 ln q_1 + b_2 ln q_2 + b_3 ln q_3 \n\nReferences:\n\nA. M. Perelomov. Selected topics on classical integrable systems, Troisième cycle de la physique, expanded version of lectures delivered in May 1995.\nYuri B. Suris. Integrable discretizations for lattice systems: local equations of motion and their Hamiltonian properties, Rev. Math. Phys. 11, pp. 727–822, 1999.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_3d/","page":"Lotka-Volterra 3d","title":"Lotka-Volterra 3d","text":"Modules = [GeometricProblems.LotkaVolterra3d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"diagnostics/#Diagnostics","page":"Diagnostics","title":"Diagnostics","text":"","category":"section"},{"location":"diagnostics/","page":"Diagnostics","title":"Diagnostics","text":"Modules = [GeometricProblems.Diagnostics]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_error_drift-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.ScalarDataSeries{T}}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.ScalarDataSeries{T}, Any}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_error_drift","text":"Computes the drift in an invariant error.\n\nArguments: (t::TimeSeries, invariant_error::DataSeries{T,1}, interval_length=100)\n\nThe time series of the solution is split into intervals of interval_length time steps. In each interval, the maximum of the absolute value of the invariant error is determined. Returns a tuple of a TimeSeries that holds the centers of all intervals and a ScalarDataSeries that holds the maxima.\n\nThis is useful to detect drifts in invariants that are not preserved exactly but whose error is oscillating such as the energy error of Hamiltonian systems with symplectic integrators.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant","text":"Compute an invariant for the solution of a partitioned ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.\n\nReturns a ScalarDataSeries holding the time series of the invariant.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant","text":"Compute an invariant for the solution of an ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.\n\nReturns a ScalarDataSeries holding the time series of the invariant.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant_error-Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries, Union{Function, Type}}","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant_error","text":"Compute the relative error of an invariant for the solution of an ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take two arguments (t,q) and return the corresponding value of the invariant.\n\nReturns a tuple of two 1d DataSeries holding the time series of the invariant and the relativ error, respectively.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_invariant_error-Union{Tuple{T}, Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, GeometricSolutions.DataSeries{T, AT} where AT<:Union{AbstractArray{T}, T}, Union{Function, Type}}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_invariant_error","text":"Compute the relative error of an invariant for the solution of a partitioned ODE or DAE system.\n\nArguments: (t::TimeSeries, q::DataSeries{T}, p::DataSeries{T}, invariant::Base.Callable)\n\nThe invariant functions needs to take three arguments (t,q,p) and return the corresponding value of the invariant.\n\nReturns a tuple of two ScalarDataSeries holding the time series of the invariant and the relativ error, respectively.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_momentum_error-Union{Tuple{DT}, Tuple{GeometricSolutions.DataSeries{DT, AT} where AT<:Union{AbstractArray{DT}, DT}, GeometricSolutions.DataSeries{DT, AT} where AT<:Union{AbstractArray{DT}, DT}}} where DT","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_momentum_error","text":"Computes the difference of the momentum and the one-form of an implicit ODE or DAE system.\n\nArguments: (p::DataSeries{DT}, ϑ::DataSeries{DT})\n\nReturns a DataSeries similar to p holding the time series of the difference between p and ϑ.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_one_form-Tuple{GeometricSolutions.TimeSeries, GeometricSolutions.DataSeries, Union{Function, Type}}","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_one_form","text":"Compute the one-form (symplectic potential) for the solution of a Lagrangian system.\n\nArguments: (t::TimeSeries, q::DataSeries, one_form::Base.Callable)\n\nThe one_form function needs to take three arguments (t,q,k) where k is the index of the one-form component.\n\nReturns a DataSeries similar to q holding the time series of the one-form.\n\n\n\n\n\n","category":"method"},{"location":"diagnostics/#GeometricProblems.Diagnostics.compute_relative_error-Union{Tuple{GeometricSolutions.ScalarDataSeries{T}}, Tuple{T}} where T","page":"Diagnostics","title":"GeometricProblems.Diagnostics.compute_relative_error","text":"Takes a ScalarDataSeries holding an invariant and computes the relative error (inv(t)-inv(0))/inv(0).\n\nReturns a ScalarDataSeries similar to the argument holding the time series of the relativ errors.\n\n\n\n\n\n","category":"method"},{"location":"kepler_problem/#Kepler-Problem","page":"Kepler Problem","title":"Kepler Problem","text":"","category":"section"},{"location":"pendulum/#Mathematical-Pendulum","page":"Mathematical Pendulum","title":"Mathematical Pendulum","text":"","category":"section"},{"location":"pendulum/","page":"Mathematical Pendulum","title":"Mathematical Pendulum","text":"Modules = [GeometricProblems.Pendulum]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"releasenotes/#Release-Notes","page":"Release Notes","title":"Release Notes","text":"","category":"section"},{"location":"releasenotes/#0.1.1","page":"Release Notes","title":"0.1.1","text":"","category":"section"},{"location":"releasenotes/#New-Features","page":"Release Notes","title":"New Features","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Poincaré invariants for Lotka-Volterra 2d model\nMore equation types for massless charged particle","category":"page"},{"location":"releasenotes/#Fixes","page":"Release Notes","title":"Fixes","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Fixes in general plot recipes","category":"page"},{"location":"releasenotes/#0.1.0","page":"Release Notes","title":"0.1.0","text":"","category":"section"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Initial release with equations for","category":"page"},{"location":"releasenotes/","page":"Release Notes","title":"Release Notes","text":"Exponential Growth,\nLorenz Attractor in 3D,\nLotka-Volterra in 2D,\nLotka-Volterra in 3D,\nLotka-Volterra in 4D,\nMassless Charged Particle,\nHarmonic Oscillator,\nMathematical Pendulum,\nPlanar Point Vortices.","category":"page"},{"location":"nonlinear_oscillators/#Nonlinear-Oscillators","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"","category":"section"},{"location":"nonlinear_oscillators/#Duffing-Oscillator","page":"Nonlinear Oscillators","title":"Duffing Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.DuffingOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.DuffingOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.DuffingOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.DuffingOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Lennard-Jones-Oscillator","page":"Nonlinear Oscillators","title":"Lennard-Jones Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.LennardJonesOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.LennardJonesOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.LennardJonesOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.LennardJonesOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Mathews-Lakshmanan-Oscillator","page":"Nonlinear Oscillators","title":"Mathews-Lakshmanan Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.MathewsLakshmananOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.MathewsLakshmananOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.MathewsLakshmananOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.MathewsLakshmananOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"nonlinear_oscillators/#Morse-Oscillator","page":"Nonlinear Oscillators","title":"Morse Oscillator","text":"","category":"section"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"GeometricProblems.MorseOscillator","category":"page"},{"location":"nonlinear_oscillators/#GeometricProblems.MorseOscillator","page":"Nonlinear Oscillators","title":"GeometricProblems.MorseOscillator","text":"\n\n\n\n","category":"module"},{"location":"nonlinear_oscillators/","page":"Nonlinear Oscillators","title":"Nonlinear Oscillators","text":"Modules = [GeometricProblems.MorseOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"henon_heiles/#Henon-Heiles-System","page":"Hénon-Heiles System","title":"Hénon-Heiles System","text":"","category":"section"},{"location":"lotka_volterra_2d/#Lotka-Volterra-2d","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Lotka–Volterra models are used in mathematical biology for modelling population dynamics of animal species, as well as many other fields where predator-prey and similar models appear. The dynamics of the growth of two interacting species can be modelled by the following noncanonical Hamiltonian system","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"dotq = beginpmatrix\nhphantom- 0 + q_1 q_2 \n- q_1 q_2 hphantom+ 0 \nendpmatrix\nnabla H (q) \nquad\nH (q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2 ","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"using Plots\nusing GeometricIntegrators\nusing GeometricProblems.LotkaVolterra2d\nusing GeometricProblems.LotkaVolterra2dPlots\n\node = odeproblem()\nsol = integrate(ode, Gauss(1))\n\nplot_lotka_volterra_2d(sol, ode)\nsavefig(\"lotka_volterra_2d.svg\")\n\nnothing","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"(Image: )","category":"page"},{"location":"lotka_volterra_2d/#Sub-models","page":"Lotka-Volterra 2d","title":"Sub-models","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"The Euler-Lagrange equations of the Lotka-Volterra model can be obtained from different Lagrangians, which are connected by gauge transformations. Although they all lead to the same equations of motion, they lead to different variational integrators. Therefore different models based on different Lagrangians are implemented.","category":"page"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2d","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d","text":"Lotka-Volterra model in 2D\n\nbeginaligned\nL (q dotq) = bigg( q_2 + fraclog q_2q_1 bigg) dotq_1 + q_1 dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dSymmetric","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dSymmetric","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dSymmetric","text":"Lotka-Volterra model in 2D with symmetric Lagrangian\n\nbeginaligned\nL (q dotq) = frac12 fraclog q_2q_1 dotq_1 - frac12 fraclog q_1q_2 dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is a slight generalization of Equation (5) in José Fernández-Núñez, Lagrangian Structure of the Two-Dimensional Lotka-Volterra System, International Journal of Theoretical Physics, Vol. 37, No. 9, pp. 2457-2462, 1998.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dSingular","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dSingular","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dSingular","text":"Lotka-Volterra model in 2D with \"singular\" Lagrangian\n\nbeginaligned\nL (q dotq) = fraclog q_2q_1 dotq_1 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term - 12 d(log(q_1) log(q_2))dt. It leads to the same Euler-Lagrange equations but to a different variational integrator.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"GeometricProblems.LotkaVolterra2dGauge","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dGauge","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dGauge","text":"Lotka-Volterra model in 2D with symmetric Lagrangian with gauge term\n\nbeginaligned\nL (q dotq) = bigg( q_2 + frac12 fraclog q_2q_1 bigg) dotq_1 + bigg( q_1 - frac12 fraclog q_1q_2 bigg) dotq_2 - H(q) \nH(q) = a_1 q_1 + a_2 q_2 + b_1 log q_1 + b_2 log q_2\nendaligned\n\nThis Lagrangian is equivalent to the Lagrangian of the symmetric Lotka-Volterra model. It differs only by a gauge transformation with the term d(q_1 q_2)dt. It leads to the same Euler-Lagrange equations but to a different variational integrator.\n\n\n\n\n\n","category":"module"},{"location":"lotka_volterra_2d/#User-Functions","page":"Lotka-Volterra 2d","title":"User Functions","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Modules = [GeometricProblems.LotkaVolterra2d]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.daeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.daeproblem","text":"Creates a DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.hdaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.hdaeproblem","text":"Creates a Hamiltonian DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.hodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.hodeproblem","text":"Creates a Hamiltonian ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.idaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.idaeproblem","text":"Creates an implicit DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.idaeproblem_spark","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.idaeproblem_spark","text":"Creates an implicit DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.iodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.iodeproblem","text":"Creates an implicit ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.iodeproblem_dg","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.iodeproblem_dg","text":"Creates an implicit ODE object for the Lotka-Volterra 2D model for use with DG integrators.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.ldaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.ldaeproblem","text":"Creates a variational DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.ldaeproblem_slrk","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.ldaeproblem_slrk","text":"Creates a variational DAE object for the Lotka-Volterra 2D model for use with SLRK integrators.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.lodeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.lodeproblem","text":"Creates a variational ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.odeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.odeproblem","text":"Creates an ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.pdaeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.pdaeproblem","text":"Creates a partitioned DAE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2d.podeproblem","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2d.podeproblem","text":"Creates a partitioned ODE object for the Lotka-Volterra 2D model.\n\n\n\n\n\n","category":"function"},{"location":"lotka_volterra_2d/#Plotting-Functions","page":"Lotka-Volterra 2d","title":"Plotting Functions","text":"","category":"section"},{"location":"lotka_volterra_2d/","page":"Lotka-Volterra 2d","title":"Lotka-Volterra 2d","text":"Modules = [GeometricProblems.LotkaVolterra2dPlots]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d!","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d","text":"Plots the solution of a 2D Lotka-Volterra model together with the energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution!","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_solution","text":"Plots the solution of a 2D Lotka-Volterra model.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nxlims=:auto: xlims for solution plot\nylims=:auto: ylims for solution plot\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!-Tuple{RecipesBase.AbstractPlot, Vararg{Any}}","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces!","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"lotka_volterra_2d/#GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces-Tuple","page":"Lotka-Volterra 2d","title":"GeometricProblems.LotkaVolterra2dPlots.plot_lotka_volterra_2d_traces","text":"Plots time traces of the solution of a 2D Lotka-Volterra model and its energy error.\n\nArguments:\n\nsol <: GeometricSolution\nequ <: GeometricProblem\n\nKeyword aguments:\n\nnplot=1: plot every nplotth time step\nlatex=true: use LaTeX guides\n\n\n\n\n\n","category":"method"},{"location":"point_vortices/#Planar-Point-Vortices","page":"Point Vortices","title":"Planar Point Vortices","text":"","category":"section"},{"location":"point_vortices/","page":"Point Vortices","title":"Point Vortices","text":"Modules = [GeometricProblems.PointVortices]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"inner_solar_system/#Inner-Solar-System","page":"Inner Solar System","title":"Inner Solar System","text":"","category":"section"},{"location":"outer_solar_system/#Outer-Solar-System","page":"Outer Solar System","title":"Outer Solar System","text":"","category":"section"},{"location":"toda_lattice/#Toda-Lattice","page":"Toda Lattice","title":"Toda Lattice","text":"","category":"section"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"The Toda lattice is a prime example of an completely-integrable system, i.e. a Hamiltonian system evolving in mathbbR^2n that has n Poisson-commuting invariants of motion (see [2]). It is named after Morikazu Toda who used it to model a one-dimensional crystal [3].","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"The Hamiltonian of the Toda lattice takes the following form: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":" H(q p) = sum_ninmathbbZleft( fracp_n^22 + alpha e^q_n - q_n+1 right)","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"In practice we work with a finite number of particles N and impose periodic boundary conditions: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"beginaligned\n q_n+N equiv q_n \n p_n+N equiv p_n\nendaligned","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"Hence we have: ","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":" H(q p) = sum_n=1^N-1 left( fracp_n^22 + alpha e^q_n - q_n+1 right) + fracp_N^22 + alpha e^q_N - q_1","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"We can model the evolution of a thin pulse in this system:","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"using GeometricProblems, GeometricIntegrators, Plots # hide\n\nproblem = GeometricProblems.TodaLattice.hodeproblem() \nsol = integrate(problem, ImplicitMidpoint())\n\ntime_steps = (0, 200, 400, 600, 800, 1000, 1200)\np = plot()\nfor time_step in time_steps\n plot!(p, sol.q[time_step, :], label = \"t = $(sol.t[time_step])\")\nend\n\np","category":"page"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"As we can see the thin pulse separates into two smaller pulses an they start traveling in opposite directions until they meet again at time tapprox120. ","category":"page"},{"location":"toda_lattice/#Library-functions","page":"Toda Lattice","title":"Library functions","text":"","category":"section"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"GeometricProblems.TodaLattice","category":"page"},{"location":"toda_lattice/#GeometricProblems.TodaLattice","page":"Toda Lattice","title":"GeometricProblems.TodaLattice","text":"The Toda lattice is a model for a one-dimensional crystal named after its discoverer Morikazu Toda [3].\n\nIt is a prime example of a non-trivial completely integrable system.\n\nThe only system parameters are the number of points N in the periodic lattice and \\alpha which adjusts the strength of the interactions in the lattice.\n\n\n\n\n\n","category":"module"},{"location":"toda_lattice/","page":"Toda Lattice","title":"Toda Lattice","text":"V. I. Arnold. Mathematical methods of classical mechanics. Vol. 60 of Graduate Texts in Mathematics (Springer Verlag, Berlin, 1978).\n\n\n\nM. Toda. Vibration of a chain with nonlinear interaction. Journal of the Physical Society of Japan 22, 431–436 (1967).\n\n\n\n","category":"page"},{"location":"harmonic_oscillator/#Harmonic-Oscillator","page":"Harmonic Oscillator","title":"Harmonic Oscillator","text":"","category":"section"},{"location":"harmonic_oscillator/","page":"Harmonic Oscillator","title":"Harmonic Oscillator","text":"Modules = [GeometricProblems.HarmonicOscillator]\nOrder = [:constant, :type, :macro, :function]","category":"page"},{"location":"#GeometricProblems.jl","page":"Home","title":"GeometricProblems.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"GeometricProblems.jl is a collection of ODEs and DAEs with interesting geometric structures together with useful diagnostics and plotting tools.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: PkgEval Status) (Image: CI) (Image: Build Status) (Image: Coverage Status) (Image: codecov) (Image: DOI)","category":"page"},{"location":"","page":"Home","title":"Home","text":"Typical structures are","category":"page"},{"location":"","page":"Home","title":"Home","text":"Variational structure, i.e., the equations can defined in terms of a Lagrangian function and be obtained from an action principle;\nHamiltonian structure, i.e., the equations can be defined in terms of a Hamiltonian function together with a symplectic or Poisson matrix;\nInvariants, i.e., the equations have symmetries and associated conservation laws;\nVolume preservation, i.e., the flow of the equations is divergence-free.","category":"page"},{"location":"#Contents","page":"Home","title":"Contents","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Pages = [\n\"diagnostics.md\",\n\"abc_flow.md\",\n\"coupled_harmonic_oscillator.md\",\n\"henon_heiles.md\",\n\"kepler_problem.md\",\n\"lorenz_attractor.md\",\n\"lotka_volterra_2d.md\",\n\"lotka_volterra_3d.md\",\n\"lotka_volterra_4d.md\",\n\"massless_charged_particle.md\",\n\"harmonic_oscillator.md\",\n\"nonlinear_oscillators.md\",\n\"pendulum.md\",\n\"double_pendulum.md\",\n\"point_vortices.md\",\n\"inner_solar_system.md\",\n\"outer_solar_system.md\",\n\"toda_lattice.md\"\n]\nDepth = 1","category":"page"},{"location":"#References","page":"Home","title":"References","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use the figures or implementations provided here, please consider citing GeometricIntegrators.jl as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{Kraus:2020:GeometricIntegratorsRepo,\n title={GeometricIntegrators.jl: Geometric Numerical Integration in Julia},\n author={Kraus, Michael},\n year={2020},\n howpublished={\\url{https://github.com/JuliaGNI/GeometricIntegrators.jl}},\n doi={10.5281/zenodo.3648325}\n}","category":"page"},{"location":"","page":"Home","title":"Home","text":"as well as this repository as","category":"page"},{"location":"","page":"Home","title":"Home","text":"@misc{Kraus:2020:GeometricProblemsRepo,\n title={GeometricProblems.jl: Collection of Differential Equations with Geometric Structure.},\n author={Kraus, Michael},\n year={2020},\n howpublished={\\url{https://github.com/JuliaGNI/GeometricProblems.jl}},\n doi={10.5281/zenodo.4285904}\n}","category":"page"},{"location":"#Figure-License","page":"Home","title":"Figure License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Copyright (c) Michael Kraus All figures are licensed under the Creative Commons CC BY-NC-SA 4.0 License.","category":"page"},{"location":"#Software-License","page":"Home","title":"Software License","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Copyright (c) Michael Kraus Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","category":"page"},{"location":"lorenz_attractor/#Lorenz-Attractor-in-3d","page":"Lorenz Attractor","title":"Lorenz Attractor in 3d","text":"","category":"section"},{"location":"lorenz_attractor/","page":"Lorenz Attractor","title":"Lorenz Attractor","text":"Modules = [GeometricProblems.LorenzAttractor]\nOrder = [:constant, :type, :macro, :function]","category":"page"}] } diff --git a/latest/toda_lattice/81cb3e78.svg b/latest/toda_lattice/b0252da6.svg similarity index 89% rename from latest/toda_lattice/81cb3e78.svg rename to latest/toda_lattice/b0252da6.svg index 55c4f40..43e08cd 100644 --- a/latest/toda_lattice/81cb3e78.svg +++ b/latest/toda_lattice/b0252da6.svg @@ -1,58 +1,58 @@ - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/toda_lattice/index.html b/latest/toda_lattice/index.html index 0ed3d6e..cc09827 100644 --- a/latest/toda_lattice/index.html +++ b/latest/toda_lattice/index.html @@ -11,4 +11,4 @@ plot!(p, sol.q[time_step, :], label = "t = $(sol.t[time_step])") end -pExample block output

As we can see the thin pulse separates into two smaller pulses an they start traveling in opposite directions until they meet again at time $t\approx120$.

Library functions

GeometricProblems.TodaLatticeModule

The Toda lattice is a model for a one-dimensional crystal named after its discoverer Morikazu Toda [3].

It is a prime example of a non-trivial completely integrable system.

The only system parameters are the number of points $N$ in the periodic lattice and \alpha which adjusts the strength of the interactions in the lattice.

source
[2]
V. I. Arnold. Mathematical methods of classical mechanics. Vol. 60 of Graduate Texts in Mathematics (Springer Verlag, Berlin, 1978).
[3]
M. Toda. Vibration of a chain with nonlinear interaction. Journal of the Physical Society of Japan 22, 431–436 (1967).
+pExample block output

As we can see the thin pulse separates into two smaller pulses an they start traveling in opposite directions until they meet again at time $t\approx120$.

Library functions

GeometricProblems.TodaLatticeModule

The Toda lattice is a model for a one-dimensional crystal named after its discoverer Morikazu Toda [3].

It is a prime example of a non-trivial completely integrable system.

The only system parameters are the number of points $N$ in the periodic lattice and \alpha which adjusts the strength of the interactions in the lattice.

source
[2]
V. I. Arnold. Mathematical methods of classical mechanics. Vol. 60 of Graduate Texts in Mathematics (Springer Verlag, Berlin, 1978).
[3]
M. Toda. Vibration of a chain with nonlinear interaction. Journal of the Physical Society of Japan 22, 431–436 (1967).

Release Notes

0.1.1

New Features

  • Poincaré invariants for Lotka-Volterra 2d model
  • More equation types for massless charged particle

Fixes

  • Fixes in general plot recipes

0.1.0

Initial release with equations for

  • Exponential Growth,
  • Lorenz Attractor in 3D,
  • Lotka-Volterra in 2D,
  • Lotka-Volterra in 3D,
  • Lotka-Volterra in 4D,
  • Massless Charged Particle,
  • Harmonic Oscillator,
  • Mathematical Pendulum,
  • Planar Point Vortices.