Re: Differentiating Functions and Root objects [ was Re: ArcCos[]]
- To: mathgroup at smc.vnet.net
- Subject: [mg24845] Re: [mg24833] Differentiating Functions and Root objects [ was Re: ArcCos[]]
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Wed, 16 Aug 2000 03:24:09 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Allan: 1. I am afraid that you allowed yourself to be tricked by FindRoot :) The root you found {t -> -818.986} is a pure illusion. The only roots are the ones given in my earlier message on the same topic: -1.01505 and 1.01505. You can see this simply by plotting the function: In[44]:= Plot[Evaluate[D[Root[-t + 2*#1 + 2*t^2*#1 + #1^3 &, 1],t]],{t,-10,10}] But actually Mathematica can prove it algebraicalluy and very fast too using Experimental`CylindricalAlgebraicDecomposition. In[5]:= f[t_]:=D[Root[-t + 2*#1 + 2*t^2*#1 + #1^3 &, 1],t] In[6]:= Experimental`CylindricalAlgebraicDecomposition[f[t]==0,t] Out[6]= 2 4 t == Root[-1 - 32 #1 + 32 #1 & , 1] || 2 4 t == Root[-1 - 32 #1 + 32 #1 & , 2] In[7]:= N[%] Out[7]= t == -1.01505 || t == 1.01505 2. In general, a Root object depending on parameters has a complicated branching structure with respect to these parameters and at certain points will not be continuous, and hence certainly not differentiable (as a complex function). Other than that (and barring bugs) differentiation of root objects wiht respect to parameters is valid. However note one pitfall. The case considered here is rather special: we are looking at a cubic f[t_]:= Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & with real coefficients, and Root[f[t],1]--its real root. The function can be viewed either as a real function or a complex function. In the first case case, the derivative D[f[t],t] exists at 0 and we get: In[8]:= D[f[t],t]/.t->0 Out[8]= 1 - 2 However both In[9]:= Limit[(f[t]-f[0])/t,t->0] and In[10]:= f[t]+O[t]^2 fail, since the complex derivative of f at 0 does not exist. -- Andrzej Kozlowski Toyama International University, JAPAN For Mathematica related links and resources try: <http://www.sstreams.com/Mathematica/> on 8/15/00 9:04 AM, Allan Hayes at hay at haystack.demon.co.uk wrote: > John's posting stirred me into taking another look a this problem. > Here are four observations > > 1. We can differentiating a pure function with respect to a parameter > > D[Function[x, Sin[y] x^2], y] > > Function[x, x^2*Cos[y]] > > > D[Sin[y] #^2 &, y] > > Cos[y]*#1^2 & > > 2. The original problem, differentiating Root objects > > a = Root[-t + 2*#1 + 2*t^2*#1 + #1^3 &, 1] > > Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1] > > (b = D[a, t]) // InputForm > > (1 - 4*t*Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1])/ > (2 + 2*t^2 + 3*Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1]^ > 2) > > Make this output explicit > > (rb = ToRadicals[b]) // InputForm > > (1 - 4*t*(-(2^(1/3)*(6 + 6*t^2))/ > (3*(27*t + Sqrt[729*t^2 + 4*(6 + 6*t^2)^3])^ > (1/3)) + (27*t + Sqrt[729*t^2 + 4*(6 + 6*t^2)^3])^ > (1/3)/(3*2^(1/3))))/(2 + 2*t^2 + > 3*(-(2^(1/3)*(6 + 6*t^2))/ > (3*(27*t + Sqrt[729*t^2 + 4*(6 + 6*t^2)^3])^ > (1/3)) + > (27*t + Sqrt[729*t^2 + 4*(6 + 6*t^2)^3])^(1/3)/ > (3*2^(1/3)))^2) > > Maybe Solve and NSolve will work on rb == 0, -- I gave up after a a brief > wait -- but we can quickly get > > FindRoot[rb == 0, {t, 0}] > > {t -> -818.986} > > Is b correct for the rate of change of a respect to t? > We can check > > rb - D[ToRadicals[a], t] // Simplify > > 0 > > We might expect with sol the corresponding polynomial would have a multiple > root. > > Check: > > (poly = -t + 2*#1 + 2*t^2*#1 + #1^3 &[x] /. sol[[1]]) // InputForm > > 818.985893312185 + 1.3414777868887153*^6*x + x^3 > > > Solve[% == 0, x] // InputForm > > {{x -> -0.0006105102159100438}, > {x -> 0.0003052551079550219 - 1158.2218211072502*I}, > {x -> 0.0003052551079550219 + 1158.2218211072502*I}} > > > 3. Can we still get the solution without using ToRadicals? > > sol2 = FindRoot[b == 0, {t, 0}] > > FindRoot::"jsing": "Encountered a singular Jacobian at the point \!\(t\) > = \!\ > \(0.`\). Try perturbing the initial point(s)." > > FindRoot::"jsing": "Encountered a singular Jacobian at the point \!\(t\) > = \!\ > \(0.`\). Try perturbing the initial point(s)." > > FindRoot[b == 0, {t, 0}] > > However > > sol2 = FindRoot[b == 0, {t, 0.1}] > > {t -> -1.0150511440294088} > > A different solution. > > And we get > > Solve[(-t + 2*#1 + 2*t^2*#1 + #1^3 &[x] /. sol2[[1]]) == 0, x] > > {{x -> -0.2462928577523092}, > {x -> 0.1231464288761546 - 2.0263644239932934*I}, > {x -> 0.1231464288761546 + 2.0263644239932934*I}} > > 4. Is Differentiation of Root objects always valid? Is this method a general > one for finding which parameter values give multiple roots? > > Allan > --------------------- > Allan Hayes > Mathematica Training and Consulting > Leicester UK > www.haystack.demon.co.uk > hay at haystack.demon.co.uk > Voice: +44 (0)116 271 4198 > Fax: +44 (0)870 164 0565 > > "John D. Hendrickson" <jdh at hend.net> wrote in message > news:8n7q9r$1j7 at smc.vnet.net... >> I've got Mathematica 4.0.2.0. Since I'm running Win95 I don't mind >> crashing - thats pretty much a constant, so I tried your dare:) But mine >> didn't crash - it gave me output. Also - I have a substitute that might > be >> what you want. >> >> In[1]:= >> a = Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1]; >> >> In[2]:= >> b = D[a, t]; >> >> In[4]:= >> InputForm[ Solve[b == 0, t] ] >> >> Solve::"tdep": "The equations appear to involve the variables to be solved > \ >> for in an essentially non-algebraic way." >> >> Out[4]//InputForm= >> Solve[(1 - 4*t*Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1])/ >> (2 + 2*t^2 + 3*Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1]^ >> 2) == 0, t] >> >> =================================================================== >> Would the following be acceptible in your circumstance? >> I assumed by making the unexplicit root object explicit: >> ==================================================================== >> >> In[3]:= >> Exit[] >> >> In[1]:= >> a = Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1]; >> >> In[2]:= >> ax = First[a][x] >> >> Out[2]= >> \!\(\(-t\) + 2\ x + 2\ t\^2\ x + x\^3\) >> >> In[3]:= >> b = D[ax, t]; >> >> In[4]:= >> InputForm[ Solve[b == 0, t] ] >> >> Out[4]//InputForm= >> {{t -> 1/(4*x)}} >> >> =================================================================== >> >> Allan Hayes wrote in message <8mtc0m$7qb at smc.vnet.net>... >>> >>> >>> >>> "Gianluca Gorni" <gorni at dimi.uniud.it> wrote in message >>> news:8mqvd7$18j at smc.vnet.net... >>> >>> >>> ----------- Snip ------------- >>>> An unrelated problem: the following instructions consistently crash >>>> my Mac Mathematica 4 kernel: >>>> >>>> a = Root[-t + 2*#1 + 2*t^2*#1 + #1^3 & , 1]; >>>> b = D[a, t]; >>>> Solve[b == 0, t] >>>> >>> -- >>> Gianluca , >>> It crashes Mathematica 4.02 on Windows also. >>> >>> Allan >>> --------------------- >>> Allan Hayes >>> Mathematica Training and Consulting >>> Leicester UK >>> www.haystack.demon.co.uk >>> hay at haystack.demon.co.uk >>> Voice: +44 (0)116 271 4198 >>> Fax: +44 (0)870 164 0565 >>> >>> >>> >>> >> >> >> > > > > > > > >