Code covered by the BSD License

### Highlights from MeijerG

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

# MeijerG

### Damith Senaratne (view profile)

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

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.
19 Feb 2012 noosa

### noosa (view profile)

Hi Damith,

Comment only
16 Feb 2012 Damith Senaratne

### Damith Senaratne (view profile)

@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.

Comment only
16 Feb 2012 noosa

### noosa (view profile)

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 !

Comment only
16 Feb 2012 noosa

### noosa (view profile)

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 !

Comment only
14 Feb 2012 Damith Senaratne

### Damith Senaratne (view profile)

@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.

Comment only
14 Feb 2012 noosa

### noosa (view profile)

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 !

Comment only