Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > Idl-pvware > Re: Confluent H...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 3 of 8 Topic 5449 of 6248
Post > Topic >>

Re: Confluent Hypergeometric Function of the First Kind

by Dan Larson <dlarson@[EMAIL PROTECTED] > Feb 21, 2008 at 08:26 AM

On Feb 21, 9:30=A0am, Spon <christoph.b...@[EMAIL PROTECTED]
> wrote:
> On Feb 20, 3:44 pm, noahh.schwa...@[EMAIL PROTECTED]
 wrote:
>
>
>
>
>
> > Hello everyone,
>
> > I am looking for the Confluent Hypergeometric Function of the First
> > Kind in the IDL Math Library but it does not seem to be implemented!
>
> > I would like to use a function similar to the Hypergeometric1F1[a, b,
> > z] of Mathematica [http://reference.wolfram.com/mathematica/ref/
> > Hypergeometric1F1.html].
>
> > I have not found what I was looking for, and so decided to try to code
> > it my self... [sigh...]. Beeing a fresh beginner in IDL this is a hard
> > task!
>
> > Would anybody know how to code an infinite series expansion like the
> > Hypergeometric1F1?
>
> > Thank you in advance for your time!
> > Noah
>
> Noah,
>
> here's my attempt. It accepts only scalar inputs for A and B, while Z
> can be a vector. I've tested it for the examples on the mathematica
> site and it seems to give correct results, and works correctly for
> complex input too as far as I can tell. 'Precision' is an input
> variable to specify how close two successive iterations have to be
> before the function assumes they are the same and aborts the while
> loop. Default is 7 (i.e. stop when results differ by 10^-7 or less).
> If you're finding this programme is running very slow, try decreasing
> the precision (I was surprised how fast it runs despite the while
> loop, actually!)
>
> Ideally the input parameters should all be double precision before you
> make the call to the funcion, but the function converts them if
> they're not.
>
> If you want all your inputs to be vectors (not just Z), I'm sure it
> can be done, but it'd be a bit more complicated. :-)
>
> Take care,
> Chris
>
> FUNCTION HYPERGEOMETRICONEFONE, A, B, Z, $
> =A0PRECISION =3D Precision, $
> =A0K =3D K ; K is an output parameter to count No. of WHILE loops
> performed.
>
> =A0; References:
> =A0;http://reference.wolfram.com/mathematica/ref/Hypergeometric1F1.html
> =A0;http://en.wikipedia.org/wiki/Confluent_hypergeometric_function
>
> IF N_PARAMS() NE 3 THEN MESSAGE, 'Must input A, B & Z as 3 input
> parameters.'
> IF N_ELEMENTS(A) GT 1 THEN MESSAGE, 'Variable A must be a scalar.'
> IF N_ELEMENTS(B) GT 1 THEN MESSAGE, 'Variable B must be a scalar.'
>
> A *=3D 1.0D ; Double precision or double complex scalar
> B *=3D 1.0D ; Double precision or double complex scalar
> Z *=3D 1.0D ; Double precision or double complex scalar or vector
> IF N_ELEMENTS(Precision) EQ 0 THEN $
> =A0 Precision =3D 7L ELSE $
> =A0 =A0 Precision =3D (LONG(Precision))[0]
> Cutoff =3D 10D^(-1D * Precision) > (MACHAR()).EPS ; Cutoff can't be
> smaller than machine accuracy!
>
> K =3D 0L
> ThisResult =3D REPLICATE(0D, N_ELEMENTS(Z))
> WHILE (N_ELEMENTS(LastResult) EQ 0) || (MAX(ABS(LastResult -
> ThisResult)) GT Cutoff) DO BEGIN
> =A0 =A0 LastResult =3D ThisResult
> =A0 =A0 AK =3D GAMMA(A + K) / GAMMA(A) ; Define (A)k
> =A0 =A0 BK =3D GAMMA(B + K) / GAMMA(B) ; Define (B)k
> =A0 =A0 F =3D (AK * Z^K) / (BK * FACTORIAL(K)) ; Evaluate function.
> =A0 =A0 ThisResult =3D LastResult + F
> =A0 =A0 K +=3D 1
> ENDWHILE ; Until result is good to Precision
>
> =A0; Error if not enough while loops to give accurate results.
> IF K LE 1 THEN MESSAGE, 'Function failed. Try greater precision.'
>
> RETURN, ThisResult
> END- Hide quoted text -
>
> - Show quoted text -

Noah,

Here is my implementation, both of the series expansion of the
hypergeometric function and the integral representation.  Depending on
the parameters, I have found that one may be more stable than the
other.  Both of these are based on Arfken and Weber, Mathematical
Methods for Physicists.

best,
dan

; chss
; confluent hypergeometric series solution
; calculates the solution to the differential equation:
;   xy"(x) + (c - x)y'(x) - ay(x) =3D 0
; (see Afken and Weber, p. 801-2)
;
; inputs:
;   n: number of terms to calculate. Due limits in IDL architecture n
must be between 1 and 170.
;   a, c: vector of constants - see above. They MUST have the same
number of elelments
;   x: input value
;
; outputs:
;   y: output vector
;
; Dan Larson, 2007.10.11


function chss, n, a, c, x
    y =3D DBLARR((SIZE(a))[1])
    ; first term of series expansion is 1, so we initialize the output
    y[*] =3D 1


    FOR i =3D 0, (SIZE(a))[1]-1 DO BEGIN
       ; initialize constant series products
       a_p =3D 1
       c_p =3D 1
       FOR j =3D 0, n DO BEGIN


         a_p *=3D (a[i] + j)
         c_p *=3D (c[i] + j)
         d =3D FACTORIAL(j + 1)


         y[i] +=3D (a_p/c_p)*(x^(j + 1))/d


       ENDFOR
    ENDFOR
    RETURN, y
END


; chins
; confluent hypergeometric integral solution
; calculates the solution to the differential equation:
;   xy"(x) + (c - x)y'(x) - ay(x) =3D 0
; (see Afken and Weber, p. 801-2)
;
; inputs:
;   a, c: vector constants - see above
;   x: input value
;
; outputs:
;   y: output vector
;
;Dan larson, 2007.10.11


Function chins, a, c, x
    ; curve point resolution, change this if your results look like
crap
    b =3D 1000
    ; initialize t vector
    t =3D DINDGEN(b + 1)/b
    ; initialize vector of curve heights
    h =3D DBLARR(b + 1)
    ; initialize output
    y=3Ddblarr(n_elements(c))

    g1 =3D GAMMA(c)
    g2 =3D GAMMA(a) * GAMMA(c - a)


    FOR i =3D 0, (SIZE(a))[1]-1 DO BEGIN
       FOR j =3D 0, b DO BEGIN
         h[j] =3D exp(x*t[j]) * ((t[j])^(a[i] - 1.0)) * ((1.0 -
t[j])^(c[i] - a[i] - 1.0))
         ENDFOR

       y[i] =3D (g1[i]/g2[i]) * int_tabulated(t, h, /double)
     ENDFOR

    RETURN, y
END


; chcmp
; compares the results between the integral and series form of CHF
;
; inputs:
;   a, c: constants
;   x: input value
;
; output:
;   none
;  (solution is printed to screen)


PRO chcmp, a, c, x, epsilon
    y1 =3D chins(a, c, x)


    lastVal =3D 0.0000


    FOR n =3D 1, 170 DO BEGIN
       y2 =3D chss( n, a, c, x)


       IF ( ABS(y1 - y2)/y1 LT epsilon) THEN BEGIN
         print, "Number of necessary terms for ep =3D ", epsilon, " n =3D
", n
         BREAK
       ENDIF


       IF( ABS(lastVal - y2)/y2 EQ 0) THEN BEGIN
         print, "Series converged before matching integral!"
         BREAK
       ENDIF


       lastVal =3D y2
    ENDFOR


    IF n EQ 169 THEN PRINT, "Equations did not meet!"



    RETURN
END
 




 8 Posts in Topic:
Confluent Hypergeometric Function of the First Kind
noahh.schwartz@[EMAIL PRO  2008-02-20 07:44:49 
Re: Confluent Hypergeometric Function of the First Kind
Spon <christoph.blau@[  2008-02-21 06:30:10 
Re: Confluent Hypergeometric Function of the First Kind
Dan Larson <dlarson@[E  2008-02-21 08:26:56 
Re: Confluent Hypergeometric Function of the First Kind
noahh.schwartz@[EMAIL PRO  2008-02-22 02:36:05 
Re: Confluent Hypergeometric Function of the First Kind
Spon <christoph.blau@[  2008-02-22 04:46:29 
Re: Confluent Hypergeometric Function of the First Kind
Spon <christoph.blau@[  2008-02-22 05:16:22 
Re: Confluent Hypergeometric Function of the First Kind
Dan Larson <dlarson@[E  2008-02-22 07:30:08 
Re: Confluent Hypergeometric Function of the First Kind
Matthias Cuntz <mc@[EM  2008-03-05 23:01:23 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Fri Oct 10 14:25:57 CDT 2008.