home *** CD-ROM | disk | FTP | other *** search
-
- (****************************************************************************
- * Evaluation Multiple Poles Meijer's G-function
- *
- *****************************************************************************)
-
- (* HISTORY:
- This code used for evaluation poles Meijer's G-function in the
- following cases:
- a) finite number of multiple poles any order;
- b) infinite number of first order poles.
-
- In October 1991 was added some code to evaluate
- c) infinite number of second order poles.
-
- *)
-
-
- MeijerLogCase[parn_,parp_,parm_,parq_,z_ ] :=
- Module[ {answer={},grpoles,grzero,i},
- grpoles = FindGroupsPoles[ parm ];
- For[ i=1,i<=Length[grpoles],i++,
- grzero = OneGroupZero[ grpoles[[i,1]],parp,{} ][[3]];
- If[ Length[grzero] != 0,
- answer = Append[answer,OrderPoles[
- Join[ Map[ {#,1}&, grpoles[[i]] ],
- Map[ {#,-1}&,grzero ]]]],
- answer = Append[answer,OrderPoles[
- Map[ {#,1}&, grpoles[[i]] ]]]
- ]
- ];
- answer =
- Apply[ Plus,Map[
- EvalResidues[#,parn,parp,parm,parq,z/.arg->Arg]&,CountMultiple[answer] ] ];
- answer
- ]
-
-
- FindGroupsPoles[v_] := OneGroup[ v[[1]], Rest[v], {v[[1]]} ]
-
- FindGroupsPoles[v_] := {} /; Length[v] == 0
-
- OneGroup[ a_,{v1___,b_,v2___},c_ ] :=
- OneGroup[ a, {v1,v2}, Append[c,b] ] /; IntegerQ[Expand[a-b]]
-
- OneGroup[ a_,b_,c_ ] := Append[ FindGroupsPoles[b],c ]
-
- OneGroupZero[ a_,{v1___,b_,v2___},c_ ] :=
- OneGroupZero[ a, {v1,v2}, Append[c,b] ] /; IntegerQ[Expand[a-b]]
-
-
- OrderPoles[{c1___,a_,c2___,b_,c3___}] :=
- OrderPoles[{c1,b,c2,a,c3}] /; Expand[a[[1]]-b[[1]]] > 0
-
- OrderPoles[{c___}] := {c}
-
- CountMultiple[ v_ ] := Flatten[ Map[CountInGroup[#]&,v],1 ]
-
-
- CountInGroup[v_] :=
- Module[ {u=v,kr=0,answer={}},
- While[ Length[u] !=0,
- If[ u[[1,2]] == 1, kr += 1, kr -= 1 ];
- If[ kr > 0,
- If[Length[Rest[u]] != 0,
- PrependTo[answer,{kr,Expand[u[[2,1]]-u[[1,1]]],-u[[1,1]]}],
- If[ kr == 1,
- PrependTo[ answer, {kr,"Infinity",u[[1,1]]} ],
- If[ kr == 2,
- PrependTo[answer,{kr,"Infinity",u[[1,1]],
- answer[[1,2]]} ],
- answer = FailInt; u = {FailInt}
- ]
- ]
- ]
- ];
- u = Rest[u] ];
- answer
- ]
-
-
- EvalResidues[{1,"Infinity",at_},parn_,parp_,parm_,parq_,z_] :=
- If[MemberQ[parm,at],
- FinalGfunToHyper1[
- at,parn,parp,First[ReducePar[parm,{at}]],parq,z],
- SpecialTransf[at,
- parn,Append[parp,at],Append[parm,at],parq,z,1]
- ]
-
- FinalGfunToHyper1[ at_, n_,{v3___,a_,v4___},{v1___,b_,v2___},q_,z_ ] :=
- (-1)^(a-b) *
- FinalGfunToHyper[ at, Join[n, {a}],{v3,v4},{v1,v2},Join[q,{b}],z ] /;
- IntegerQ[a-b] && Positive[a-b]
-
- FinalGfunToHyper1[ w__ ] := FinalGfunToHyper[w]
-
- EvalResidues[{2,"Infinity",at_,m_},parn_,parp_,parm_,parq_,z_] :=
- If[ MemberQ[parm,at],
- SecondOrder[ at,m,Complement[parm,{at,at-m}],1-parn,parp,1-parq,z],
- SpecialTransf[at,parn,Join[parp,{at,at}],
- Join[parm,{at,at}],parq,z,2]
- ]
-
- SpecialTransf[at_,parn_,{v1___,b_,v2___},{v3___,a_,v4___},parq_,z_,k_] :=
- (-1)^(b-a) SpecialTransf[at, Append[parn,b],{v1,v2},{v3,v4},
- Append[parq,a],z,k ] /;
- IntegerQ[Expand[b-a]] && Expand[b-a] > 0
-
-
- SpecialTransf[at_,parn_,parp_,parm_,parq_,z_,k_] :=
- Module[ {r},
- r = ReducePar[parn,parq];
- If[ k==1,
- FinalGfunToHyper[
- at,r[[1]],parp,First[ReducePar[parm,{at}]],r[[2]],z],
- SecondOrder[ at,0,Complement[parm,{at,at}],
- 1-r[[1]],parp,1-r[[2]],z],
- ]
- ]
-
- EvalResidues[{order_,0,at_},__] := 0
-
- EvalResidues[{order_,1,at_},parn_,parp_,parm_,parq_,z_] :=
- Module[ {rr,eps},
- rr =
- Apply[ Times,
- Map[GammaRes[#,-eps,order]&,1-parn-at] ] *
- Apply[ Times,
- Map[GammaRes[#, eps,order]&, parm+at ] ] *
- Apply[ Times,
- Map[GammaResInv[#, eps,order]&, parp+at ] ] *
- Apply[ Times,
- Map[GammaResInv[#,-eps,order]&,1-parq-at] ] *
- Series[Exp[-eps Log[z]],{eps,0,order-1}] z^(-at);
- Coefficient[ rr,eps,Exponent[rr,eps] ]
- ]
-
- EvalResidues[{order_,k_Integer/;k>1,at_},parn_,parp_,parm_,parq_,z_] :=
- Sum[ EvalResidues[{order,1,at-j},parn,parp,parm,parq,z],
- {j,0,k-1} ]
-
- GammaRes[u_Integer/;u<=0,e_,1] :=
- SeriesData[e, 0, {1/((-1)^u*Gamma[1 - u])}, 0, 1, 1]
-
- GammaRes[u_Integer/;u<=0,e_,2] := SeriesData[e, 0, {1/((-1)^u*Gamma[1 - u]),
- PolyGamma[0, 1 - u]/((-1)^u*Gamma[1 - u])}, 0, 2, 1]
-
- GammaRes[0,e_,n_] := GammaRes[1,e,n]
-
- GammaRes[u_Integer/;u<0,e_,n_] :=
- (-1)^(-u) GammaRes[1,e,n] GammaRes[1,-e,n] GammaResInv[1-u,-e,n]
-
- GammaRes[u_,e_,n_] := Series[Gamma[u+e],
- {If[Head[e] === Symbol,e,-e],0,n-1}]
-
- GammaResInv[u_,e_,n_] := Series[1/Gamma[u+e],
- {If[Head[e] === Symbol,e,-e],0,n-1}]
-
- SecondOrder[ at_, m_, a_, b_, c_, d_, z_ ] :=
- Module[ { const },
- const = z^at (-1)^m *
- SimplifyGamma[Times@@(MultGamma[#]&/@{a-at,b+at})/(
- Times@@(MultGamma[#]&/@{c-at,d+at}) m!)];
- -const Log[z] *
- HyperInteg[ Join[b+at,1+at-c],Join[d+at,1+at-a,{m+1}],
- (-1)^(Length[c]-Length[a]) z ]
- +
- const *
- sum@@{ ((-1)^If[EvenQ[Length[c]-Length[a]],0,1] z)^dummy/dummy! *
- Times@@(MultPochham[#,dummy]&/@{b+at,1+at-c})/(
- Times@@(MultPochham[#,dummy]&/@{d+at,1+at-a,{m+1}}) ) *
- Expand[ SimplifyPolyGammaS[dummy,
- Plus@@(PolyGamma[0,#]&/@Expand[d+at+dummy]) -
- Plus@@(PolyGamma[0,#]&/@Expand[b+at+dummy]) -
- Plus@@(PolyGamma[0,#]&/@Expand[c-at-dummy]) +
- Plus@@(PolyGamma[0,#]&/@Expand[a-at-dummy]) +
- PolyGamma[0,1+m+dummy] + PolyGamma[0,1+dummy] ] ],
- {dummy, 0, Infinity}}
- ]
-
- SimplifyPolyGammaS[ l_, expr_ ] :=
- Module[ { r = SimplifyPolyGamma[expr] },
- If[ FreeQ[r,PolyGamma[0,a_. + b_?Negative l]],
- r,
- r/.PolyGamma[0,a_. + b_?Negative l]:>
- PolyGamma[0,-a-b l]-1/Factor[a+b l]-Pi Cot[Expand[Pi (a+b l)]]
- ]/.
- { Cot[r_ + p_ l] :> Cot[r]/; FreeQ[r,l] && Abs[p]==Pi,
- Cot[p_ l] :> 0,
- Tan[r_. + p_ l] :> Tan[r]/; FreeQ[r,l] && Abs[p]==Pi
- }
- ]
-
-