Bessel function with imaginary argument



Am Donnerstag, den 29.01.2009, 09:21 +0100 schrieb Schirmacher, Rolf:

A second attempt. I have tried to do it more complete:

(%i2) f(n,x):=[realpart(bessel_j(n,x)),imagpart(bessel_j(n,x))]$

We start with n an integer and the argument is real and positive:

(%i3) declare(n,integer)$
(%i4) assume(x > 0)$

(%i5) f(n,x)
(%o5) [bessel_j(n,x),0]  /* list is [realpart,imagpart] */
(%i6) f(n,-x)
(%o6) [bessel_j(n,-x),0]

Half integral values work symbolically:

(%i7) f(1/2+n,x)
(%o7) [bessel_j(n+1/2,x),0]
(%i8) f(1/2+n,-x)
(%o8) [0,bessel_j(n+1/2,-x)]

Argument is imaginary and order an even or odd integer:

(%i9) declare(n_even,even)$
(%i10) declare(n_odd,odd)$

(%i11) f(n_even,%i)
(%o11) [bessel_j(n_even,%i),0]
(%i12) f(n_odd,%i)
(%o12) [0,bessel_j(n_odd,%i)]

This works for more general imaginary arguments too:

(%i25) f(n_even,x*%i)
(%o25) [bessel_j(n_even,%i*x),0]
(%i26) f(n_odd,x*%i)
(%o26) [0,bessel_j(n_odd,%i*x)]
(%i27) f(n_even,(1+x)^2*%i)
(%o27) [bessel_j(n_even,%i*(x+1)^2),0]
(%i28) f(n_odd,(1+x)^2*%i)
(%o28) [0,bessel_j(n_odd,%i*(x+1)^2)]

And for symbols declared to be imaginary:

(%i29) declare(j,imaginary)$

(%i30) f(n_even,(1+x)^2*j)
(%o30) [bessel_j(n_even,j*(x+1)^2),0]
(%i31) f(n_odd,(1+x)^2*j)
(%o31) [0,bessel_j(n_odd,j*(x+1)^2)]

This the new routine risplit-bessel-j:

(defun risplit-bessel-j (args)
  (let ((order (car  args))
        (arg   (cadr args))
        (sign-order ($csign (car args)))
        (sign-arg   ($csign (cadr args))))    
    (cond
      ((or (member sign-order '($complex $imaginary))
           (eq sign-arg '$complex))
       (risplit-noun (list '(%bessel_j) order arg)))
      ((eq sign-arg '$imaginary)
       (cond 
         ((or ($oddp  order)
              ($featurep order '$odd)) /* oddp don't check facts */
          (cons 0 (list '(%bessel_j) order arg)))
         ((or ($evenp order)
              ($featurep order '$even)) /* evenp don't check facts */
           (cons (list '(%bessel_j) order arg) 0))
         (t (risplit-noun (list '(%bessel_j) order arg)))))
      ;; At this point order and arg are real valued.
      ;; We have to look for some special cases involving a negative arg
      ((or (maxima-integerp order)
           (member sign-arg '($pos $pz)))
       ;; arg is positive or order an integer, real valued.
       (cons (list '(%bessel_j) order arg) 0))
      ;; The sign of arg is negative or not known
      ((zerop1 (sub ($truncate ($multthru 2 order)) 
                    ($multthru 2 order)))
       ;; order is half integral
       (cond
          ((eq sign-arg '$neg)
           (cons 0 (list '(%bessel_j) order arg)))
          (t
            ;; the sign of arg is not known
            (risplit-noun (list '(%bessel_j) order arg)))))
      (t
        ;; the sign of arg is not known
        (risplit-noun (list '(%bessel_j) order arg))))))


If it is of general interest to have more support for the realpart and
imagpart of a function like bessel_j I could commit the extension.

Dieter Kaiser