Degenerate Lagrangian Systems
A Lagrangian $L(x,v)$ is said to be degenerate if the determinant of the Hessian with respect to the velocities vanishes, i.e.,
\[\left\vert \frac{\partial^2 L}{\partial v^i \, \partial v^j} \right\vert = 0 .\]
The Euler-Lagrange equations,
\[\frac{d}{dt} \frac{\partial L}{\partial v} - \frac{\partial L}{\partial x} = 0 ,\]
of such Lagrangians are a set of first-order ordinary differential equations and not second-order differential equations as for non-degenerate Lagrangians.
Of particular interest in various applications are degenerate Lagrangians of the form
\[L(x,v) = \vartheta(x) \cdot v - H (x) .\]
Their Euler-Lagrange equations take the form
\[\frac{d \vartheta}{dt} (x) = \nabla \vartheta(x) \cdot v - \nabla H (x) .\]
We exemplify this with the Lotka-Volterra problem in 2d.
Lotka-Volterra
Before any use, we need to load EulerLagrange
:
using EulerLagrange
using LinearAlgebra
Next, we generate symbolic variables for a two-dimensional Lagrangian system:
t, x, v = lagrangian_variables(2)
(t, (x(t))[1:2], (v(t))[1:2])
We define a named tuple with typical values for the parameters, e.g.,
params = (
a₁ = -1.0,
a₂ = -1.0,
b₁ = 1.0,
b₂ = 2.0,
)
(a₁ = -1.0, a₂ = -1.0, b₁ = 1.0, b₂ = 2.0)
We use the function symbolize
to generate a symbolic version of the parameters:
sparams = symbolize(params)
(a₁ = a₁ₚ, a₂ = a₂ₚ, b₁ = b₁ₚ, b₂ = b₂ₚ)
Define the Hamiltonian function and the symplectic potential:
ϑ(x, params) = [log(x[2]) / x[1] / 2, - log(x[1]) / x[2] / 2]
H(x, params) = params.a₁ * x[1] + params.a₂ * x[2] + params.b₁ * log(x[1]) + params.b₂ * log(x[2])
H (generic function with 1 method)
The Hamiltonian and the symplectic potential, evaluated on and together with the symbolic variables and parameters are used to construct a DegenerateLagrangianSystem
:
lag_sys = DegenerateLagrangianSystem(ϑ(x,sparams) ⋅ v, H(x,sparams), t, x, v, sparams)
Degenerate Lagrangian system with
L = ((1//2)*(v(t))[1]*(x(t))[2]*log((x(t))[2]) - (1//2)*(v(t))[2]*(x(t))[1]*log((x(t))[1])) / ((x(t))[1]*(x(t))[2]) - a₁ₚ*(x(t))[1] - a₂ₚ*(x(t))[2] - b₁ₚ*log((x(t))[1]) - b₂ₚ*log((x(t))[2])
The constructor computes the Euler-Lagrange equations and generates the corresponding Julia code.
In the last step, we can now construct a LODEProblem
from the LagrangianSystem
and some appropriate initial conditions, a time span to integrate over and a time step:
tspan = (0.0, 10.0)
tstep = 0.01
q₀ = [2.0, 1.0]
p₀ = ϑ(q₀, params)
lprob = LODEProblem(lag_sys, tspan, tstep, q₀, p₀; parameters = params)
Geometric Equation Problem for Lagrangian Ordinary Differential Equation (LODE)
with vector fields
ϑ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x6674c930, 0x263276c7, 0x31cddabe, 0xdc2f6268, 0xf23430a9), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = (1 // 2 * log(getindex(X, 2))) / getindex(X, 1)
#= none:11 =#
ˍ₋out[2] = (-1 // 2 * log(getindex(X, 1))) / getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end)
f = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x136bb501, 0x668179a6, 0x697c5293, 0x8d3a8b3d, 0x322beefc), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = ((-1 * params.a₁ + (-1 // 2 * getindex(V, 2) + (-1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2))) + (-1 * params.b₁) / getindex(X, 1)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) ^ 2 * getindex(X, 2))
#= none:11 =#
ˍ₋out[2] = ((-1 * params.a₂ + (-1 * params.b₂) / getindex(X, 2)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2) ^ 2)) + (1 // 2 * getindex(V, 1) + (1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / (getindex(X, 1) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end)
g = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x64e91999, 0xfe109d19, 0x2cf5f368, 0xac469621, 0x50889fea), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = (-1 // 2 * getindex(V, 2) + (-1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) ^ 2 * getindex(X, 2))
#= none:11 =#
ˍ₋out[2] = (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2) ^ 2) + (1 // 2 * getindex(V, 1) + (1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / (getindex(X, 1) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end)
Lagrangian: L = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x21c2abaa, 0x5d66f8c2, 0x525a0892, 0xd4e06c6d, 0xa934c8e6), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
((((((1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((-1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2)) + (-1 * getindex(X, 1)) * params.a₁) + (-1 * getindex(X, 2)) * params.a₂) + (-1 * params.b₁) * log(getindex(X, 1))) + (-1 * params.b₂) * log(getindex(X, 2))
end
end
end)
Invariants:
(h = EulerLagrange.var"#90#91"{@NamedTuple{L::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x21c2abaa, 0x5d66f8c2, 0x525a0892, 0xd4e06c6d, 0xa934c8e6), Expr}, H::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xd4486f26, 0x7f39bbae, 0xe0d71131, 0x6b3ce74a, 0x20ebaa55), Expr}, EL::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x04ccd514, 0x9a648c25, 0x465055ba, 0x34188cb9, 0x2164f696), Expr}, ∇H::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x00a50584, 0xb8c6d74e, 0x295d8e3a, 0x94624794, 0x5b77be50), Expr}, ẋ::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x7597e48f, 0x5b18ebc5, 0xce803108, 0x785c56c2, 0x37b4bd42), Expr}, v::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :P, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x7597e48f, 0x5b18ebc5, 0xce803108, 0x785c56c2, 0x37b4bd42), Expr}, f::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x136bb501, 0x668179a6, 0x697c5293, 0x8d3a8b3d, 0x322beefc), Expr}, u::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x600f0e62, 0xb5de2968, 0x05f3f7bb, 0xcd7da120, 0x86c52545), Expr}, g::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x64e91999, 0xfe109d19, 0x2cf5f368, 0xac469621, 0x50889fea), Expr}, ū::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :P, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x600f0e62, 0xb5de2968, 0x05f3f7bb, 0xcd7da120, 0x86c52545), Expr}, ḡ::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :P, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x5f340ef2, 0x81a4f592, 0xce25457c, 0xf3d186a5, 0x227887f5), Expr}, p::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xbb044137, 0xb45bea04, 0x5e090008, 0x49919d1a, 0x45c40333), Expr}, ϑ::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x6674c930, 0x263276c7, 0x31cddabe, 0xdc2f6268, 0xf23430a9), Expr}, ω::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x5eacc370, 0x1d49aacf, 0x06e0937f, 0xe0548ae5, 0xfc243566), Expr}, ϕ::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :P, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xbcaeb9a3, 0x59403f23, 0xa07dfef7, 0x15c6c86a, 0xe47c84cc), Expr}, ψ::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :P, :F, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x2f0bc395, 0x242d43b7, 0xb6913fec, 0xc6919df8, 0xc1222b7f), Expr}, P::RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x81b43702, 0x69cb5c49, 0x9492d742, 0x6870c341, 0xdf25bce4), Expr}}}((L = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x21c2abaa, 0x5d66f8c2, 0x525a0892, 0xd4e06c6d, 0xa934c8e6), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
((((((1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((-1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2)) + (-1 * getindex(X, 1)) * params.a₁) + (-1 * getindex(X, 2)) * params.a₂) + (-1 * params.b₁) * log(getindex(X, 1))) + (-1 * params.b₂) * log(getindex(X, 2))
end
end
end), H = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xd4486f26, 0x7f39bbae, 0xe0d71131, 0x6b3ce74a, 0x20ebaa55), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
((getindex(X, 1) * params.a₁ + getindex(X, 2) * params.a₂) + params.b₁ * log(getindex(X, 1))) + params.b₂ * log(getindex(X, 2))
end
end
end), EL = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x04ccd514, 0x9a648c25, 0x465055ba, 0x34188cb9, 0x2164f696), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = -1 * params.a₁ + (-1 * params.b₁) / getindex(X, 1)
#= none:11 =#
ˍ₋out[2] = -1 * params.a₂ + (-1 * params.b₂) / getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), ∇H = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x00a50584, 0xb8c6d74e, 0x295d8e3a, 0x94624794, 0x5b77be50), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = params.a₁ + params.b₁ / getindex(X, 1)
#= none:11 =#
ˍ₋out[2] = params.a₂ + params.b₂ / getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), ẋ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x7597e48f, 0x5b18ebc5, 0xce803108, 0x785c56c2, 0x37b4bd42), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(X, 1) * (params.b₂ + getindex(X, 2) * params.a₂)
#= none:11 =#
ˍ₋out[2] = (-1 * (params.b₁ + getindex(X, 1) * params.a₁)) * getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), v = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :P, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x7597e48f, 0x5b18ebc5, 0xce803108, 0x785c56c2, 0x37b4bd42), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(X, 1) * (params.b₂ + getindex(X, 2) * params.a₂)
#= none:11 =#
ˍ₋out[2] = (-1 * (params.b₁ + getindex(X, 1) * params.a₁)) * getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), f = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x136bb501, 0x668179a6, 0x697c5293, 0x8d3a8b3d, 0x322beefc), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = ((-1 * params.a₁ + (-1 // 2 * getindex(V, 2) + (-1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2))) + (-1 * params.b₁) / getindex(X, 1)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) ^ 2 * getindex(X, 2))
#= none:11 =#
ˍ₋out[2] = ((-1 * params.a₂ + (-1 * params.b₂) / getindex(X, 2)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2) ^ 2)) + (1 // 2 * getindex(V, 1) + (1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / (getindex(X, 1) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end), u = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x600f0e62, 0xb5de2968, 0x05f3f7bb, 0xcd7da120, 0x86c52545), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(V, 1)
#= none:11 =#
ˍ₋out[2] = getindex(V, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), g = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x64e91999, 0xfe109d19, 0x2cf5f368, 0xac469621, 0x50889fea), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = (-1 // 2 * getindex(V, 2) + (-1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2)) + (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) ^ 2 * getindex(X, 2))
#= none:11 =#
ˍ₋out[2] = (((-1 // 2 * getindex(V, 1)) * getindex(X, 2)) * log(getindex(X, 2)) + ((1 // 2 * getindex(V, 2)) * getindex(X, 1)) * log(getindex(X, 1))) / (getindex(X, 1) * getindex(X, 2) ^ 2) + (1 // 2 * getindex(V, 1) + (1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / (getindex(X, 1) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end), ū = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :P, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x600f0e62, 0xb5de2968, 0x05f3f7bb, 0xcd7da120, 0x86c52545), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(V, 1)
#= none:11 =#
ˍ₋out[2] = getindex(V, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), ḡ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :Λ, :P, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x5f340ef2, 0x81a4f592, 0xce25457c, 0xf3d186a5, 0x227887f5), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(V, 2) / ((2 * getindex(X, 1)) * getindex(X, 2)) + ((-1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / getindex(X, 1) ^ 2
#= none:11 =#
ˍ₋out[2] = ((1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / getindex(X, 2) ^ 2 + (-1 * getindex(V, 1)) / ((2 * getindex(X, 1)) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end), p = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xbb044137, 0xb45bea04, 0x5e090008, 0x49919d1a, 0x45c40333), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
begin
#= none:10 =#
SymbolicUtils.Code.create_array(Array, nothing, Val{1}(), Val{(2,)}(), (1 // 2 * log(getindex(X, 2))) / getindex(X, 1), (-1 // 2 * log(getindex(X, 1))) / getindex(X, 2))
end
end
end
end), ϑ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x6674c930, 0x263276c7, 0x31cddabe, 0xdc2f6268, 0xf23430a9), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = (1 // 2 * log(getindex(X, 2))) / getindex(X, 1)
#= none:11 =#
ˍ₋out[2] = (-1 // 2 * log(getindex(X, 1))) / getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), ω = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x5eacc370, 0x1d49aacf, 0x06e0937f, 0xe0548ae5, 0xfc243566), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = 0
#= none:11 =#
ˍ₋out[2] = 1 / (getindex(X, 1) * getindex(X, 2))
#= none:12 =#
ˍ₋out[3] = -1 / (getindex(X, 1) * getindex(X, 2))
#= none:13 =#
ˍ₋out[4] = 0
#= none:15 =#
ˍ₋out
end
end
end
end), ϕ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :P, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0xbcaeb9a3, 0x59403f23, 0xa07dfef7, 0x15c6c86a, 0xe47c84cc), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = getindex(P, 1) + (-1 // 2 * log(getindex(X, 2))) / getindex(X, 1)
#= none:11 =#
ˍ₋out[2] = getindex(P, 2) + (1 // 2 * log(getindex(X, 1))) / getindex(X, 2)
#= none:13 =#
ˍ₋out
end
end
end
end), ψ = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :P, :F, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x2f0bc395, 0x242d43b7, 0xb6913fec, 0xc6919df8, 0xc1222b7f), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = (getindex(F, 1) + ((1 // 2 * getindex(V, 1)) * log(getindex(X, 2))) / getindex(X, 1) ^ 2) + (-1 * getindex(V, 2)) / ((2 * getindex(X, 1)) * getindex(X, 2))
#= none:11 =#
ˍ₋out[2] = (getindex(F, 2) + ((-1 // 2 * getindex(V, 2)) * log(getindex(X, 1))) / getindex(X, 2) ^ 2) + getindex(V, 1) / ((2 * getindex(X, 1)) * getindex(X, 2))
#= none:13 =#
ˍ₋out
end
end
end
end), P = RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :t, :X, :V, :params), EulerLagrange.var"#_RGF_ModTag", EulerLagrange.var"#_RGF_ModTag", (0x81b43702, 0x69cb5c49, 0x9492d742, 0x6870c341, 0xdf25bce4), Expr}(quote
#= none:1 =#
#= none:2 =#
#= none:2 =# @inbounds begin
#= none:4 =#
begin
#= none:8 =#
#= none:8 =# @inbounds begin
#= none:10 =#
ˍ₋out[1] = 0
#= none:11 =#
ˍ₋out[2] = (-1 * getindex(X, 1)) * getindex(X, 2)
#= none:12 =#
ˍ₋out[3] = getindex(X, 1) * getindex(X, 2)
#= none:13 =#
ˍ₋out[4] = 0
#= none:15 =#
ˍ₋out
end
end
end
end))),)
Timespan: (0.0, 10.0)
Timestep: 0.01
Initial conditions:
(t = 0.0, q = [2.0, 1.0], p = [0.0, -0.34657359027997264], v = [2.0, 1.0])
Parameters:
(a₁ = -1.0, a₂ = -1.0, b₁ = 1.0, b₂ = 2.0)
We can integrate this system using GeometricIntegrators:
using GeometricIntegrators
sol = integrate(lprob, Gauss(1))
using CairoMakie
fig = lines(parent(sol.q[:,1]), parent(sol.q[:,2]);
axis = (; xlabel = "x₁", ylabel = "x₂", title = "Lotka-Volterra system in 2d"),
figure = (; size = (800,600), fontsize = 22))