Re: Re: AW: Re: Nasty bug in Integrate (version 5.0)
- To: mathgroup at smc.vnet.net
- Subject: [mg46004] Re: [mg45980] Re: AW: [mg45958] Re: Nasty bug in Integrate (version 5.0)
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Mon, 2 Feb 2004 05:20:53 -0500 (EST)
- References: <CGEPLKMMCCOGKJGLHEKNIEBECBAA.klamser@t-online.de> <200401311020.FAA26947@smc.vnet.net> <18FE0872-5410-11D8-BA09-00039311C1CC@mimuw.edu.pl> <opr2nt00pwamtwdy@smtp.cox-internet.com>
- Sender: owner-wri-mathgroup at wolfram.com
Not only is it not correct for all values of the parameters but I am not convinced that obtaining reliably answers which are correct for this sort of problems is possible with the present technology. Moreover, even in the case of simple examples they tend to become awfully complicated. I am inclined to think that the default setting for GenerateConditions ought to the False. What I intended to indicate to in my original reply was that the person who posted the message did not make clear what he wanted: to report a bug or to find a way to solve his problem, and if the latter, then what sort of answer he wanted. If he wanted the answer one gets by setting GenerateConditions->False then that's the best way to do it (or by simply computing the indefinite integral, which is in fact what I would do). If he really wants the know the full conditions for convergence than I think at present it is too much to expect of a computer program. In fact in this situation the "simple" problem (finding the indefinite integral) is almost too simple to use Mathematica (of course I have nothing against anyone doing this) while the "difficult" problem (finding the complete set of conditions for convergence) seems too difficult. The bug in RealDigits looks to me like just a bug so I have nothing to say about that. Andrzej On 31 Jan 2004, at 22:59, Dr Bob wrote: > Perhaps we're still misunderstanding each other. (I know we were > before.) > > Didn't my tests below (using differentiation) show that the more > complicated, conditional answer is incorrect for some values of the > constants? Or am I still missing something? > > If the answer isn't fully correct, I don't mean that as a condemnation > of Mathematica. I'm trying to get at how we check answers, which I > agree we'll have to do for the foreseeable future. > > There's a new bug in RealDigits, by the way... did you see that in the > recent thread? > > Bobby > > On Sat, 31 Jan 2004 18:08:32 +0100, Andrzej Kozlowski > <akoz at mimuw.edu.pl> wrote: > >> You seem to have misunderstood what I meant when I wrote that one >> should not try do problems which are easier to do by had by using >> computers. I do not feel like writing a whole essay about this topic >> so I will just rephrase in a rather banal way: there are problems >> more suited to computers and there are problems more suited to >> working "by hand"? Do you doubt this? Will you try to compute by hand >> the number of, say, pairs of Goldbach primes less than 10^6? Or are >> you going to use Mathematica to verify the proof of the Poincare >> conjecture? In the example at hand, one is using Mathematica to >> determine limits for the convergence of a definite integral with >> symbolic limits. Computer programs are not very good at this >> (admittedly neither are people, though some are better than others). >> Starting version 5 WRI has decided to try to give Mathematica the >> ability to answer some of such question by means of conditional >> answers. In the old days I defended the old approach (like the one >> you get in 4.2) on several occasions since I believe that the >> "technology" to make the new approach reliable does not exist and the >> answers that one gets tend to be too complicated to be useful. But at >> least you can always turn this new ability off with the option >> GenerateConditions->False. >> The real question here is what did the person who asked the original >> question ("Math User") want? If he wanted to get the simple answer >> that Mathematica 4.2 returned than he should either do it by hand, >> use Indefinite integration or >> >> Integrate[1/x+x^c,{x,a,b},GenerateConditions->False] >> >> (-a^(1 + c) + b^(1 + c))/(1 + c) - Log[a] + Log[b] >> >> (Note that I am using Mathematica 5.0 , not 5.1 and I get the same >> answer as 4.2 returns and not the wrong answer 5.0 gives without the >> GenerateConditions->False option.) >> >> If on the other hand "Math User" really wanted to see the conditions >> for convergence of this integral (and I somehow doubt that this is >> what was wanted) then I think it is better to either try it by hand >> or consult a human expert in this area. >> >> Andrzej Kozlowski >> >> >> On 31 Jan 2004, at 11:20, Dr Bob wrote: >> >>> Of course there's no error-free software, but did I miss something? >>> You >>> talked about proving results are errorfree, but all you did is show a >>> couple of answers. Which is correct, and based on what? Visual >>> inspection? >>> (If that's always enough, why do we need Mathematica?) >>> >>> To check an integration, you need to differentiate, so let's try >>> that in >>> 5.0.1, shall we? First, here's the integrand, and we integrate it >>> (I'm not >>> showing the result). >>> >>> f[x_] = 1/x + x^c; >>> fiveOhOne = Integrate[f[x], {x, a, b}]; >>> >>> The derivative of fiveOhOne at x==a should be -f[a]. The derivative >>> at >>> x==b should be f[b]. So let's try at b, for now. Is the derivative >>> correct >>> at b? >>> >>> FullSimplify[D[fiveOhOne, b] == f[b]] >>> >>> If[(Im[a] - Im[b])* >>> ((-Im[b])*Re[a] + >>> Im[a]*Re[b]) > 0 || >>> Im[b]/(Im[a] - Im[b]) >= >>> 0 || Im[a]/(-Im[a] + >>> Im[b]) >= 0, >>> (a^(1 + c) - b^(1 + c) + >>> Log[a] + c*Log[a] - >>> Log[b] - c*Log[b])/ >>> ((a - b)*(1 + c)), >>> Integrate[ >>> 1/(a + (-a + b)*x) + >>> (a + (-a + b)*x)^c, >>> {x, 0, 1}, >>> Assumptions -> >>> !((Im[a] - Im[b])* >>> ((-Im[b])*Re[a] + >>> Im[a]*Re[b]) > 0 || >>> Im[b]/(Im[a] - >>> Im[b]) >= 0 || >>> Im[a]/(-Im[a] + >>> Im[b]) >= 0)]] + >>> (-a + b)* >>> If[(Im[a] - Im[b])* >>> ((-Im[b])*Re[a] + >>> Im[a]*Re[b]) > 0 || >>> Im[b]/(Im[a] - >>> Im[b]) >= 0 || >>> Im[a]/(-Im[a] + >>> Im[b]) >= 0, >>> (-(1/b) - c/b - >>> b^c*(1 + c))/ >>> ((a - b)*(1 + c)) + >>> (a^(1 + c) - >>> b^(1 + c) + Log[a] + >>> c*Log[a] - Log[b] - >>> c*Log[b])/((a - b)^2* >>> (1 + c)), Integrate[ >>> -(x/(a + (-a + b)*x)^ >>> 2) + c*x* >>> (a + (-a + b)*x)^ >>> (-1 + c), {x, 0, 1}, >>> Assumptions -> >>> !((Im[a] - Im[b])* >>> ((-Im[b])*Re[a] + >>> Im[a]*Re[b]) > 0 || >>> Im[b]/(Im[a] - >>> Im[b]) >= 0 || >>> Im[a]/(-Im[a] + >>> Im[b]) >= 0)]] == >>> 1/b + b^c >>> >>> Hmm.... maybe that's correct. Maybe not. How can I be sure? >>> >>> The following shows it isn't correct for ALL a,b, and c, but it >>> leaves >>> open the question of where the error might be. It may be correct for >>> all >>> other combinations of b and c, for all I know. >>> >>> Simplify[D[fiveOhOne, b] == >>> f[b] /. {b -> 0.1, >>> c -> 1}] >>> % /. a -> 0 >>> 1/(-0.1 + 1.*a) == 0 >>> False >>> >>> Setting b only (for every value I've tried) confirms the result: >>> >>> Simplify[D[fiveOhOne, b] == f[b] /. {b -> 2.1}] >>> True >>> >>> Similarly, setting a only seems to confirm the result, if I choose >>> a>=1 or >>> a==1/2 (apparently). >>> >>> FullSimplify[D[fiveOhOne, a] == -f[a] /. {a -> 1}] >>> True >>> >>> But it fails for lots of other a values. So there must be b values I >>> should have tried but didn't. It's a hit-or-miss operation. >>> >>> The 4.2 integral checks out easily: >>> >>> fourTwo = -((a^(1 + c) - >>> b^(1 + c) + Log[a] + >>> c*Log[a] - Log[b] - >>> c*Log[b])/(1 + c)); >>> Simplify[D[fourTwo, a] + f[a]] >>> Simplify[D[fourTwo, b] - f[b]] >>> 0 >>> 0 >>> >>> But it can be far more complicated, even with a correct answer. >>> Simplify >>> can't always identify expressions that resolve to zero. >>> >>> It makes no sense to say "don't use a computer algebra program for >>> things >>> you can do by hand", when the other kind can't always be checked for >>> accuracy. That leaves us doing EVERYTHING by hand. >>> >>> It makes more sense to use the program for all problems, and use the >>> program to check them all for accuracy. But good luck doing that; it >>> won't >>> always be easy. Checking easy problems is good practice for the >>> harder >>> ones. >>> >>> Bobby >>> >>> On Fri, 30 Jan 2004 20:52:18 +0100, Peter Klamser >>> <Klamser at t-online.de> >>> wrote: >>> >>>> Hi, >>>> >>>> there is no errorfree software, a scientist should know this fact. >>>> >>>> Everyone should decide, which software he should use and prove if >>>> the >>>> result >>>> of the software is errorfree. >>>> >>>> I never trust a software, I only trust my knowledge. >>>> >>>> Integrate[1/x + x^c, {x, a, b}] >>>> >>>> returns with Mathematica 5.0.1 >>>> >>>> (-a + b)*If[(Im[a] - Im[b])*((-Im[b])*Re[a] + Im[a]*Re[b]) > 0 || >>>> Im[b]/(Im[a] - Im[b]) >= 0 || >>>> Im[a]/(-Im[a] + Im[b]) >= 0, (a^(1 + c) - b^(1 + c) + Log[a] + >>>> c*Log[a] - Log[b] - c*Log[b])/ >>>> ((a - b)*(1 + c)), Integrate[1/(a + (-a + b)*x) + (a + (-a + >>>> b)*x)^c, >>>> {x, 0, 1}, >>>> Assumptions -> !((Im[a] - Im[b])*((-Im[b])*Re[a] + >>>> Im[a]*Re[b]) > 0 >>>> || >>>> Im[b]/(Im[a] - Im[b]) >= 0 || Im[a]/(-Im[a] + Im[b]) >= 0)]] >>>> >>>> Version 4.2 returns >>>> >>>> -((a^(1 + c) - b^(1 + c) + Log[a] + c*Log[a] - Log[b] - >>>> c*Log[b])/(1 + c)) >>>> >>>> But in version 5.0 the wrong result appears. >>>> >>>> Therefore it was a bug in version 5.0 >>>> >>>> Regards >>>> >>>> Peter >>>> >>>> -----Ursprüngliche Nachricht----- >>>> Von: Bobby R. Treat [mailto:drbob at bigfoot.com] >>>> Gesendet: Freitag, 30. Januar 2004 10:17 >>>> An: mathgroup at smc.vnet.net >>>> Betreff: [mg45958] Re: Nasty bug in Integrate (version 5.0) >>>> >>>> >>>> The only reason we know the answer is wrong is BECAUSE it's trivial >>>> by >>>> hand. It makes no sense to trust Mathematica for problems that are >>>> too >>>> hard >>>> to >>>> check. >>>> >>>> Bobby >>>> >>>> Andrzej Kozlowski <akoz at mimuw.edu.pl> wrote in message >>>> news:<bvapk6$aat$1 at smc.vnet.net>... >>>>> Mathematica seems to get lost in the large number of checks that it >>>>> attempts to perform to find the exact conditions (in the complex >>>>> plane) for the convergence of this integral. Even if a and b are >>>>> assumed to be real there is a problem that 0 may lie in between >>>>> them. >>>>> Only in the case when you specify that the limits are both >>>>> positive or >>>>> both negative you get the correct answers because Mathematica can >>>>> quickly deal with this problem. >>>>> If you really want to see how much checking Mathematica attempts >>>>> to do >>>>> just evaluate: >>>>> >>>>> Trace[Integrate[1/x + x^c, {x, a, b}], TraceInternal->True] >>>>> >>>>> and be prepared to wait and obtain a huge output. >>>>> >>>>> Anyway, this is clearly a bug. However, it is in general a good >>>>> idea >>>>> not to ask a computer program to do what is trivial to do by hand, >>>>> which in this case means evaluating a definite rather than an >>>>> indefinite integral. Note that >>>>> >>>>> >>>>> Integrate[1/x + x^c, x] >>>>> >>>>> x^(c + 1)/(c + 1) + Log[x] >>>>> >>>>> and the answer is obtained instantly. If this is what you really >>>>> were >>>>> after (you can substitute in the limits for example by using: >>>>> >>>>> >>>>> Subtract @@ (Integrate[1/x + x^c, x] /. x -> #1 & ) /@ {b, a} >>>>> >>>>> >>>>> -(a^(c + 1)/(c + 1)) - Log[a] + Log[b] + b^(c + 1)/(c + 1) >>>>> >>>>> >>>>> Of course this now makes sense only under certain conditions on >>>>> a,b and >>>>> c which you now have to determine yourself. >>>>> >>>>> >>>>> On 28 Jan 2004, at 11:19, Math User wrote: >>>>> >>>>>> Hi, >>>>>> >>>>>> Sorry if this has been discussed before. Could anyone explain why >>>>>> Mathematica 5.0 is ignoring the term 1/x in the first and second >>>>>> answers? >>>>>> >>>>>> Thanks! >>>>>> >>>>>> >>>>>> In[1]:= Integrate[1/x + x^c, {x, a, b}] >>>>>> >>>>>> Out[1]= (-a^(1 + c) + b^(1 + c))/(1 + c) >>>>>> >>>>>> In[2]:= Integrate[1/x + x^c, {x, a, b}, Assumptions -> {Element[a, >>>>>> Reals], Element[b, Reals]}] >>>>>> >>>>>> Out[2]= (-a^(1 + c) + b^(1 + c))/(1 + c) >>>>>> >>>>>> In[3]:= Integrate[1/x + x^c, {x, a, b}, Assumptions -> {a > 0, b >>>>>> > 0}] >>>>>> >>>>>> Out[3]= (-a^(1 + c) + b^(1 + c))/(1 + c) + Log[b/a] >>>>>> >>>>>> >>>> >>>> >>>> >>> >>> >>> >>> >> > > > >