Re: NIntegrate with change of variables (discovering also a bug in Integrate!?)
- To: mathgroup at smc.vnet.net
- Subject: [mg77482] Re: NIntegrate with change of variables (discovering also a bug in Integrate!?)
- From: dimitris <dimmechan at yahoo.com>
- Date: Sun, 10 Jun 2007 07:17:28 -0400 (EDT)
- References: <f4drmk$gli$1@smc.vnet.net>
Hi.
(Adopted code from R. Gass book (1996), slightly modified and with
added comments.)
In[4]:=
Off[General::spell1]
In[5]:=
Clear[ContourIntegrate,ContourNIntegrate]
In[6]:=
ContourNIntegrate[f_(*the function
to be integrated*), par : (z_ -> g_) (*the rule z -> g is named
par;
z is the
original variable and g is the contour*), {t_, a_, b_}(*
variable and limits of integration*),
opts___(*options for NIntegrate; without setting the default are
\
used*)] := NIntegrate[Evaluate[(f /. par)*D[g, t]], {t, a, b}, opts]
In[7]:=
ContourIntegrate[f_(*the function to be integrated*), par : (z_ -> g_)
(*the
rule z -> g is named par;
z is the original variable and g
is the contour*), {t_, a_, b_}(*variable and limits of
integration*), \
opts___(*options for NIntegrate; without setting the default are
used*)] := Integrate[Evaluate[(f /. par)*D[g, t]], {t,
a, b}, opts]
The first function performs numerical contour integration; the latter
symbolic.
(*check*)
In[15]:=
ContourNIntegrate[1/z, z -> Exp[I*t], {t, -Pi, Pi}]
Out[15]=
0. + 6.283185307179586*I
In[16]:=
ContourIntegrate[1/z, z -> Exp[I*t], {t, -Pi, Pi}]
Out[16]=
2*I*Pi
In[21]:=
ContourNIntegrate[z^2/((z - 1/2)*(z - 1/3)*(z - 1/4)), z -> Exp[I*t],
{t, -Pi, Pi}, WorkingPrecision -> 40]
Out[21]=
0``29.40408430471268 +
6.28318530717958647692528676655900576839433879875`30.202264173070795*I
In[26]:=
ContourIntegrate[z^2/((z - 1/2)*(z - 1/3)*(z - 1/4)), z -> Exp[I*t],
{t, -Pi, Pi}]
N[%, 30]
Out[26]=
2*I*Pi
Out[27]=
6.28318530717958647692528676655900576839433879875`30.*I
However you should trust more the ContourNIntegrate that its symbolic
counterpart!
For example
In[29]:=
ContourNIntegrate[1/(z - 1/2), z -> Exp[I*t]*(2*Cos[t] + 1), {t, -Pi,
Pi}]
Out[29]=
0. + 12.566370614352092*I
which is correct.
The curve encricles the origin two times.
In[30]:=
ParametricPlot[{Re[Exp[I*t]*(2*Cos[t] + 1)], Im[Exp[I*t]*(2*Cos[t] +
1)]}, {t, 0, 2*Pi}]
So from the residue theorem the result of the contour integration
should be
2(2Pi) residue of 1/(z-1/2) @ 1/2.
In[33]:=
2*(2*Pi*I*Residue[1/(z - 1/2), {z, 1/2}])
N[%]
Out[33]=
4*I*Pi
Out[34]=
0. + 12.566370614359172*I
However
In[31]:=
ContourIntegrate[1/(z - 1/2), z -> Exp[I*t]*(2*Cos[t] + 1), {t, -Pi,
Pi}]
Out[31]=
(1 + 4*I)*Pi
The real part should not have been there!
Dimitris
/ chuck009 :
> Hi,
>
> I'm working on contour integrals using NIntegrate. Can I specify a transformation rule that would replace both the variable of integration as well as the differential? For example, suppose I wish to integrate f(z)dz around the unit circle, that is z=Exp[i t]. Well I could make the transformation:
>
> NIntegrate[f[z] /. z->Exp[i t],{t,-pi, pi}] but that does not replace dz with its equivalent in terms of t, that is:
>
> dz=i Exp[i t] dt
>
> The correct form to integrate would be:
>
> NIntegrate[f[Exp[i t]] i Exp[i t],{t,-pi, pi}]
>
> Is there a way to define a transformation rule that would make both those substitutions for unspecified z=g(t)?