MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: numerical derivatives at very high x-values: precision problem

  • To: mathgroup at smc.vnet.net
  • Subject: [mg64043] Re: [mg64021] numerical derivatives at very high x-values: precision problem
  • From: "Carl K. Woll" <carlw at wolfram.com>
  • Date: Sat, 28 Jan 2006 02:24:18 -0500 (EST)
  • References: <200601271838.k0RIcAaA014635@mx1.wolfram.com>
  • Sender: owner-wri-mathgroup at wolfram.com

Nadir Kaplan wrote:
[snip]
>>>The values are f.e. (from a set of recursion relations) :
>>>
>>>------------------------------------------------------------------------
>>
>>----
>>
>>>J[40]= 1.12970494019605678505771742460*10^12
>>>
>>>mu[40]= 3.38911605114868836337349826143*10^12
>>>
>>>V[40]= -8.47278910237611083984375000000*10^11
>>>
>>>T1[40]= 5.64852470100879638671875000000*10^11
>>>
>>>
>>>
>>>The function to be partial-differentiated:
>>>
>>>------------------------------------------------------------
>>>
>>>lngamma1[J_, mu_, V_, t1_]:=
>>>
>>>  Module[{mu2, U1, U2, Umax}, mu2=SetPrecision[mu/(2*d), 30];
>>>
>>>                  U1=SetPrecision[0, 30];
>>>
>>>                  U2=SetPrecision[1.5*mu2+func1[0.5*mu2, t1], 30];
>>>
>>>                  Umax= Max[U1, U2];
>>>
>>>
>>>SetPrecision[Umax+Log[Exp[U1-Umax]+2*Exp[U2-Umax]*func2[0.5*mu2, t1]],
>>
>>30]
>>                     ^^^^^^^^^^^^^^^^
>>                     ||||||||||||||||
>>
>>why not just U1-Umax?
> 
> lngamma1 is one of the five recursion relations, and I established a general
> style to easily control them. I am able to see the exponents immediately by
> writing so.
> 

Well, Umax + Log[Exp[U1-Umax] equals U1, so including this complication 
in your function is odd. It's also odd that your function has arguments 
V and J which don't appear in the function definition, and the function 
definition has the symbol d which is undefined (perhaps it is 40?).

>>>                ]
[snip]
>>
>>First, eliminate all of the SetPrecision statements, they aren't
>>helpful. Next, you don't tell us what func1 and func2 are. The rest of
>>your lngamma1 function can be symbolically differentiated by Mathematica
>>without problems, so unless func1 and func2 are undifferentiable
>>functions, there is no need to use numerical derivatives.
>>
>>If func1 or func2 is symbolically undifferentiable, then you should
>>consider using the ND standard package to do differentiation. It uses
>>Richardson extrapolation to find derivatives, which is much more
>>reliable than the derivative formula you give above.
>>
> 
> Sorry, I forgot to paste them:
> 
> func1[A_, t1_] := Sqrt[2*t1^2 + A^2];
> 
> func2[A_, t1_] := A/Sqrt[2*t1^2 + A^2]*0.5*(1 - 
>     Exp[-2*Sqrt[2*t1^2 + A^2]]) + 0.5*(1 + Exp[-2*Sqrt[2*t1^2 + A^2]]);
> 

These functions are differentiable, so there is no reason to worry about 
numerical derivatives.

> (SetPrecision statements eliminated as you suggested above.) 
> 

Perhaps the presence of the machine numbers 0.5 and 1.5 led you to mess 
with SetPrecision. Instead, just replace them with 1/2 and 3/2.

> The problem is, when symbollically differentiating the recursion relations
> without finding and factorizing the largest exponent Umax, it definitely
> leads to an overflow error ( I tried it in another system, not in Mathematica but
> the problem is already at the exponents, their components grow too much too
> early. This is why I should keep the log of the recursion relations, on the
> other hand, d/dx (log f(x))=(df/dx)/f -->overflow because of the large
> exponents  )
> 

Assuming d is 40, I get underflow errors because of things like

In[20]:=
Log[Exp[-10^12]+2]//N

During evaluation of In[20]:=
General::"unfl": ""Underflow occurred in computation."

Out[20]=
0.693147

I don't know how to avoid these errors, but they seem benign.

When I tried your example, Mathematica had no problems taking 
derivatives of lngamma1 and evaluating it at numerical values, other 
than issuing Underflow warnings.

Carl Woll
Wolfram Research

> 
>>Finally, instead of writing lngamma1 as
>>
>>lngamma1[J_, mu_, V_, t1_]:=...
>>
>>you should consider writing it as
>>
>>lngamma1[J_, mu_, V_][t1_]:=...
> 
> I'm new at Mathematica; what is the difference?
> 
> Nadir Kaplan
> 


  • Prev by Date: Re: Deleting Selective DownValues
  • Next by Date: Re: numerical derivatives at very high x-values: precision problem
  • Previous by thread: Re: numerical derivatives at very high x-values: precision problem
  • Next by thread: Re: numerical derivatives at very high x-values: precision problem