Quadratization of differential equations in python
Project description
QBee
Python library for transforming systems of ODE equations into a systems with quadratic right-rand side.
Installation
PyPI
pip install qbee
Manual
- Clone repository:
https://github.com/AndreyBychkov/QBee.git
- Or, if you want our bleeding edge version, clone
https://github.com/AndreyBychkov/QBee/tree/dev
- Or, if you want our bleeding edge version, clone
- Change directory:
cd QBee
- Install package:
pip install .
If you use poetry
you can alternately install if with
poetry install
What is quadratization?
The problem of quadratization is, given a system of ODEs with polynomial right-hand side, reduce the system to a system with quadratic right-hand side by introducing as few new variables as possible. We will explain it using toy example. Consider the system
An example of quadratization of this system will be a new variable
leading to the following ODE
Thus, we attained the system with quadratic right-hand side
We used only one new variable, so we achieved an optimal quadratization.
Qbee usage
QBee implements algorithms that take system of ODEs with elementary functions right-hand side and return optimal monomial quadratization - optimal quadratization constructed from monomial substitutions.
We will demonstrate usage of QBee on the example below. Other interactive examples you can find in examples section.
1. Importing QBee
QBee relies on Sympy for a high-level API.
import sympy
from qbee import *
sympy.init_printing() # If you work in Jupyter notebook
2. System definition
For example, we will take the A1 system from Swischuk et al.'2020
The parameters in the system are A, Ea and Ru
, and the others are either state variables or inputs.
So, let's define them with the system in code:
A, Ea, Ru = parameters("A, Ea, Ru")
c1, c2, c3, c4, T = functions("c1, c2, c3, c4, T")
eq1 = -A * sp.exp(-Ea / (Ru * T)) * c1 ** 0.2 * c2 ** 1.3
system = [
(c1, eq1),
(c2, 2 * eq1),
(c3, -eq1),
(c4, -2 * eq1)
]
3. Polynomialization and Quadratization
When we work with ODEs with the right-hand side being a general continuous function, we utilize the following pipeline:
Input system -> Polynomial System -> Quadratic System
and the transformations are called polynomialization and quadratization accordingly.
The example system is not polynomial, so we use the most general method for achieving optimal monomial quadratization.
# {T: 2} means than T can have a derivative of order at most two => T''
quadr_system = polynomialize_and_quadratize(system, input_der_orders={T: 2})
if quadr_system:
print("Quadratized system:")
print(quadr_system)
Sample output:
Variables introduced in polynomialization:
w_{0} = c1**(-0.8)
w_{1} = c2**(-0.7)
w_{2} = 1/T
w_{3} = exp(-Ea*w_{2}/Ru)
Elapsed time: 0.139s.
==================================================
Quadratization result
==================================================
Number of introduced variables: 5
Nodes traversed: 117
Introduced variables:
w_{4} = T'*w_{2}
w_{5} = T'*w_{2}**2
w_{6} = c2**2*w_{0}*w_{1}*w_{3}
w_{7} = w_{2}**2
w_{8} = c1*c2*w_{0}*w_{1}*w_{3}
Quadratized system:
c1' = -A*c2*w_{8}
c2' = -2*A*c2*w_{8}
c3' = A*c2*w_{8}
c4' = 2*A*c2*w_{8}
w_{0}' = 4*A*w_{0}*w_{6}/5
w_{1}' = 7*A*w_{1}*w_{8}/5
w_{2}' = -T'*w_{7}
w_{3}' = Ea*w_{3}*w_{5}/Ru
T' = T'
T'' = T''
T''' = 0
w_{4}' = -T'*w_{5} + T''*w_{2}
w_{5}' = T''*w_{7} - 2*w_{4}*w_{5}
w_{6}' = 4*A*w_{6}**2/5 - 13*A*w_{6}*w_{8}/5 + Ea*w_{5}*w_{6}/Ru
w_{7}' = -2*w_{4}*w_{7}
w_{8}' = -A*w_{6}*w_{8}/5 - 3*A*w_{8}**2/5 + Ea*w_{5}*w_{8}/Ru
Process finished with exit code 0
Introduced variables are the optimal monomial quadratization.
4. Work inside of package
1. Configuration
Inside of config.ini
you can change the following arguments:
logging_enable = [True | False]
. If enabled, work of algorithm is logged intologging_file
andquad_systems_file
. Requires memory to work. Is not recommended for long quadratizations.logging_file
: must be in Apache Arrow.feather
format.quad_systems_file
: dump quadratic systems by using pickle..pkl
file format is recommended.progress_bar_enable
: enables progress bar during quadratization.
2. Visualization
In order to visualize work of an algorithm you can pass logging data to qbee.visualize.visualize_pyvis
:
visualize_pyvis('log.feather', 'quad_systems.pkl')
Papers
Citation
If you find this code useful in your research, please consider citing the above paper that works best for you.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.