A Python implementation of an algorithm for finding all zeros of a homomorphic function in a given region, from the paper:
Michael Dellnitz, Oliver Schütze, and Qinghua Zheng. "Locating all the zeros of an analytic function in one complex variable." Journal of Computational and Applied mathematics 138.2:325-333 (2002).
- The notebook
Test.ipynb tests the code on examples of functions with known zeros.
- The notebook
SchrodEigs.ipynb applies the code to find zeros of certain non-self-adjoint Schrödinger operators.
This code was used in my paper
Alexei Stepanenko. "Spectral inclusion and pollution for a class of dissipative perturbations". Journal of Mathematical Physics 62(1):013501 (2021)
to create the following figure:

Given a region $\Omega = (\Re(b),\Re(b)+w)\times i (\Im(b),\Im(b)+h)$ (here $b \in \mathbb C, w,h \in \mathbb R$) in the complex plane we can calculate the number of zeros $N$ in $\Omega$ of a holomorphic function $f$ by the argument principle,
$$N = \frac{1}{2 \pi i}\int_{\Omega} \frac{f'}{f}.$$
We split $\Omega$ into four quarters and apply the argument principle to determine wether each quarter contains at least one zero. This gives us an enclosure for the containing the zeros of $f$ in $\Omega$.
To refine this enclosure, we take each quarter that contains at least one zero and again apply the same procedure to it, splittling it into 4 quarters and applying the argument principle. We iterate this process to obtain an enclosure consisting of a union of small boxes. We stop the iterations if either each box in the encosure only contains one zero and a minimum nimber of iterations has been reached, or if some threshold value for the number of iterations has been reached. In our implementation, we use the computer algebra package SymPy to evaluate $f'/f$, given $f$.