Code covered by the BSD License  

Highlights from
MeijerG

Be the first to rate this file! 7 Downloads (last 30 days) File Size: 2.47 KB File ID: #32549

MeijerG

by

 

A wrapper for MATLAB symbolic library implementation of the 'MeijerG' G^{m,n}_{p,q}(...|z) function.

| Watch this File

File Information
Description

A wrapper for MATLAB symbolic library implementation of the 'MeijerG' G^{m,n}_{p,q}(...|z) function.

Syntax : MeijerG({[a_1,...a_n],[a_n+1,...a_p]},{[b_1,...b_m], [b_m+1,...b_q]},z)

Input arguments :
a - {[a_1,...a_n],[a_{n+1},...a_p]}
b - {[a_1,...a_m],[a_{m+1},...a_q]}
z - matrix of (possibly complex) numbers

Output:
y - has same dimensions as 'z'

1.) For invalid arguments, 'double' function for converting results back from symbols would return an error. 'MeijerG' catches the error, displays a warning, and sets corresponding position of 'y' to 'nan'.

2.) 'double' to 'string' conversion used for forming the symbolic expressions causes a precision loss, and possibly, round of errors.

3.) Sometimes, even the slightest changes to arguments could produce unacceptable results.
e.g.
>> MeijerG({[1,1], []},{1, 1},[1,2,3])
ans =
   NaN 0.666666666666667 0.750000000000000
>> MeijerG({[1,1], []},{1, 1},[1+1e-5,2,3])
ans =
   0.500002499987500 0.666666666666667 0.750000000000000
Here the second result appears correct, since MeijerG({[1,1], []},{1, 1},z ) = z/(z+1).
Please let me know if such issues can be circumvented.

Required Products Symbolic Math Toolbox
MATLAB release MATLAB 7.10 (R2010a)
Other requirements Tested with MATLAB 2008a, 2009b, 2010a and 2011a.
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (6)
19 Feb 2012 noosa

Hi Damith,
Thank you very much for your answers, they are very helpful for me.

16 Feb 2012 Damith Senaratne

@noosa,
There should be ways around the problem. But I cannot say which one will work for you.

1. There may be a simple fix because you already know that MeijerG output is probably wrong for k=1. I am assuming your mathematical expressions are correct (please double check to make sure k=1 is a valid value).

Since most of the functions we deal with are smooth, you can add a small perturbation to the arguments of MeijerG (as I have done with argument 1 in the example) . Try k = 1 + some delta (e.g. 1e-5). You cannot make delta arbitrarily small because of the lower precision. But you should be able to find a reasonably small value that gives acceptable results. The problem could be with a different parameter of MeijerG and not k. If so, you'll have to follow a trial and error approach.

2. Does your MeijerG compute only a mere factor in each term of a summation? If so the problem could be the terms not getting properly canceled out because of lower precision of MeijerG output. You can check the value each term of the summation evaluates to and detect if that's the case. Solution is not straightforward. You'd probably have to reformulate the expression to avoid the problem.

Hope my answer helps.

16 Feb 2012 noosa

Thank you Damith, I am also using the function for wireless performance analysis, but I got huge numbers with .10^25 :(((
Then I often get this error:
Warning: MeijerG: failed evaluating for k = 1
> In MeijerG at 85

It can influence the result? Or may it could be the reason of why I got huge numbers?
Thank you very much !

16 Feb 2012 noosa

Then I often get this error:
Warning: MeijerG: failed evaluating for k = 1
> In MeijerG at 85

It can influence the result? Or may it could be the reason of why I got huge numbers?
Thank you very much !

14 Feb 2012 Damith Senaratne

@noosa,
I haven't rigorously checked the output against maple or MATHEMATICA. However, I have tested the function with couple of examples. I have also used it to compute certain analytic (wireless communication) performance analysis results, and found them to agree with corresponding simulated values. But it is difficult to tell if the function produces accurate results all the time. The function merely invokes the MATLAB symbol engine (maple or mupad depending on the MATLAB version). So it shouldn't introduce errors, other than those caused in 'double'->'string' conversion.
Since you asked, I just tried my example on maple. The output I got (given below) seems to be consistent with what MATLAB function produces.

> evalf(MeijerG([[1, 1], []], [[1], [1]], 1));
MeijerG([[1.], []], [[1.], []], 1.)
> evalf(MeijerG([[1, 1], []], [[1], [1]], 2));
0.6666666667
> evalf(MeijerG([[1, 1], []], [[1], [1]], 3));
0.7500000001
> evalf(MeijerG([[1, 1], []], [[1], [1]], 1.00001));
0.5000025000 + 0. I

Hope this helps.

14 Feb 2012 noosa

I used your function in my code but it seems to give huge numbers ! please are you sure of output results? I mean did you compare some results with those given by maple for example?
Thank you !

Contact us