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