Computation of Lauricella function

Hi All,

I am trying to compute the Lauricella function of type FA (n) [a; 1,...,1;  b1,...,bn;  x1,...xn] using the Burchnall–Chaundy expansion which basically reduces it to the product of Gauss hypergeometric functions. Convergence of the series is guaranteed as |x1| + ... |xn| < 1 always. This approcah seems to give correct result when |x1| + ... |xn|  is around 0.9 or less, and any increase above 0.9 results in rapid deviation from the expected value as observed from the output (obtained result is less than the expected value by some orders). Is it an issue due to the convergence or something else?.  Can anybody comment on the above issue as my obesrvation above is by repeated trials only. Any views on how I can take care of this issue or atleast increase the range of accurate result?

Also is there any specfic values for Lauricella functions available anywhere so that I can check the accuracy of my computation because as of now I am using some crude method of checking the accuracy of the output.

Thanks a lot in advance.

Best regards,

Vish

 

alec's picture

Code

There might be some bugs (which may be fixed or not in other Maple versions) - it is hard to tell without seeing an example. It would be easier if you just posted some code that could be tried, and expected results.

Alec

Here is the worksheet

Hi Alec,

Thanks for the reply. Please find the attached file which gives the description and instance of the computation.

Best regards,

VishView 8014_Worksheet.mw on MapleNet or Download 8014_Worksheet.mw
View file details

Axel Vogt's picture

more likely you have typos

It is more likely you have typos in you code or translated the formula
not in a correct way - however can not say something on that (do not
work with that functions and do not have the article).

But looking into your example: the outer loop just produces different
inputs r ( 0 < r < 1/4) for the inner loop.

The inner loop leads to products of Gamma and powers of 2F1. Even if
some cancellation error is possible (may be healed by high precision)
I doubt that Maple makes an error in that case.


PS: it is better to work with the classical interface for such kind of
problems, there are less traps for false input (say multiplication is
missing or similar).
Edited: you inner (with the given parameters) loop produces
54*(r-2)^4*(r^2-2*r+2)^4*GAMMA(5+4*r)/(r-1)^16/GAMMA(r+5)^4
alec's picture

1D-input

I agree with Axel that it would be much easier in the Classic interface with 1D-input, preferably posted on this site in plain text, so that it could be copied and pasted into Maple instead of retyping. Maybe, 2d-input looks nicer for somebody, but it is impossible to use it by copying and pasting from MapleNet. I started retyping it, but it took long time and I didn't finish it. I can't distinguish from the screen whether it is i, or j, or something else.

The loop with the product could, probably, be replaced with a single product command.

Alec

Axel Vogt's picture

well ...

Running the inner loop with uppercase Hypergeom, an unsigned r and CS=L*C one gets
a result, which lets one guess the original formula used here (by varying L):

hypergeom([1, 1+L*C],[1+C],r)^L *
  GAMMA(1+(C+r)*L)/(GAMMA(r+1+L*C)^(L-1))/GAMMA((C+r)*L+1-3*r)*GAMMA(1+L*C)^(L-1);

Substituting postive integers for L and C this turns out to be a rational
function in r, up to factors involving the Gamma function:

  subs(L=4, C = 1, %);
  convert(%,StandardFunctions):
  factor(%):
  f:=unapply(%,r); 

                                            4   2           4
                   54 GAMMA(5 + 4 r) (r - 2)  (r  - 2 r + 2)
         f := r -> ------------------------------------------
                                   16             4
                            (r - 1)   GAMMA(r + 5)


The outer loop only defines test values, which may be sampled into an Array and
applies f to that. Or one does it follows:

  data:=[a = 1, C = 1, L = 4];

  for rangedb from -5 by 5 to 40 do 
    y := 10^((1/10)*rangedb); 
    R := C/y; 
    r := R/(a+L*R);
    eval(f(r),data);
  print('f'(r)=evalf[20](%)); #print('f'(eval(r,data))=evalf[20](%));
  end do:

Whether those are results coinciding with the article now is on you, since that
paper is not public available :-)

For your series problem: using series for hypergeometrics (if even allowed to
be used) becomes quite a mess for inputs x where abs(x) > 2/3 and Maple uses
other ways. However usually you do not need to care how Maple does it, just
call the function.

Refernce paper and the code as text

Hi,

I am sorry about the uploaded file format. I have just included the same piece of code in simple text. I had used the 2D input just to show the behaviour of the function with different input values as the deviation of the result from the expected value is not quite visble for 1D input. 

Digits := 50: interface(displayprecision = 3):

a := 1: C := 1.000: L := 4: CS := C*L:  result := array(1 .. 10):  ind := 1:

for rangedb from -5 by 5 to 40 do

y := 10^((1/10)*rangedb):

R := C/y:

r := R/(a+L*R):

result[ind] := simplify((Product(GAMMA(1+CS)*GAMMA(1+CS+(L-n+1)*r)*hypergeom([1+CS, 1], [1+C], r)/(GAMMA(r+1+CS)*GAMMA(1+CS+(L-n)*r)), n = 1 .. L-1))*hypergeom([1+CS, 1], [1+C], r)):

ind := ind+1:

end do:

print(result)

[17.695        11.074      4.878      2.141      1.333     1.102     1.032      1.010    1.003    1.001]

Expected result by directly computing the series form of Lauricella function is

[108.4473    26.0417   6.2848   2.2387    1.3409  1.1025   1.0319    1.0100   1.0032   1.0010].

Axel, Your previous post was very informative, thanks, but the formula for the original case given by you seeems to be bit different from what I was trying to evaluate in the sense that expression term given by you

GAMMA(1+(C+r)*L)/GAMMA((C+r)*L+1-3*r) is actually

GAMMA(1+(C+r)*L)/GAMMA(1+(C+r)*L-r). Though I could not make out how it was obtained in your case, but the numerical values seems to be bit different.

Regarding the convergence issue, I was commenting on the behaviour of the Lauricella function output from the above method for a range of inputs, i.e. deviation at the values |x1|+|x2|+..+|xL| closer to unity. I am not sure is there some cancellation error as pointed out by you earlier but its not getting healed by increasing the precision. I have just uploaded the article for your reference [Equations 3,5,9 and 10].

Thanks a lot,

Vish

Download 8014_Some decomposition formulas.pdf
View file details

 

 

Axel Vogt's picture

I think you have some coding error

1st: avoid floats like C=1.000 if you have no real reason, try exact values.

2nd: try do use functions, it gives better structure

3rd: if having doubts and using test values, then try simple ones or just one
(which can be typed in without running a script).

4th: avoid 'displayprecision' if there is no need for it, try evalf[3]().

Hm ... and using Array (upper case) is more concurrent ...


Now again:

  a := 1: C := 1: L := 4: CS := C*L: # avoid floats ...
  
  # your formula:
  Product(
    GAMMA(1+CS)*GAMMA(1+CS+(L-n+1)*r)*Hypergeom([1+CS, 1], [1+C], r)/
      (GAMMA(r+1+CS)*GAMMA(1+CS+(L-n)*r)), n = 1 .. L-1)*
    Hypergeom([1+CS, 1], [1+C], r);  
  #simplify(%); # not really needed, can be done later ...
  value(%);
  convert(%,StandardFunctions); 
  factor(%);
  f:=unapply(%,r);

                             4   2           4
                   54 (r - 2)  (r  - 2 r + 2)  GAMMA(5 + 4 r)
         f := r -> ------------------------------------------
                                    16             4
                            (-1 + r)   GAMMA(r + 5)


Your values:

  theR:=Array(1 .. 10):
  
  ind := 1:
  for rangedb from -5 by 5 to 40 do 
    y := 10^((1/10)*rangedb); 
    R := C/y; 
    r := R/(a+L*R); #r:='r':
    theR[ind] := r; 
    ind := ind+1 
  end do:
  r:='r':

Do not forget to reset your variables ... I would do it another way.

  theR:=evala(theR);

This gives the exact values for your various r. For all of them you
claim that different results are to be given. So take one, the 2nd
is quite simple, it is r = 1/5.

  f(1/5);        # strange, what Maple does here? No, due to Gamma.
  simplify(%);
  evalf[200](%): # use high precision in case of doubts
  evalf(%);      # cut down do working precision

                             11.07390057

Thx for the paper, however I do not see your formula and the notations
in the article are quite technical, and I do not want to step into the
details there. Well, I do not even see, which coefficients and inputs
you have to use F_A in eq (1) of the paper.

However I am sure your code is not correct, i.e. Product()* 2F1 is not
what you want.


For the convergence problem (approaching abs = 1): this already occures
if working with hypergeometric series, thus Maples does not use it in
a direct, simple way.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
}