Some numerical schemes for SDEs with irregular coefficients.
Work by
- Luis Mario Chaparro Jáquez, University of Leeds (owner of this repository)
- Elena Issoglio, Università degli Studi di Torino
- Jan Palczewksi, University of Leeds
These is the implementation of the numerical methods discussed in the following work:
L. M. Chaparro Jáquez, E. Issoglio, and J. Palczewski, ‘Convergence rate of numerical scheme for SDEs with a distributional drift in Besov space’. arXiv, Sep. 20, 2023. doi: 10.48550/arXiv.2309.11396.
We are concerned with the equation
where
Since the drift coefficient is a distribution the numerical approximation is not trivial and has to be addressed by finding functions which converge to the appropriate distribution.
The way we solve this problem by observing we can take functions
where
In particular we are interested in some function
Notice that
Once the drift is found, we can proceeed by performing the Euler scheme.
There are three main files here:
dsdes.py
where all the functions are definederror.py
where we can test the functions in the file aboveplots.py
which creates the plots of the paper
If you want to test the numerical methods you could just run the file error.py
.
The output you will get is the plot of the convergence rate for the Euler-Maruyama scheme.
Using this file I would recommend to just change the parameter beta
to whichever parameter you want to explore, recall that in theory
You can also modify the dictionary time_steps
in order to have different amounts of time steps or add more approximations, just have the following in mind:
- The point here is that we need to use the Euler-Maruyama method to approximate the real solution of the SDE because there is not an closed form solution to this SDE, so the first
key
of the dictionary isreal
, this corresponds to the amount of time steps we will use to compute our proxy of the real solutions. - The following
keys
areapprox1
,approx2
, etc. This is for the amount of approximations that you want to compute. So if you want an extra approximation you must modify three tuples, namelykeys
,time_steps
anderror
onlines 21, 23, 26
and then go toline 112
and add an extra computation of error just as they are added there. You can see the example of this below.
# Change lines 21, 23 and 26 for the following
keys = ('real', 'approx1', 'approx2', 'approx3', 'approx4', 'approx5', 'approx6') # line 21
time_steps_tuple = (2**15, 2**8, 2**9, 2**10, 2**11, 2**12, 2**13, 2**14) # line 23
error_keys = ('e1', 'e2', 'e3', 'e4', 'e5', 'e6') # line 26
# Then go to line 112 and add a new line with the following
strong_error['e6'] = np.abs(solution['real'] - solution['approx6']) # this will be line 113
Those changes should allow you to run the code and get an extra approximation, optionally you can also change the first element from the time_stesp_tuple
from 2**15
to 2**16
to have a finer real solution.