from . import _sode
from .sode import _Explicit_Simple_Integrator, _Implicit_Simple_Integrator
from ..stochastic import StochasticSolver, SMESolver
__all__ = [
"EulerSODE", "Milstein_SODE", "Taylor1_5_SODE", "Explicit1_5_SODE",
"Implicit_Milstein_SODE", "Implicit_Taylor1_5_SODE"
]
[docs]
class EulerSODE(_Explicit_Simple_Integrator):
"""
A simple generalization of the Euler method for ordinary
differential equations to stochastic differential equations. Only
solver which could take non-commuting ``sc_ops``.
- Order: 0.5
"""
integrator_options = {
"dt": 0.001,
"tol": 1e-10,
}
stepper = _sode.Euler
N_dw = 1
_stepper_options = ["measurement_noise"]
[docs]
class Milstein_SODE(_Explicit_Simple_Integrator):
"""
An order 1.0 strong Taylor scheme. Better approximate numerical
solution to stochastic differential equations. See eq. (3.12) of
chapter 10.3 of Peter E. Kloeden and Exkhard Platen,
*Numerical Solution of Stochastic Differential Equations*..
- Order strong 1.0
"""
integrator_options = {
"dt": 0.001,
"tol": 1e-10,
}
stepper = _sode.Milstein
N_dw = 1
_stepper_options = ["measurement_noise"]
[docs]
class Taylor1_5_SODE(_Explicit_Simple_Integrator):
"""
Order 1.5 strong Taylor scheme. Solver with more terms of the
Ito-Taylor expansion. See eq. (4.6) of chapter 10.4 of Peter E. Kloeden and
Exkhard Platen, *Numerical Solution of Stochastic Differential Equations*.
- Order strong 1.5
"""
integrator_options = {
"dt": 0.001,
"tol": 1e-10,
"derr_dt": 1e-6,
}
stepper = _sode.Taylor15
N_dw = 2
@property
def options(self):
"""
Supported options by Order 1.5 strong Taylor Stochastic Integrators:
dt : float, default: 0.001
Internal time step.
tol : float, default: 1e-10
Relative tolerance.
derr_dt : float, default: 1e-6
Finite time difference used to compute the derrivative of the
hamiltonian and ``sc_ops``.
"""
return self._options
@options.setter
def options(self, new_options):
_Explicit_Simple_Integrator.options.fset(self, new_options)
[docs]
class Explicit1_5_SODE(_Explicit_Simple_Integrator):
"""
Explicit order 1.5 strong schemes. Reproduce the order 1.5 strong
Taylor scheme using finite difference instead of derivatives.
Slower than ``taylor15`` but usable when derrivatives cannot be
analytically obtained.
See eq. (2.13) of chapter 11.2 of Peter E. Kloeden and Exkhard Platen,
*Numerical Solution of Stochastic Differential Equations.*
- Order: strong 1.5
"""
stepper = _sode.Explicit15
N_dw = 2
[docs]
class Implicit_Milstein_SODE(_Implicit_Simple_Integrator):
"""
An order 1.0 implicit strong Taylor scheme. Implicit Milstein
scheme for the numerical simulation of stiff stochastic
differential equations. Eq. (2.11) with alpha=0.5 of
chapter 12.2 of Peter E. Kloeden and Exkhard Platen,
*Numerical Solution of Stochastic Differential Equations*.
- Order strong 1.0
"""
stepper = _sode.Milstein_imp
N_dw = 1
[docs]
class Implicit_Taylor1_5_SODE(_Implicit_Simple_Integrator):
"""
Order 1.5 implicit strong Taylor scheme. Solver with more terms of the
Ito-Taylor expansion. Eq. (2.18) with ``alpha=0.5`` of chapter 12.2 of
Peter E. Kloeden and Exkhard Platen,
*Numerical Solution of Stochastic Differential Equations*.
- Order strong 1.5
"""
integrator_options = {
"dt": 0.001,
"tol": 1e-10,
"solve_method": None,
"solve_options": {},
"deff_dt": 1e-6
}
stepper = _sode.Taylor15_imp
N_dw = 2
@property
def options(self):
"""
Supported options by Implicit Order 1.5 strong Taylor Stochastic
Integrators:
dt : float, default: 0.001
Internal time step.
tol : float, default: 1e-10
Tolerance for the time steps.
solve_method : str, default: None
Method used for solver the ``Ax=b`` of the implicit step.
Accept methods supported by :func:`qutip.core.data.solve`.
When the system is constant, the inverse of the matrix ``A`` can be
used by entering ``inv``.
solve_options : dict, default: {}
Options to pass to the call to :func:`qutip.core.data.solve`.
derr_dt : float, default: 1e-6
Finite time difference used to compute the derrivative of the
hamiltonian and ``sc_ops``.
"""
return self._options
@options.setter
def options(self, new_options):
_Implicit_Simple_Integrator.options.fset(self, new_options)
StochasticSolver.add_integrator(EulerSODE, "euler")
StochasticSolver.add_integrator(Explicit1_5_SODE, "explicit1.5")
SMESolver.add_integrator(Taylor1_5_SODE, "taylor1.5")
SMESolver.add_integrator(Milstein_SODE, "milstein")
SMESolver.add_integrator(Implicit_Milstein_SODE, "milstein_imp")
SMESolver.add_integrator(Implicit_Taylor1_5_SODE, "taylor1.5_imp")