@@ -19,20 +19,22 @@ In order to separate these two, we will use `iip` for the in-place names and `oo
1919using OrdinaryDiffEq, Plots, DiffEqCallbacks
2020using SciMLBenchmarks
2121using TaylorIntegration, LinearAlgebra, StaticArrays
22+
23+ # Set plotting formats
2224gr(fmt=:png)
2325default(fmt=:png)
2426
2527T(p) = 1//2 * norm(p)^2
26- V(q) = 1//2 * (q[1]^2 + q[2]^2 + 2q [1]^2 * q[2]- 2//3 * q[2]^3)
27- H(p,q, params) = T(p) + V(q)
28+ V(q) = 1//2 * (q[1]^2 + q[2]^2 + 2 * q [1]^2 * q[2] - 2//3 * q[2]^3)
29+ H(p, q, params) = T(p) + V(q)
2830
29- function iip_dq(dq,p,q, params,t)
31+ function iip_dq(dq, p, q, params, t)
3032 dq[1] = p[1]
3133 dq[2] = p[2]
3234end
3335
34- function iip_dp(dp,p,q, params,t)
35- dp[1] = -q[1] * (1 + 2q [2])
36+ function iip_dp(dp, p, q, params, t)
37+ dp[1] = -q[1] * (1 + 2 * q [2])
3638 dp[2] = -q[2] - (q[1]^2 - q[2]^2)
3739end
3840
@@ -44,7 +46,7 @@ function oop_dq(p, q, params, t)
4446end
4547
4648function oop_dp(p, q, params, t)
47- dp1 = -q[1] * (1 + 2q [2])
49+ dp1 = -q[1] * (1 + 2 * q [2])
4850 dp2 = -q[2] - (q[1]^2 - q[2]^2)
4951 @SVector [dp1, dp2]
5052end
@@ -56,19 +58,33 @@ function hamilton(du, u, p, t)
5658 dq, q = @views u[3:4], du[3:4]
5759 dp, p = @views u[1:2], du[1:2]
5860
59- dp[1] = -q[1] * (1 + 2q [2])
61+ dp[1] = -q[1] * (1 + 2 * q [2])
6062 dp[2] = -q[2] - (q[1]^2 - q[2]^2)
6163 dq .= p
6264
6365 return nothing
6466end
6567
68+ function manifold_jacobian!(J, u)
69+ p, q = u[1:2], u[3:4]
70+
71+ J[1, 1] = p[1]
72+ J[1, 2] = p[2]
73+
74+ J[1, 3] = q[1] + 4 * q[1] * q[2]
75+ J[1, 4] = q[2] + 2 * q[1]^2 - 2 * q[2]^2
76+
77+ J[2:4, :] .= 0
78+
79+ nothing
80+ end
81+
6682function g(resid, u, p)
6783 resid[1] = H([u[1], u[2]], [u[3], u[4]], nothing) - E
6884 resid[2:4] .= 0
6985end
7086
71- const cb = ManifoldProjection(g, nlopts=Dict(:ftol => 1e-13), autodiff = AutoForwardDiff() )
87+ const cb = ManifoldProjection(g, nlopts=Dict(:ftol => 1e-13), manifold_jacobian=manifold_jacobian )
7288
7389const E = H(iip_p0, iip_q0, nothing)
7490```
0 commit comments