A package implementing the adaptive Riccati defect correction (ARDC) method
This package is a C++ port of the riccati python package.
riccati
is a C++
package for solving ODEs of the form
on some solution interval
riccati
uses the adaptive Riccati defect correction method -- it switches
between using nonoscillatory (spectral Chebyshev) and a specialised oscillatory
solver (Riccati defect correction) to propagate the numerical solution based on
its behaviour. For more details on the algorithm, please see Attribution.
Benchmarks are available in python/benchmarks
and can be run with
cmake -S . -B "build" -DCMAKE_BUILD_TYPE=RELEASE -DRICCATI_BUILD_TESTING=ON
cd build/python/benchmark
make -j4 figgen
Below is a graph camparing several methods over Bremer's phase function method on Eq. (237) in Bremer 2018. The omega and gamma functions are given by the following.
The blue area in the graph of errors is the best possible lower bound for error calculated by Bremer. Because the results of each algorithm are compared relative to Bremer's values, the algorithms may report smaller values than the actual possible error, but should be considered bounded by the blue area.
Read the documentation at the docs site.
If you find this code useful in your research, please cite Agocs & Barnett (2022). Its BibTeX entry is
@ARTICLE{ardc,
author = {{Agocs}, Fruzsina J. and {Barnett}, Alex H.},
title = "{An adaptive spectral method for oscillatory second-order
linear ODEs with frequency-independent cost}",
journal = {arXiv e-prints},
keywords = {Mathematics - Numerical Analysis},
year = 2022,
month = dec,
eid = {arXiv:2212.06924},
pages = {arXiv:2212.06924},
doi = {10.48550/arXiv.2212.06924},
archivePrefix = {arXiv},
eprint = {2212.06924},
primaryClass = {math.NA},
adsurl = {https://ui.adsabs.harvard.edu/abs/2022arXiv221206924A},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}
}
Copyright 2024 The Simons Foundation, Inc.
riccati is free software available under the BSD 3.0, for details see the LICENSE.
From the top level directory you can build and call the tests with the following.
# DEBUG build types enable 0g, ggdb3, and pretty printing helper functions in utils
cmake -S . -B "build" -DCMAKE_BUILD_TYPE=RELEASE -DRICCATI_BUILD_TESTING=ON -DRICCATI_BUILD_BENCHMARKS=ON -DRICCATI_BUILD_PYTHON=ON
cd build/tests
make -j4 riccati_test && ctest
As an example we will solve Bremer's Eq. 237 where the omega and gamma functions are given by the following.
In the code we use the riccati::vectorize
function to convert the scalar functions to vector functions.
We then use the riccati::make_solver
function to create the solver object.
Finally we use the riccati::evolve
function to solve the ODE.
riccaticpp
is a header only library and so any project can include it just by copy/pasting in the include folder. For cmake based projects
include(FetchContent)
FetchContent_Declare(
riccaticpp
https://github.com/SteveBronder/riccaticpp
main # Use a specific version or commit
)
FetchContent_MakeAvailable(riccaticpp)
# For your target
target_link_libraries(target_name riccati)
See the example here