Re: global assumptions?? How far can I go?
- To: mathgroup at smc.vnet.net
- Subject: [mg53461] Re: global assumptions?? How far can I go?
- From: Maxim <ab_def at prontomail.com>
- Date: Wed, 12 Jan 2005 03:41:44 -0500 (EST)
- References: <criro8$s75$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Here are a few more observations related to using assumptions. Some older
functions like Sum and Product don't generate conditional output, except
in some rare cases:
In[1]:=
Assuming[a >= 0, Product[k^a, {k, Infinity}]]
Out[1]=
If[Re[a] >= 0, Infinity, 0]
Since Sum and Product cannot really use assumptions, Assuming has no
effect in this example. Besides, the result is incorrect for a == 0.
Limit currently seems to be at an intermediate stage -- it has the option
Assumptions but it cannot generate conditional output, which means that
unless 'useful' assumptions are supplied to Limit it will simply return
unevaluated:
In[2]:=
Limit[x^a, x -> 0]
Assuming[a > 0, Limit[x^a, x -> 0]]
Out[2]=
Limit[x^a, x -> 0]
Out[3]=
0
Series takes the option Assumptions as well, which can be useful in
conjunction with the new capability of Series to generate a kind of
generalized expansion for points on branch cuts:
In[1]:=
(*restart the kernel*)
Assuming[Arg[(2 + x)*I - 2*I] == Pi/2,
Series[ArcTan[(2 + x)*I], {x, 0, 1}]]
Series[ArcTan[(2 + x)*I], {x, 0, 1}]
Series[ArcTan[(2 + x)*I], {x, 0, 1}, Assumptions -> True]
Out[1]=
SeriesData[x, 0, {I*ArcTanh[2], -I/3}, 0, 2, 1]
Out[2]=
SeriesData[x, 0, {I*ArcTanh[2], -I/3}, 0, 2, 1]
Out[3]=
Pi*(Floor[(Pi - 2*Arg[-2*I + I*(2 + x)])/(4*Pi)] + Floor[(Pi + 2*Arg[-2*I
+ I*(2 + x)])/(4*Pi)]) + SeriesData[x, 0, {I*ArcTanh[2], -I/3}, 0, 2, 1]
We can see that Out[3] contains SeriesData plus extra terms used to
determine the position of the point with respect to the branch cut. There
is a glitch in Series though: the first call to Series resets the value of
the option Assumptions of Series, so In[2] still uses the assumptions from
In[1]. If we evaluate In[2] after restarting the kernel, we get a result
identical to Out[3].
However, adding extra terms or factors depending on Arg[x] still fails for
nested discontinuous functions:
In[4]:=
Series[ArcTan[2*I*ArcTan[x]/ArcTan[2*I]], {x, 2*I, 0}]
Out[4]=
Pi*(Floor[(Pi - 2*Arg[-2*I + (2*(Pi*(Floor[(Pi - 2*Arg[-2*I + x])/(4*Pi)]
+ Floor[(Pi + 2*Arg[-2*I + x])/(4*Pi)]) + SeriesData[x, 2*I,
{I*ArcTanh[2]}, 0, 1, 1]))/ArcTanh[2]])/(4*Pi)] + Floor[(Pi + 2*Arg[-2*I
+ (2*(Pi*(Floor[(Pi - 2*Arg[-2*I + x])/(4*Pi)] + Floor[(Pi + 2*Arg[-2*I
+ x])/(4*Pi)]) + SeriesData[x, 2*I, {I*ArcTanh[2]}, 0, 1,
1]))/ArcTanh[2]])/(4*Pi)]) + SeriesData[x, 2*I, {I*ArcTanh[2]}, 0, 1, 1]
For x close to 2*I, the result is indeterminate if Re[x] >= 0 and doesn't
agree with ArcTan[2*I*ArcTan[x]/ArcTan[2*I]] if Re[x] < 0. If we increase
the order of the expansion, the result will be correct for some (not all)
values of x such that Re[x] >= 0 and still wrong for Re[x] < 0. I don't
think that this is a bug, more likely it just shows that this method of
using Arg[x] in the series expansion still has limitations.
It is possible to pass conditions that contain patterns to Refine;
however, an assumption such as _ > 0 is contradictory -- it implies that x
> 0 and -x > 0 at the same time, and if we try to make the pattern more
specific, then Refine[t > 0, _Symbol > 0] just crashes the Mathematica
kernel. More importantly,
Integrate[1/x^2, {x, 1, t}] // Refine[#, t < 0]&
makes Mathematica 5.1 go into infinite loop: the computation takes several
minutes after which Mathematica generates $IterationLimit::aitlim warning
and returns the If expression unevaluated.
Maxim Rytin
m.r at inbox.ru