"Can someone confirm that one cannot express a product of two 
G-functions as a G-function? "
Roundabout but:
If one has the G-function expression for the Mellin transform of the 
convolution of two functions then the inverse Mellin operator applied to it 
would yield the G-function for the product?
I am not an expert in sympy or G-functions; just working my way through
"The Double Mellin-Barnes Type Integrals and Their Applications to 
Convolution Theory"
and sometimes wandering around in my mind.
RayR


On Wednesday, January 27, 2016 at 5:34:26 PM UTC-5, Ondřej Čertík wrote:
>
> Hi, 
>
> Our Meijer G-function integrator can find integrals (definite and 
> indefinite) of any function that can be expressed as a Meijer 
> G-function thanks to the formulas here: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/MeijerG/21/ShowAll.html 
>
> I.e. an integral of a Meijer G-function is also a Meijer G-function. 
> The definite integral has tons of conditions that SymPy checks, but 
> the formula for the indefinite integral (i.e. the antiderivative) 
> always holds. 
>
> Then one converts the final Meijer G-function into elementary 
> functions if possible, or leaves it as is if it is not possible. This 
> part is robust. 
>
> What is not robust is how to rewrite a given function into a Meijer 
> G-function. This is done by the `meijerint._rewrite1` function (btw, 
> we should expose it as a public function). For example: 
>
> In [1]: meijerint._rewrite1((cos(x)/x), x) 
> Out[1]: (1, 1/x, [(sqrt(pi), 0, meijerg(((), ()), ((0,), (1/2,)), 
> x**2/4))], True) 
>
> In [2]: meijerint._rewrite1((sin(x)/x), x) 
> Out[2]: (1, 1/x, [(sqrt(pi), 0, meijerg(((), ()), ((1/2,), (0,)), 
> x**2/4))], True) 
>
> In [3]: meijerint._rewrite1((cos(x)/x)**2, x) 
>
> In [4]: meijerint._rewrite1((sin(x)/x)**2, x) 
> Out[4]: 
> (1, 
>  x**(-2), 
>  [(sqrt(pi)/2, 0, meijerg(((0,), (1/2, 1/2, 1)), ((0, 1/2), ()), 
> x**(-2)))], 
>  True) 
>
> In [3] it didn't find the solution, yet a similar expression involving 
> sin(x) instead of cos(x) works in [4]. 
>
> Let's figure out a systematic algorithm. For that, you start with the 
> elementary functions, that would be sin(x), cos(x) and "x" in the 
> above expression, look their G-function representation, and then use 
> the *, /, +, - and ** operations on the G-functions, that's it. 
>
> Now the problem is, that there doesn't seem to be a formula for a 
> product of two G functions, e.g. I didn't see one here: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/MeijerG/16/ShowAll.html 
>
> the formula 
> http://functions.wolfram.com/HypergeometricFunctions/MeijerG/16/02/01/0001/ 
> that you see there only seems to be using some even more generalized G 
> function of two variables? It doesn't seem to be useful here. Can 
> someone confirm that one cannot express a product of two G-functions 
> as a G-function? 
>
> So a solution is to simply have a robust method to rewrite any 
> expression as a hypergeometric function and then use the formula here 
> to convert the hypergeometric function to a G-function: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/HypergeometricPFQ/26/03/01/0001/
>  
>
> There are just a few functions that can be expressed as a G-function 
> but not as a hypergeometric function, some examples are: Bessel 
> functions Y, K (for integer order), Whittaker function W, Legendre 
> function Q_mu_nu and a few others. So for these functions we have to 
> figure out something else, probably something that we do now. 
>
> Also we can then use the integration formulas here for hypergeometric 
> functions, so we don't even have to go via G-functions: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/HypergeometricPFQ/21/ShowAll.html
>  
>
> It seems the conditions on definite integration are a lot simpler as well. 
>
>
> So here is the algorithm for hypergeometric functions, I'll show it on 
> the (sin(x)/x)**2 example above: 
>
> 1) sin(x) = x * 0F1(3/2; -x^2/4) 
>
> 2) sin(x) / x = 0F1(3/2; -x^2/4) 
>
> 3) (sin(x)/x)**2 = 0F1(3/2; -x^2/4) * 0F1(3/2; -x^2/4) = 2F3(3/2,1; 
> 3/2,3/2,2; -x^2) 
>
> Where we used the formula for a product of two 0F1 functions: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/Hypergeometric0F1/16/ShowAll.html
>  
>
> 4) Finally, rewrite 2F3(3/2,1; 3/2,3/2,2; -x^2) as a G-function, or 
> integrate directly. 
>
>
> A general formula for multiplication of two hypergeometric series is here: 
>
>
> http://functions.wolfram.com/HypergeometricFunctions/HypergeometricPFQ/16/ShowAll.html
>  
>
> But I can see now that this only expresses the result as a Taylor 
> series. So maybe I just got lucky that the multiplication of two 0F1 
> functions exists (in terms of 2F3), but there is no such formula for a 
> general PFQ function. Can someone confirm this? 
>
> So then the other idea is that one can identify a hypergeometric 
> function from the series expansion. Essentially, we expand into a 
> series, calculate the ratio t_{k+1}/t_k of two successive terms, and 
> if it is a rational function of "k", then it is a hypergeometric 
> function and you read the coefficients directly. Let's do the same 
> example again: 
>
> 1) sin^2(x) = Sum(((-1)**(k - 1)* 2**(2* k - 1)* 
> x**(2*k))/factorial(2*k), (k, 1, oo)) 
>
> 2) (sin(x)/x)**2 = sin^2(x)/x^2 = Sum(((-1)**(k - 1)* 2**(2* k - 1)* 
> x**(2*k-2))/factorial(2*k), (k, 1, oo)) 
> = Sum(((-1)**k * 2**(2*k+1) * x**(2*k))/factorial(2*k+2), (k, 0, oo)) 
> = Sum((2**(2*k+1) * (-x**2)**k))/factorial(2*k+2), (k, 0, oo)) 
>
> So the series is of the form sum_k t_k*(-x^2)^k where 
>
> t_k = 2**(2*k+1)/factorial(2*k+2) 
>
> 3) Calculate t_{k+1} / t_k: 
>
> In [78]: t_k = 2**(2*k+1)/factorial(2*k+2) 
>
> In [79]: t_k.subs(k, k+1) / t_k 
> Out[79]: 2**(-2*k - 1)*2**(2*k + 3)*factorial(2*k + 2)/factorial(2*k + 4) 
>
> In [80]: _.simplify() 
> Out[80]: 2/((k + 2)*(2*k + 3)) 
>
> We write the last formula as: 
>
> 2/((k + 2)*(2*k + 3)) =  (k+1) / ((k+3/2)*(k+2)*(k+1)) 
>
> And we read off the hypergeometric function as 1F2(1; 3/2, 2; -x^2). 
>
> One can verify that we got the same answer as before: 
>
> In [64]: hyperexpand(hyper([1], [S(3)/2, 2], -x**2)) 
> Out[64]: 
>   cos(2⋅x)    1 
> - ──────── + ──── 
>        2        2 
>     2⋅x      2⋅x 
>
> In [65]: hyperexpand(hyper([S(3)/2, 1], [S(3)/2, S(3)/2, 2], -x**2)) 
> Out[65]: 
>   cos(2⋅x)    1 
> - ──────── + ──── 
>        2        2 
>     2⋅x      2⋅x 
>
>
> And both are actually equal to (sin(x)/x)^2: 
>
> In [75]: (_ - (sin(x)/x)**2).simplify() 
> Out[75]: 0 
>
>
> One can see, that one should use the exact series expansion, what is 
> the status of that, I think we had a GSoC on it? 
>
>
> It might be, that all the operations that I am doing on the series 
> have an equivalent operation on the hypergeometric series. 
>
> In conclusion, the logic is simple: either the product or power of 
> hypergeometric functions exists as a hypergeometric function for the 
> given set of coefficients (like above) and then there must be an 
> automated way to determine the final hypergeometric function (in the 
> worst case by calculating the t_{k+1}/tk ratio like I did above), or 
> the answer can't be expressed as a hypergeometric function (i.e. when 
> the t_{k+1}/tk ratio is not a rational function of "k"), and then the 
> answer is that there is no hypergeometric function that represents the 
> result, and so we can't integrate it using this method and that's 
> fine. 
>
> Let me know what you think. 
>
>
> This was motivated by https://github.com/sympy/sympy/issues/10464. 
>
> Ondrej 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/e888a92b-1fea-4ddb-bea7-ac74915e5360%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to