Re: Re: Deleting Integrate[] transformation rule (some
- To: mathgroup at smc.vnet.net
- Subject: [mg87725] Re: [mg87680] Re: Deleting Integrate[] transformation rule (some
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Wed, 16 Apr 2008 05:03:22 -0400 (EDT)
- References: <ftq5ab$it$1@smc.vnet.net> <ftscv1$b81$1@smc.vnet.net> <ftv91s$7ur$1@smc.vnet.net> <200804150954.FAA25209@smc.vnet.net>
UHAP023 at alpha1.rhbnc.ac.uk wrote:
> Dear All,
> Some progress on my original query. I tried the following where
> the formulae below are expressions which integrate to elliptic
> integrals of the first kind and are from mathematical handbooks.
>
> Unprotect[Integrate];
>
> Integrate[1/Sqrt[1 - m_*Sin[phi_]^2], phi_] :=
> HoldForm[Integrate[1/Sqrt[1 - m*Sin[phi]^2], phi]]
>
> Integrate[1/Sqrt[(1 - v_^2)*(1 - k_^2*v_^2)], v_] :=
> HoldForm[Integrate[1/Sqrt[(1 - v^2)*(1 - k^2*v^2)], v]]
>
> Protect[Integrate];
>
>
> Subsequent attempts to integrate (eg. [Integrate[1/Sqrt[1 - a*Sin[b]^2],
> b]) do indeed leave the integral undone as required. However more
> involved expressions such as;
>
> In[52]:=
> Integrate[Sqrt[Rvt^2 + (4*R^4)/Rx^4], R] // InputForm
>
> Out[52]//InputForm=
> (R*Sqrt[Rvt^2 + (4*R^4)/Rx^4])/3 -
> (I/3*Sqrt[2]*Rvt^2*Sqrt[Rvt^2 + (4*R^4)/Rx^4]*
> Sqrt[1 - (2*I*R^2)/(Rvt*Rx^2)]*
> Sqrt[1 + (2*I*R^2)/(Rvt*Rx^2)]*Rx^4*
> EllipticF[I*ArcSinh[Sqrt[2]*R*Sqrt[I/(Rvt*Rx^2)]],
> -1])/(Sqrt[I/(Rvt*Rx^2)]*(4*R^4 + Rvt^2*Rx^4))
>
> still produce the unwanted EllipticF[]. My question is, is this; (a)
> because my above HoldForm[] argument expressions are failing to
> pattern-match the intermediate expressions produced by Integrate[], which
> it then uses to produce results containing calls to EllipticF[], (b)
> because Mathematica knows more expressions than I entered above
> from my handbook which it can integrate up to EllipticF[], or
> (c) something else?
>
> Any ideas?
>
> Thanks
> Tom.
>
> Ps. The Email address in the header is just a spam-trap.
If you are not averse to using a global flag variable, you can do it as
follows.
Unprotect[Integrate];
globalIntegrateFlag = True;
Integrate[args__] := Block[
{globalIntegrateFlag=False, res},
res = Integrate[args];
If [FreeQ[res,EllipticF], res, HoldForm[Integrate[args]]]
] /; globalIntegrateFlag===True
Examples:
In[7]:= InputForm[Integrate[1/Sqrt[1 - m*Sin[phi]^2], phi]]
Out[7]//InputForm= HoldForm[Integrate[1/Sqrt[1 - m*Sin[phi]^2], phi]]
In[8]:= Integrate[1/Sqrt[1 - phi^2], phi]
Out[8]= ArcSin[phi]
(Even if you are averse to using a global variable, you can still do it
that way; you'll just be less comfortable with it.)
Daniel Lichtblau
Wolfram Research
- References:
- Re: Deleting Integrate[] transformation rule (some progress)
- From: UHAP023@alpha1.rhbnc.ac.uk
- Re: Deleting Integrate[] transformation rule (some progress)