Adding Symplectic Integrators#1411
Conversation
|
@JacobHass8 : I think a good test is to identify the conserved quantity you wish to be conserved, and show that quantity is much better preserved with a symplectic integrator than with (say) RK4. I would also recommend an API for event detection and return a solution skeleton that can be interpolated as a Hermite spline, i.e., return ${t_k, y_k, dot{y}k}{k=0}^{n-1}$ rather than the typical solution skeleton {t_k, y_k, }_{k=0}^{n-1}. |
I've tried this on a harmonic oscillator and the energy fluctuations seem to be of order 1e-11 (for the 6th order method). I haven't checked RK4 (or any other method though!).
I'm not sure I totally understand what you mean. Are you saying return a third object that could be used to interpolate between different |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #1411 +/- ##
===========================================
- Coverage 95.39% 95.38% -0.01%
===========================================
Files 826 828 +2
Lines 68901 69002 +101
===========================================
+ Hits 65726 65820 +94
- Misses 3175 3182 +7
... and 4 files with indirect coverage changes Continue to review full report in Codecov by Harness.
🚀 New features to boost your workflow:
|
Exactly. Say you have an However, you have to compute Note that this is still inferior to the "natural interpolant", but given there seems to be no hope to get every ODE stepper's interpolant into the standard graphics packages, I think this is a reasonable compromise. |
| namespace boost{ namespace math {namespace quadrature { | ||
|
|
||
| template <class RealType, class ReturnType, class Func> | ||
| std::pair<ReturnType, ReturnType> second_order_yoshida(const ReturnType p0, |
There was a problem hiding this comment.
@JacobHass8 : It appears to me that if we wanted to return both objects of the same type, we would do a std::array<ReturnType,2>. But it also appears that these two objects have different units. Could it work with dimensioned types like mpunitz or boost::units? That would indeed force you into a std::pair.
There was a problem hiding this comment.
I don't think the return object necessarily need to be the same type. It is just returning the input types of p0 and q0.
There was a problem hiding this comment.
However, there is a constraint on these types. Either we need to be able to add the types of p0 and q0 or we need the function dHdp to take in a type of p0 and return a type of q0 (for dHdq we need q0 -> p0).
This is because of the lines
ReturnType p = p0;
ReturnType q = q0;
q = q + dt / 2 * dHdp(p);
p = p - dt * dHdq(q);I'm not familiar with mpunitz or boost::units. I was only thinking about singletons versus array types.
| [ run test_trapezoidal.cpp /boost/test//boost_unit_test_framework : : : | ||
| release [ requires cxx11_lambdas cxx11_auto_declarations cxx11_decltype cxx11_unified_initialization_syntax cxx11_variadic_templates ] | ||
| $(float128_type) ] | ||
| [ run test_symplectic.cpp /boost/test//boost_unit_test_framework ] |
There was a problem hiding this comment.
I don't think you used boost unit test framework here right? You just used the boost::math floating point comparisons.
There was a problem hiding this comment.
I'm not entirely sure what the unit test framework is. I just copied it from test_trapezoidal...
|
@NAThompson I created a .qbk file to add documentation for the functions I added. I couldn't figure out how to build the documentation though. I kept getting errors when trying to follow the boost math guide. I wanted to include an equation so I created a .svg and .png using latex. However, I noticed that all other equations have a .mml file. Do you know how to convert these? |
| // calculate the partial derivatives with respect to each p_i | ||
| } | ||
|
|
||
| The function must return a `valarray` type, as opposed to `std::vector`, because we must be |
There was a problem hiding this comment.
@JacobHass8 : I believe that std::valarray has been essentially deprecated in the C++ community. @mborland : Is this correct?
In general, we like to use template typename <RandomAccessContainer>.
There was a problem hiding this comment.
I only used std::valarray because it supports vectorized arithmetic. I think Eigen vectors would be okay too.
Maybe this shouldn't be a requirement though? I would need to either convert to an std::valarray or just write for loops. The for loops option isn't bad but I thought it would obfuscate the algorithm.
There was a problem hiding this comment.
Yeah, I'd personally just leave it generic and do a for loop.
There was a problem hiding this comment.
Hmmm, I can't figure out how to allow the function to accept both numeric types and iterators. I might just require the user to always input an iterator. I can't figure out how to use for loops for iterators and none for numeric types.
I just use this website and drop pngs in it. I also experienced errors while building the docs-I think @mborland may have to help based on your particular error. |
What are the errors you are getting? Unfortunately there is a rather long toolchain required for building the docs, we did have it all documented on the old wiki, but I have a hunch that's bitten the dust :(
Don't worry about .mml, these are all a "historical artefact": when we started there was no easy way to convert LaTex to SVG or something web friendly (other than blocky pngs) but MML was the new kid on the block and there was a nice GUI editor and some scripts to convert the mml to SVG so that was what we used. Nowadays those tools are all unmaintained, and LaTex is so much better... please just make sure that the original LaTex is archived somewhere (a comment in the docs next to the link including the SVG would be good) that way if someone later spots an error it's so much easier/quicker to fix! |
Actually, no errors. I found the .xml file but don't know how to convert this to html. I just ran
Sounds good! I added the latex command. |
|
@jzmaddock or @NAThompson do you think Kahan summation might help the accuracy of these algorithms? Essentially, the algorithm is just summing together a bunch of small steps so I thought it might help. |


Adds symplectic solvers for ODE systems with a conserved quantity (i.e. energy). This was a requested scipy feature (see #303 and scipy/scipy#12690). I'd ultimately like to merge this into scipy using cython. I'm still working on this and have a couple of features I'd like to add:
Does this seem like a good plan? I'd appreciate any input.