MathGroup Archive 2008

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

Search the Archive

Re: Mixed Numerical Derivatives

  • To: mathgroup at smc.vnet.net
  • Subject: [mg87164] Re: Mixed Numerical Derivatives
  • From: Szabolcs Horvát <szhorvat at gmail.com>
  • Date: Thu, 3 Apr 2008 05:13:08 -0500 (EST)
  • Organization: University of Bergen
  • References: <fsveco$sp7$1@smc.vnet.net> <fsvosj$5at$1@smc.vnet.net>

[note: message sent to comp.soft-sys.math.mathematica]

dh wrote:
> Hi,
> 
> I have version 6 and can not find ND.

It is in the NumericalCalculus package.

> 
> Nevertheless, you could try an iterative approach. E.g.:
> 
> ND[ ND[fun[x,y],{x,2},1] ,{y,2}, 1]

This will appear to work for simple functions, but I would not recommend 
it because the inner ND is evaluated /before/ the outer ND, and produces 
a "semi-symbolic" result, i.e. something containing both 'y' and 
floating point numbers.  This might not work at all for complicated 
functions that /must/ take numerical arguments, and even for simple 
functions ND cannot check for convergence, etc., so it is problematic.

A similar solution is to define one's own "double-derivative" function 
which avoids evaluation of the "inner" ND explicitly, e.g.

ND2[expr_, x_, y_, x0_, y0_] := Module[{fun, a},
   fun[a_?NumericQ] := ND[expr /. y -> a, x, x0];
   ND[fun[a], a, y0]
  ]

ND2[Sin[x y], x, y, 1, 1]

... but I am still not comfortable with this approach ...

> 
> hope this helps, Daniel
> 
> 
> 
> jwmerrill at gmail.com wrote:
> 
>> How can I come up with the Hessian of a function, at a particular
> 
>> point, which can only be evaluated numerically?  If I had a symbolic
> 
>> function, I could do something like
> 
> 
>> In[123]:=
> 
>> D[x^3 + z*y^-1 + z^(1/2), {{x, y, z}, 2}] /. {x -> 3, y -> 5,
> 
>>   z -> 12}
> 
> 
>> Out[123]= {{18, 0, 0}, {0, 24/
> 
>>   125, -1/25}, {0, -1/25, -1/(96 Sqrt[3])}}
> 
> 
>> The function I'm interested in, though, can only be calculated
> 
>> numerically.  Using ND, I can find the diagonal elements of the
> 
>> Hessian:
> 
> 
>> In[92]:= rules = Last[
> 
>>   FindMaximum[{Total[logPr[vdt, ddt, var, #] & /@ testData], ddt > 0,
> 
>>     var > 0}, {{vdt, .9}, {ddt, 120}, {var, 90}}]]
> 
> 
>> Out[92]= {vdt -> 0.95945, ddt -> 151.097, var -> 103.255}
> 
> 
>> In[111]:= Needs["NumericalCalculus`"]
> 
> 
>> In[124]:= ND[
> 
>>  Total[logPr[vdtp, ddt, var, #] & /@ testData] /. rules, {vdtp, 2},
> 
>>  Evaluate[vdt /. rules]]
> 
> 
>> Out[124]= -64.4011
> 
> 
>> But what about the off diagonal elements?



  • Prev by Date: Re: Write documentation for 6.0 under Solaris
  • Next by Date: Re: How to put text on a curved surface?
  • Previous by thread: Re: Mixed Numerical Derivatives
  • Next by thread: Re: Mixed Numerical Derivatives