The Bessel functions *J* and *Y* are analogous to sine and cosine. Bessel functions come up in polar coordinates the way sines and cosines come up in rectangular coordinates. There are *J* and *Y* functions of various orders, conventionally written with a subscript ν.

I recently ran across a curious set of relations between these functions and their derivatives. Let’s start with the following terms defined by 2 by 2 determinants.

There are a lot of symmetries in the definitions above. First, every term has a subscript ν, so you can ignore those for now.

Second, every determinant has *J*‘s on the top row and *Y*‘s on the bottom.

Third, every determinant has *a*‘s in the first column and *b*‘s in the second.

And finally, the primes, indicating derivatives, have the following pattern.

Now that we have all these definitions in place, there are several identities that the *p’*s, *q’*s, *r’*s, and *s*‘s satisfy. Some of them depend on the orders, and that’s why we included the ν subscripts. You can find various relations in A&S equation 9.1.32, but I wanted to point out one that’s particularly elegant, A&S equation 9.1.34:

This equation, a determinant of terms defined by determinants, reduces to a simple form that depends only on where the Bessel functions are evaluated, i.e. *a* and *b*, but not on their order ν.

## Python example

The Python code below will show how to call Bessel functions and their derivatives and will illustrate the equations above.

from math import pi from scipy.special import jv, yv, jvp, yvp def example(n, a, b): ja = jv(n, a) jb = jv(n, b) ya = yv(n, a) yb = yv(n, b) jap = jvp(n, a) jbp = jvp(n, b) yap = yvp(n, a) ybp = yvp(n, b) p = ja * yb - jb * ya q = ja * ybp - jbp * ya r = jap * yb - jb * yap s = jap * ybp - jbp * yap print(p*s - q*r) print(4/(pi*pi*a*b)) example(3, 16, 21)

This prints

0.0012062045671706876 0.0012062045671706878

The two results differ slightly in the last decimal place due to rounding error.

The order of a Bessel function can be any real number [1], and the arguments can be any complex number. Here’s another example with more general arguments.

example(3.14, 16-3j, 21+1.2j)

This prints

(0.0011738907214344785 + 0.00015140286689885318j) (0.0011738907214345800 + 0.00015140286689880630j)

with the real and imaginary parts agreeing to 15 decimal places.

## Related posts

[1] You can define Bessel functions with complex order, but SciPy doesn’t support that.

I have only ever seen Bessel functions discussed in (older) radio-engineering textbooks, where their derivation is usually secondary to high-resolution graphs of the functions. Their purpose and use is never made explicit, but I deduce that, back in slide-rule days, they were the best, if not the only, way to know whether or not an FM transmitter was overmodulating. Doubtless that is all automated in newer transmitters. Is there a concise description of how to get from Bessel functions to the instantaneous modulation index of an FM transmitter?

Thanks, Frank. I don’t know off hand what instantaneous modulation index is, but I’ve written a couple posts on Bessel functions and FM signals.

Analyzing an FM signal

Energy in FM signals